Error-based SQL Injection이란
SQL문을 작성 및 실행하여 발생한 에러 메시지에 원하는 데이터를 함께 출력하게 하여 데이터를 탈취하는 기법으로, 한번에 하나의 데이터만 출력할 수 있어 UNION SQL Injection보다는 번거로운 부분이 있지만 마찬가지로 데이터베이스에 직접 접근하여 중요 데이터를 탈취할 수 있다는 점에서 위험한 취약점 공격 중 하나이다.
Error-based SQL Injection은 서브쿼리에서 실행한 데이터를 1개씩 밖에 확인 할 수 없기 때문에 원하는 데이터를 찾아내기 위해서는 데이터가 몇 개인지, 원하는 데이터는 어떻게 정렬해서 뽑을지 알아야 한다.
예시
Step1. 데이터 개수 출력하기
해당 웹사이트는 모의해킹을 위해 만들어진 가상의 웹사이트이며, 따라서 출력된 데이터 또한 가상의 데이터이고 DB는 Oracle로 되어 있다. 해당 DB에서 로그인할 때 필요한 사용자 정보를 출력하고자 한다. 이를 위해서는 먼저 출력을 원하는 데이터의 개수를 알아야한다.
‘ AND CTXSYS.DRITHSX.SN(user,(SELECT COUNT(TABLE_NAME) FROM USER_TABLES))=1--
먼저 사용자 정보가 들어있는 테이블 정보를 추출하기 위해서 테이블명이 들어있는 USER_TABLES에서 TABLE_NAME의 개수를 출력한다. 위의 SQL문을 실행한 결과 에러 메시지 사이에 '12'라는 값이 추가된 것을 확인할 수 있다. 이를 통해 USER_TABLES의 TABLE_NAME 데이터 개수는 12개라는 것을 알 수 있다.
Step2. ROWNUM을 이용하여 테이블명 출력하기
USER_TABLES에 있는 컬럼인 ROWNUM을 이용하여 각 데이터의 행 번호를 알 수 있고, 이러한 컬럼을 이용하여 TABLE_NAME을 하나하나 출력하여 사용자 정보가 저장되어 있다고 추정되는 테이블을 찾는다.
‘ AND CTXSYS.DRITHSX.SN(user, (SELECT TABLE_NAME FROM
(SELECT TABLE_NAME, ROWNUM AS RNUM FROM USER_TABLES) WHERE RNUM=1))=1--
위 코드는 ROWNUM을 RNUM으로 지칭하고, USER_TABLES에서 RNUM=1인 TABLE_NAME을 출력하는 SQL문이다. 해당 SQL문을 통해 사용자 정보가 저장되어 있는 것으로 추정되는 'LHSMEMBER3'이라는 테이블이 있는 것을 확인하였다.
Step3. LHSMEMBER3의 컬럼명 출력하기
‘ AND CTXSYS.DRITHSX.SN(user, (SELECT COLUMN_NAME FROM
(SELECT COLUMN_NAME, ROWNUM AS RNUM FROM all_tab_columns WHERE table_name=’LHSMEMBER3’)
WHERE RNUM=13))=1--
Step2와 비슷한 방식으로 SQL문을 작성 및 실행한다. 이때, all_tab_columns 테이블에서 table_name이 'LHSMEMBER3'인 컬럼을 RNUM에 따라서 출력하도록 SQL문을 작성한다.
그 결과 해당 테이블에 ID, PW 컬럼이 있는 것을 확인할 수 있다.
Step4. ID & PW 출력하기
LHSMEMBER3에서 ID와 PW를 출력하여 데이터를 탈취한다. 이때 ROWNUM은 각 컬럼을 정렬(salt)한 뒤에 그에 맞는 번호를 부여하며, Error-based SQL Injection은 그 번호에 따라서 데이터를 출력한다. 따라서 ID와 PW를 따로 출력할 경우, 같은 ROWNUM으로 불러와도 서로 다르게 정렬되어 출력되기에 서로 다른 사용자의 ID와 PW가 출력될 수 있다. 이러한 경우를 방지하기 위해 CONCAT함수를 사용하여 ID와 PW를 한번에 불러와서 출력한다.
‘ AND CTXSYS.DRITHSX.SN(user,
(SELECT RESULT FROM (SELECT CONCAT(CONCAT(ID,’ / ‘), PW)
AS RESULT, ROWNUM AS RNUM FROM LHSMEMBER3) WHERE RNUM=13))=1--
'정보 보안 > 취약점 분석' 카테고리의 다른 글
CSRF (0) | 2024.08.25 |
---|---|
XSS (0) | 2024.08.25 |
Blind SQL Injection (0) | 2024.08.25 |
Union SQL Injection (0) | 2024.08.19 |
XSS (0) | 2024.06.27 |