XXE漏洞
XXE
https://www.freebuf.com/column/181064.html
https://www.cnblogs.com/backlion/p/9302528.html
关于实体的解释(IBM中国):https://www.ibm.com/developerworks/cn/xml/x-entities/#N100F2
一、XXE漏洞的定义
XXE漏洞全称XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。
二、什么是XML
XML是一种可扩展的标记语言,主要用于传输数据。XML文档结构包括XML声明、 {DTD文档类型定义(可选)}、文档元素。
三、什么是DTD
DTD(Document Type Declaration文档类型定义)定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD有两种声明方式:
1、内部 dtd:即对 XML 文档中的元素、属性和实体的 DTD 的声明都在 XML 文档中。
2、外部 dtd:即对 XML 文档中的元素、属性和实体的 DTD 的声明都在一个独立的DTD 文件(.dtd)中。
格式:
(1)内部声明
<!DOCTYPE 根元素 [元素声明]>
(2)外部声明
<!DOCTYPE 根元素 SYSTEM "文件名">
重要的关键字:
四、使用内部和外部DTD的XML实例
1、内部DTD的XML
2、外部DTD的XML
五、XXE漏洞详解
XXE漏洞即XML外部实体注入,分别理解一下注入和外部实体的含义。
注入:是指XML数据在传输过程中被修改,导致服务器执行了修改后的恶意代码,从而达到
攻击目的。
外部实体:则是指攻击者通过利用外部实体声明部分来对XML数据进行修改、插入恶意代码。
因此XXE漏洞就是指XML数据在传输过程中利用外部实体声明部分的”SYSTEM”或者”PUBLIC”关键词导致XML解析器可以从本地文件或者远程URI中读取数据
六、三种典型攻击手法
1、通过DTD外部实体声明
1 |
|
2、通过DTD文档引入外部DTD文档,再引入外部实体声明
1 |
|
3、通过DTD外部参数实体声明引入外部实体文档,在引入外部实体声明
1 |
|
七、不同语言支持的XML注入协议
八、常见注入结果
1、正常回显XXE
正常回显XXE是最传统的XXE攻击,在利用过程中服务器会直接回显信息,可直接完成XXE攻击。
2、报错XXE
报错XXE是回显XXE攻击的一种特例,它与正常回显XXE的不同在于它在利用过程中服务器回显的是错误信息,可根据错误信息去分辨可利用的信息。
3、Blind XXE
当服务器没有回显,使用Blind XXE。Blind XXE主要使用了参数实体进行嵌套定义。
1 | <?xml version="1.0"?> |
九、XXE的利用
1、任意文件读取
2、XXE-RCE
XXE也能RCE 。但是,需要在特定场景下。当PHP安装了expect (PHP是不默认安装扩展),一旦安装了这个 expect 扩展我们就能直接利用 XXE 进行 RCE 。
示例代码:
1 |
|
3、端口探测
XXE由于可以访问URL,也就有类似SSRF的攻击效果,同样的,也可以利用XXE来进行内网端口探测。
4、JSON XXE
正如我们所知道的,很多web和移动应用都基于客户端-服务器交互模式的web通信服务。一般对于web服务来说,最常见的数据格式都是XML和JSON。尽管web服务可能在编程时只使用其中一种格式,但服务器却可以接受开发人员并没有预料到的其他数据格式,这就有可能会导致JSON节点受到XXE(XML外部实体)攻击。