XML External Entity
다음과 같이 URL을 입력하면 RSS데이터가 잘 생성 되었는지 검증해준다.
administarator의 password를 얻으면 되는 문제이다.
문제풀이
Input box에 URL을 넣으면 XML을 읽어주는 기능을 하므로 우리가 원하는 XML파일을 서버에 업로드하여 password를 탈취 할 수 있다.
기본적인 XML RSS형식을 이용하여 Validity Check를 해보자.
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>제목</title>
<link>주소/</link>
<description>설명 (짤막하게)</description>
<item>
<title>제목</title>
<link>주소/글 주소</link>
<description>글 내용 전체(또는 일부)</description>
<pubDate>시간</pubDate>
<guid>주소/글 주소</guid>
</item>
</channel>
</rss>
다음과 같은 코드를 입력하고 전송하였을 때
다음과 같이 정상적으로 결과가 나오게 된다.
이제 우리가 원하는 데이터를 얻기 위해서 XML External Entity를 이용해야한다.
우리가 알고있는 것은 우선 보여지고 있는 페이지가 index.php라는 점을 이용하여 우선 index.php파일을 살펴보자
<!ENTITY xxe SYSTEM "./index.php" >]>
다음과 같이 external entity를 작성하여서 결과 값을 봤을 때에 원하는 결과 값을 얻을 수 없었다.
php filter를 안쓰고 그냥 보내면 출력한 페이지에서 php를 해석하여 보여주기 때문에 소스 자체를 볼 수가 없다. (생각
그래서 php wrapper를 이용하여 답을 구하였다.
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php" >]>
나온 결과값을 base64 decode하면 flag 값을 얻을 수 있다.
XXE에 대해 문제풀기만을 위해 얕게 공부한 것 같아서 더 알앙봐야겠다.
'Web hacking > Root me' 카테고리의 다른 글
[Root-me] - Command injection - Filter bypass (0) | 2019.12.07 |
---|---|
[Root-me] - PHP - Eval (0) | 2019.12.03 |
[Root-me] - File upload - ZIP (0) | 2019.12.03 |
[Root-me] - Local File Inclusion - Wrappers (0) | 2019.11.30 |
[Root-me] PHP - Serialization (0) | 2019.11.16 |