[웹 익스플로잇] Response-Based SQL injection : 강제 에러 발생으로 True, False 구분

2022. 1. 14. 13:56Web Exploitation/SQL Injection

기본적으로 Blind-Based SQL Injection 공격을 진행하려면 참, 거짓을 구별할 수 있는 컨텐츠가 있어야하는데 이것이 없을때 Response-Based SQL injection을 시도할 수 있다. Response-Based SQL injection은 참 혹은 거짓일때 에러를 발생시키는 SQL 문을 삽입하여 에러 발생 여부를 통해 참, 거짓을 판별할 수 있다. 이때 Response-Based SQL injection에서 사용되는 SQL 문은 반드시 '실행' 단계에서 에러가 발생해야한다. 기본적으로 구문 자체에 오류가 있을 경우 참, 거짓과 관계없이 무조건 에러가 나오기 때문이다.

 

해당 조건을 충족하는 구문은 다음과 같다.

- Character Type -
ORACLE : CASE WHEN [조건] THEN 'a' ELSE CAST(1/0 as char) END FROM dual
MSSQL  : CASE WHEN [조건] THEN 'a' ELSE CONVERT(char, 1/0) END

- Intager Type -
CASE WHEN [조건] THEN 1 ELSE 1/0 END

MySQL은 1/0의 연산 결과에 대해 에러가 아닌 NULL을 반환하기 때문에 다중 레코드 비교 방식을 이용해야 한다.

 

MySQL : CASE WHEN [조건] THEN 1 ELSE (SELECT 1 UNION SELECT 2) END

다음과 같은 방식으로 MySQL에서도 Response-Based SQL injection이 가능하다. 이때 UNION을 통해 다중 레코드를 만들때 1,2를 1,1과 같은 방식으로 똑같이 만들어주면 UNION 명령어가 이를 합쳐버리므로 다른 데이터를 SELECT 해야한다. 다중 레코드를 이용한 Response-Based SQL injection은 다른 SQL에서도 이용가능하니 1/0 공격이 통하지 않을때 시도해 볼 수 있다. Response-Based SQL injection 공격은 환경에 따라서 결과 값이 달라지는 경우가 굉장히 많으므로 일단 에러 응답이 확인이 되었다면 여러 Response-Based SQL injection 공격 구문을 이용해서 테스트 해보아야한다.

 

Response-Based SQL injection 공격은 에러 발생 유무로 참, 거짓을 판단하기 때문에 사용자가 식별 가능한 컨텐츠가 없어도 되고 어떻게든 SQL 문을 삽입하기만 하면 최종 결과 값이 어찌되든 참, 거짓 판단이 가능하다는 장점이 있지만 환경에 따라 변수가 매우 큰데다 Application 측에서 에러 반응을 잘 처리해버리면 공격 자체가 불가능함으로 상황에 따라 Response-Based SQL injection 공격을 시도할지 말지를 잘 선택해야 한다.