XXE注入
基本概念
XML
XML 指可扩展标记语言(eXtensible Markup Language)。
方便大家理解,这里与HTML对比着给大家说一下:HTML和XML 为不同的目的而设计,HTML 被设计用来显示数据,其焦点是数据的外观。XML 被设计用来传输和存储数据,其焦点是数据的内容。HTML 旨在显示信息,而 XML 旨在传输信息。
DTD
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
DTD的声明:指XML文档中声明该文档的DTD或DTD来源的部分,可以包含在使用它的XML文档内部,也可以以独立的DTD文档(*.dtd)文档存在。
所以DTD一般认为有两种引用或声明方式:
1、内部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在XML文档中。
2、外部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在一个独立的DTD文件(.dtd)中。
(网上有提到的引用公共DTD其实也算外部引用DTD的一种)
XML基本文档结构
1 | <!--XML声明--> |
什么是xxe
XXE(XML External Entity Injection) XML外部实体注入,XML是一种类似于HTML(超文本标记语言)的可扩展标记语言,是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
漏洞场景
一般可见于登录、注册等页面,通过XML进行传输数据。
特征:
1 | Content-Type:text/xml |
漏洞案例
当发现可能存在的xxe注入点,我们先来构造一个正常的XML文档:
1 | <?xml version="1.0" encoding="UTF-8"?> |
回显正常,说明通过XML进行传输数据。
然后我们来构造一个引用特殊的payload,增加DTD:
1 | <?xml version="1.0" encoding="UTF-8"?> |
回显正常,并且读取到了文件,执行成功。
试着来访问下系统文件:
1 | <?xml version="1.0" encoding="UTF-8"?> |
执行成功。
漏洞利用
XXE漏洞能干什么?
1. 任意文件读取
如上述案例,为最基本的利用。
2. SSRF
SSRF(Server-Side Request Forgery:服务器端请求伪造),说白了就是借助漏洞实现内网探测,我在80端口的网站下临时放了我们刚刚的测试文件,简单修改下payload:
1 | <?xml version="1.0" encoding="UTF-8"?> |
3. DOS攻击
1 | <?xml version="1.0"?> |
此测试可以在内存中将小型 XML 文档扩展到超过 3GB 而使服务器崩溃。
亦或者,如果目标是UNIX系统,
1 | <?xml version="1.0" encoding="ISO-8859-1"?> |
如果 XML 解析器尝试使用 /dev/random 文件中的内容来替代实体,则此示例会使服务器(使用 UNIX 系统)崩溃。
4. 远程命令执行
这种情况很少见,并不是传统意义上的任意命令执行,只是因为环境的特殊配置,导致XML与某些命令操作关联,进而造成了命令执行。当PHP环境中的PHP expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上,就会造成我们说的这种情况。
漏洞修复
对 XML 解析器进行安全配置,使它不允许将外部实体包含在传入的 XML 文档中。不管是上面语言,抑或是使用了市面是哪种主流XML解析方案,最终的解决方案都可以如此借鉴:
为了避免 XXE injections,应为 XML 代理、解析器或读取器设置下面的属性:
1 | factory.setFeature("http://xml.org/sax/features/external-general-entities", false); |
如果不需要 inline DOCTYPE 声明,可使用以下属性将其完全禁用,这种方式显然更直接,我们搭建环境中一直在吐槽DTD被禁用,就是这个意思,DOCTYPE被禁,也就禁掉了DTD的根本:
1 | factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); |
XXE进阶
XXE漏洞存在需要满足两个条件
- 支持DTD
- 数据可操控
前者是我们xxe的必须条件,后者如果我们提交的数据并未通过返回包返回回来,我们也就看不到了,为此,将xxe漏洞又分为回显型和无回显型。
对于这种数据无回显的情况,我们引出OOB攻击的概念,即数据外带(Out of Band)。
利用的两种手段:
- 通过自己写一个页面用来接受目标服务器传回的内容,但是实际测试效果并不稳定。
- 开源工具:xxeserve
利用详情参考 https://mp.weixin.qq.com/s/mq2YO1Xg292n4InBTM0AsQ
参考链接
https://mp.weixin.qq.com/s/mPAFcLm94KgM6S8alB2sTQ