Error based SQL Injection은 임의로 DBMS 에러를 발생시켜 데이터베이스 및 운영체제의 정보를 획득하는 공격 기법이다.
핵심 전제 조건
Error based SQLi 공격은 애플리케이션에서 발생하는 에러를 이용해 공격해야 한다. JSON parse 에러 같은 것이 아니라 SQL 쿼리가 실행되고 나서 발생하는 에러가 필요하다.
공격 원리
DBMS 에러 메시지에는 쿼리 결과나 내부 정보가 포함되는 경우가 있다. 공격자는 의도적으로 에러를 유발하는 페이로드를 삽입해 에러 메시지에 원하는 데이터가 반영되도록 한다.
MySQL ExtractValue / UpdateXML
-- extractvalue를 이용한 에러 기반 데이터 추출
' AND extractvalue(1, concat(0x7e, (select database()))) --
-- updatexml을 이용한 에러 기반 데이터 추출
' AND updatexml(1, concat(0x7e, (select database()), 0x7e), 1) --MSSQL
' AND 1=convert(int, (select top 1 table_name from information_schema.tables)) --Oracle
' AND 1=ctxsys.drithsx.sn(1, (select banner from v$version where rownum=1)) --에러 출력 유/무 파악
| 조건 | 확인 방법 |
|---|---|
| 에러 있음 | DBMS 종류 파악, 소스코드/경로 노출 가능 |
| 에러 없음 | Blind SQLi 또는 Time-based 공격으로 전환 |
에러가 출력되더라도 웹 서버가 에러 메시지를 필터링하는 경우, Blind 기법을 사용해야 한다.