Error-Based SQL Injection: 원리 및 방어 전략
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
보안
대상자
- 웹 개발자, 보안 전문가, 시스템 설계자
- 중급 이상의 SQL 및 보안 지식을 가진 개발자 대상
핵심 요약
- Error-Based SQL Injection은 데이터베이스 오류를 유도하여 민감 정보 추출 또는 블라인드 조건 판단을 가능하게 하는 공격 기법입니다.
CASE WHEN ... THEN 1/0
구문은 조건이 참일 때 오류를 강제로 발생시켜 HTTP 응답 차이로 조건 판단합니다.SUBSTRING(Password, 1, 1)
와 같은 함수를 활용해 패스워드 한 글자씩 추출 가능하며, MySQL의extractvalue()
및 PostgreSQL의generate_series()
등 DB별 기술 사용.
섹션별 세부 요약
1. 조건부 오류 (Conditional Errors)
CASE WHEN (1=2) THEN 1/0
구문은 조건이 거짓일 때 오류를 발생시키지 않아 블라인드 SQLi 시 조건 판단 가능.1/0
은 0으로 나누기 오류를 유발하며,ELSE 'a'
은 안전한 값으로 처리.- HTTP 응답 차이 분석을 통해 조건의 참/거짓을 추론.
2. 오류를 통한 데이터 추출
array_to_string()
또는extractvalue()
함수를 사용해 오류 메시지 내 데이터 누출 가능.- 예시:
SELECT array_to_string(ARRAY(SELECT table_name FROM information_schema.tables), ', ')
은 테이블 이름을 오류 메시지에 노출. - MySQL의
extractvalue(rand(), concat(0x3a, (SELECT database()), 0x3a))
는 데이터베이스 이름을 오류로 반환.
3. DB별 기술적 차이
- MySQL:
extractvalue()
및updatexml()
함수 사용. - PostgreSQL:
generate_series()
및array_to_string()
활용. - SQL Server:
xp_cmdshell
등 시스템 함수 사용 가능.
4. 방어 전략
- 사용자에게 세부 오류 메시지 노출 금지 및 파라미터화 쿼리 사용 필수.
- WAF(Web Application Firewall) 설정으로 SQLi 패턴 감지.
- 로그 기록 시 클라이언트에게 오류 노출 금지 및 보안 모니터링 강화.
결론
- Error-Based SQL Injection은 오류 유도를 통해 민감 정보를 추출하는 고급 공격 기법으로,
CASE
및SUBSTRING
구문을 통해 조건 판단 및 데이터 추출 가능. - 방어를 위해 반드시 파라미터화 쿼리 사용, WAF 도입, 오류 메시지 마스킹이 필수적입니다.