[WEB] XXE(XML External Entity) 취약점

두비니

·

2021. 8. 6. 04:43

 

 

 


XXE

XML External Entity


 

 

 

0. 배경지식

  

 

  XXE취약점은 이름에서도 알 수 있듯이 XML에서 발생하는 취약점입니다. 따라서 XXE에 대해 논하기 전에 XML에 대해서 조금 알아봅시다. XML은 Extensible Markup Language의 줄임말로, 확장된 Markup Language정도로 해석이 가능할 것 같습니다. 사실 직역이라 의미가 있는지는 모르겠지만ㅎㅎ 더 파고들어 봅시다. 우선 Markup Language는 HTML로 설명이 가능하죠. 가장 대표적인 예시가 HTML이기 때문에, HTML과 XML을 비교하여 설명하도록 하겠습니다.

  HTML에서는 우리가 다양한 태그를 사용할 수 있습니다. head, body, div, a 등등 많은 태그가 존재하긴 하지만, 이미 정해진 태그만 사용 가능하다는 한계점이 있습니다. 그러나 XML의 경우에는 태그를 직접 만들 수 있습니다. 

  가령 다음과 같은 XML 파일이 있다고 가정합시다.

<?xml version="1.0" encoding="UTF-8"?>
<note>
	<date>
    	<day>09</day>
        <month>08</month>
        <year>2021</year>
    </date>
    <title>XML에 대하여</title>
    <text>XML은 XML이다.</text>
</note>

물론 HTML로 구현하고자 하면 div로 할 수야 있겠지만, XML을 이용하면 정보를 태그로 마크하여 필요한 내용을 안에 작성할 수 있다는 것입니다.

 

  이런 기본적인 지식을 가지고 XXE를 이해해봅시다.

 

1. XXE에 대하여

 

 

  XXE취약점은 XML External Entity의 줄임말로, XML 타입의 데이터 요청을 전송할 때 XML의 외부 엔티티를 처리할 수 있게 설정이 되어있는 경우에 발생하는 취약점입니다. 우선 XML자체가 사용자가 임의적으로 무언가를 정해서, 보낼 수 있다는 기능이 있기 때문에, XML을 악의적으로 이용할 경우 충분히 의도치 않은 실행을 시킬 수 있겠죠? 실제로 해당 공격을 통해서 주요 시스템 파일에 접근(LFI)하거나 외부 악의적인 파일을 참조(RFI)시킬 수 있습니다.

  자세한 설명은 아래 코드를 통해 설명하도록 하겠습니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE replace [<!ENTITY xxe "Doe">]>
<userInfo>
  <email>John.Smith@gmail.com</email>
  <firstName>John</firstName>
  <lastName>&xxe;</lastName>
 </userInfo>

다음 코드는 XML을 사용하는 정상적인 예시입니다. 

 

 

2. 실습

실습은 멘토님 실습 서버로 진행하였습니다. 다음에 시간이 된다면 직접 구축해서 해보는걸로ㅎㅅㅎ....

 

 

  간단하게 XML 코드를 삽입하면, 그에 대한 결과를 보여주는 코드입니다. 다음 캡쳐에서도 이미 볼 수 있듯이 XXE가 발생하는 것을 확인할 수 있습니다. 지금은 단순히 문자열을 삽입했지만, 다음과 같이 system 관련된 명령어를 넣는다면 그대로 실행되는 것을 볼 수 있습니다.

 

 

  한 가지 덧붙일 점은 바로 실행시킬 경우 원하는 커맨드가 바로 실행되지 않기 때문에, php wrapper를 통해서 base64 encoding된 값을 출력시켰습니다. encoding되어있긴 한데 혹시몰라 가려서 올립니다. 아무튼 나아가 온갖 명령어들과 기타 등등을 다 실행시킬 수 있습니다.

 

 

  결론적으로 LFI, RFI, Injection 등등 온갖 취약점이 거의 다 터집니다. 기본적으로 필터링 및 보호기법이 없다는 가정 하에 그냥 쉘처럼 작동한다고 생각하면 될 것 같습니다. 그래서 온갖 wrapper와 접근 등등이 기본적으로는 다 실행이 됩니다.

 

3. 보호기법

 

 

  가장 기본적인 대응 방법은 외부 엔티티 참조 기능이 필요하지 않다면, 애초에 관련 설정을 비활성화 해놓는 것입니다. XML의 DTDs나 관련 설정을 비활성화하는 방법이 있겠네요. 만약 외부 엔티티 참조 기능이 필요하다면, 필터링을 삽입하거나 원래 의도된 요청인지 확인을 하는 XML인지 확인을 하는 루틴을 삽입할 필요가 있을 것 같습니다.

 

 

4. 결론

 

 

  XXE attack에 대해서 알아보았습니다. 많은 취약점들이 비슷한 흐름이지만 환경에 따라서 달라지는 정도이지 않나하는 기분이 드네요. 추후에 관련 문제도 풀어서 write-up을 올리도록 하겠습니다. 끝!

 

 

 

 

 

참고

https://www.w3.org/TR/xml/

https://bibimnews.com/entry/XML-%EC%99%B8%EB%B6%80-%EA%B0%9C%EC%B2%B4XML-External-Entity-XXE-%EC%B7%A8%EC%95%BD%EC%A0%90-OWASP-Top-10-2017-A4

 

 

 

 

 

 

'WEB' 카테고리의 다른 글

SSTI Bypass  (0) 2021.11.07
[WEB] SSRF(Server Side Request Forgery)에 대해서  (0) 2021.08.09
[WEB] SSTI(Server Side Template Injection) 취약점  (2) 2021.08.05
[Cloud] AWS IAM에 대하여  (3) 2021.08.02
[SQLite fts3] fts3_tokenizer 취약점  (5) 2021.07.27