小工具知识网

当前位置: 首页 > 行业知识 > Web漏洞-XXE漏洞(详细)

行业知识

Web漏洞-XXE漏洞(详细)

2026-11-07 12:17:52 来源:互联网转载

XXE漏洞

XXE全���为XML External Entity Injection即XMl外部实体注入漏洞

原理:

XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载, 导致用户可以控制外部的加载文件,造成XXE漏洞。

XXE漏洞触发点往往是可以上传xml文件的位置,没有对xml文件进行过滤,导致可加载恶意外部文件和代码,造成任意文件读取,命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害

基础知识:

XML用于标记电子文件使其具有结构性的标记语言,可以标记数据,定义数据类型,允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明,DTD文档类型定义、文档元素。

DTD的作用是定义XML文档的合法构造模块,可以在内部声明,也可以外部引用

xml文档的构建模块

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

  • 元素

    • 属性

      • 实体

        • PCDATA

          • CDATA

            元素约束

            格式:

            • ELEMENT 表示关键字

              • NAME 表示元素名称

                • content-type 表示元素类型,有三种写法:

                  • EMPTY 表示该元素不能包含子元素和文本,但可以有属性

                    • ANY 表示该元素可以包含任何在该DTD中定义的元素内容

                      • #PCDATA 表示可以包含任何字符数据,但是不能在其中包含任何子元素,被解析的字符数据,PCDATA是会被解析器解析的文本

                        属性约束

                        格式:

                        属性类型:

                        • CDATA 是字符串类型,不会被解析器解析的文本,在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开

                          • ID 在整个文档中是唯一的,命名规则和xml元素一样,不能以数字开头

                            • IDREF reference属性的值必须来源于ID的值

                              • IDREFS 值必须来源于ID的值,取值可以是多个,以空格分开书写

                                • Enumerated 枚举类型(男|女)

                                  • ENTITY 实体

                                    属性特点:

                                    • #REQUIRED 必须设置

                                      • #IMPLIED 可选

                                        • #FIXED value 固定值,属性可以不设定(该属性会自动设置上),如果设置,值必须为value

                                          • default value 默认值,可以自定义,如果不定义该属性,则属性会自动设置,值为默认值

                                            语法规则:

                                            xml 必须包含根元素,它是所有其他元素的父元素,比如以下实例中 root 就是根元素:

                                             //文档开头必须      .....  
                                            • 在 XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签

                                              • XML 标签对大小写敏感。标签 与标签 是不同的。必须使用相同的大小写来编写打开标签和关闭标签

                                                • 在 XML 中,所有元素都必须彼此正确地嵌套

                                                  • XML的注释同html

                                                    • XML中空格会被保留,而HTML会把多个字符裁剪为一个

                                                      • XML的标签可以自定义,就是说可以随便改

                                                        • XML 的属性值必须加引号

                                                          XML实体

                                                          在 XML 中,一些字符拥有特殊的意义。

                                                          如果您把字符 “

                                                          外部DTD

                                                          通用实体和参数实体:

                                                          1、通用实体

                                                          ]> // 定义通用实体&xxe; #定义一个外部实体

                                                          通过第 4 行的定义, 第 7 行的 &xxe 就会对 c:/test.dtd 文件资源进行 SYSTEM 关键字的引用,这样对引用资源所做的任何更改都会在文档中自动更新。

                                                          另外除了上面 SYSTEM 关键字的引用方式,还有一种引用方式是使用 PUBLIC 引用公用 DTD 的方式,语法如

                                                            

                                                          2、参数实体

                                                          %an-element; %remote-dtd;

                                                          在上面的代码示例中,可以看到实体名前多了一个 “%” ,在参数实体中使用 “% 实体名” (这里面的空格不能少) 定义,并且只能在 DTD 中使用 “% 实体名” 引用。

                                                          判读是否存在XXE漏洞:

                                                          最直接的方法就是用burp抓包,然后,修改HTTP请求方法,修改Content-Type头部字段等等,查看返回包的响应,看看应用程序是否解析了发送的内容,一旦解析了,那么有可能XXE攻击漏洞

                                                          XML漏洞利用

                                                          file_get_contents函数读取了php://input传入的数据,但是传入的数据没有经过任何过滤,直接在loadXML函数中进行了调用并通过了echo函数输入$username的结果,这样就导致了XXE漏洞的产生。

                                                            

                                                          1、文件读取

                                                          通过加载外部实体,利用file://、php://等伪协议读取本地文件

                                                          payload  &xxe  test

                                                          2、内网探测

                                                          利用xxe漏洞进行内网探测,如果端口开启,请求返回的时间会很快,如果端口关闭请求返回的时间会很慢

                                                          探测22号端口是否开启

                                                              &xxe    test

                                                          3、命令执行

                                                          利用xxe漏洞可以调用except://伪协议调用系统命令

                                                              &xxe    test

                                                          4、DDOS攻击

                                                             ]>&lol9;

                                                          这个的原理就是递归引用,lol 实体具体还有 "lol" 字符串,然后一个 lol2 实体引用了 10 次 lol 实体,一个 lol3 实体引用了 10 次 lol2 实体,此时一个 lol3 实体就含有 10^2 个 "lol" 了,以此类推,lol9 实体含有 10^8 个 "lol" 字符串,最后再引用lol9。构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,解析非常慢,造成了拒绝服务器攻击。

                                                          XXE利用两大常见:有回显和无回显。有回显的情况可以直接在页面中看到payload的执行结果或现象,无回显的情况又称为blind xxe,可以使用外带数据通道提取数据

                                                          有回显:

                                                          • 直接外部实体声明

                                                                            &test;
                                                            • 引入外部dtd文档

                                                              通过外部dtd文档引入外部实体声明

                                                                              &b;evil.dtd内容:
                                                              • 通过外部实体引入dtd文档

                                                                通过外部实体声明引入外部实体声明

                                                                                &b;evil.dtd内容:

                                                                无回显:

                                                                利用参数实体:

                                                                test.dtd:

                                                                调用过程:

                                                                连续调用了三个参数实体 %remote;%int;%send;,这就是我们的利用顺序,%remote 先调用,调用后请求远程服务器上的 test.dtd ,有点类似于将 test.dtd 包含进来,然后 %int 调用 test.dtd 中的 %file, %file 就会去获取服务器上面的敏感文件,然后将 %file 的结果填入到 %send 以后(因为实体的值中不能有 %, 所以将其转成html实体编码 %),我们再调用 %send; 把我们的读取到的数据发送到我们的远程 vps 上,这样就实现了外带数据的效果,完美的解决了 XXE 无回显的问题。

                                                                防御方法:
                                                                1. 禁用外部实体

                                                                php:libxml_disable_entity_loader(true);java:DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);python:from lxml import etreexmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
                                                                1. 过滤和验证用户提交的XML数据

                                                                1. 不允许XML中含有任何自己声明的DTD ,过滤关键字:

上一篇:微信聊天机器人源码大揭秘,轻松打造智能对话助手!

下一篇:用dw怎么建网页?