**内部实体声明**````DTD 例子:将writer 声明为”Bill Gates”,copyright 声明为 “Copyright W3School.com.cn”XML 例子:``&writer;©right; ``注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。]>&xxe;
**外部实体声明**外部实体引用支持通过协议,来动态的获取值````例子:DTD 例子:``````XML 例子:``&writer;©right; ``可以通过``file://``协议来读取文件内容```]>&xxe; ```
不同的语言支持不同的协议

参数实体:
or
参数实体只能在DTD中声明,在DTD中引用,它们使用百分比(%)而不是字符(&),并且可以命名为实体或外部实体。 ,可以解析实体或URI,执行XML解析,然后在其中获取变量:通常在Bline XXE中使用
``````**公共实体声明**
0x02漏洞原理XXE(XML,XML外部实体注入攻击者)可以获得应通过XML外部实体在服务器中保护的数据。 XXE漏洞的最关键部分是DTD文档类型,该类型用于定义XML文档的合法构建块。当允许引用外部实体时,恶意结构可以导致任何文件读数,执行系统命令,检测端口,攻击网站等。DTD可以在XML文档中声明或在外部引用; .9.1及以后,默认情况下将不再解析外部实体。
内部声明 DTD引用外部 DTD/或者
解析XML时,实体将被相应的参考内容替换,XML文档如下:
(1)包含内部实体的XML文档
]><c>©right;c
1。XML文档包含外部实体
]>©right;
0x03漏洞利用
1.xml解析器解析外部实体时支持多个协议
libxml2:file、http、ftpPHP:file、http、ftp、php、compress.zlib、compress.bzip2、data、glob、pharJava:file、http、ftp、https、jar、netdoc、mailto、gopher.NET:file、http、ftp、https
2。默认情况下,不同的解析器可能对外部实体具有不同的处理规则,有些解析器可能不会解析外部实体:
PHP:DOM、SimpleXML;.NET:System.Xml.XmlDocument、System.Xml.XmlReader。
通常有两种使用XXE的方法:
1。有xxe的回声
如果有回声,您可以直接在页面上看到执行结果或现象。
带XML外部实体(XXE),即攻击者可以发送带有XXE有效负载的请求,并从包含某些数据的Web应用程序中获取响应。
攻击者通过正常的回声或错误读取外部实体的内容。文件协议读取文件:
]>
2。
该服务器不会回声,因此它只能使用盲xxe来构建带外数据通道来提取数据。 Blind XXE主要使用DTD约束中的参数实体和内部定义的实体。参数实体:只能在DTD中定义和使用的实体。通常,引用时%用作前缀;内部定义实体:在实体中定义的实体,即嵌套的定义:
"%a;]>&b;
Blind XXE使用嵌套形式建立带外数据通道。使用参数实体阅读本地内容后,它将请求启动到其指定服务器作为外部实体中URL中的参数,然后在其指定服务器的日志(log)中读取文件的内容(攻击者的服务器); DTD中由%定义的参数实体只能在外部子集中使用,或者参数实体由外部文件定义,并引用XML文件的DTD;一些口译器不允许内层实体中的外部连接,无论内部层是通用实体还是参数实体,因此嵌套实体声明需要将其放置在外部文件中。
在xxe的情况下:
如何播放 - 读取文件
]>&xxe; &xxe; //xxe为变量,读取test.txt//打印出来
使用文件协议用指定路径读取文件
显示结果
游戏玩法 - 探针或攻击应用程序(触发漏洞地址)探针
]>&rabbit;
引入外部实体DTD,DTD是XML的后缀,被识别为XML格式
如果设置了外部实体参考,它将无效
%file;]>&send;
您可以在远程服务器Evil2.dtd上写入它:
没有回声 - 读取文件
%dtd;%send;]>
无论如何是加密,变速箱被乱七八糟,传输失败。
在本地构建192.168.xxx.xxx:
test.dtd:
"">%payload;
打开日志,您可以通过查看日志查看test.txt数据。
协议 - 读取文件(绕过)
]>&f;
如何检测:
数据格式类型:如果发现有test Mikasa 类型抓包发现 content-type中是 text/xml 或者 application/xml盲猜:更改content-type值application/xml看返回
右键单击以抓住包裹
进行扫描:扫描漏洞
发送到:爬网
使用,查找XML,复制XML代码以发布并使用
0x04旁路姿势
文字$;请参考指向先前注册的实体的链接。链接中指定的文件内容将其替换为文档主体中的内容。以上文档分为三个重要部分:
1.可选标头,用于定义基本文档特征,例如版本和编码。2.XML文档模式的可选声明——。此声明可用于设置外部链接。3.文档正文。它有一个层次结构,其根部是指定的标签
正确配置的XML解释器要么不接受包含用于处理的XML链接的文档,要么将验证链接及其来源,如果丢失了验证,则可以通过链接加载任意文件并将其集成到文档的正义中,如上所述。
我们将根据WAF如何处理XML验证研究两种类型的WAF:
成熟的waf——使用自己的解析器预处理XML文档的WAFs。基于正则表达式。仅搜索数据中的特定子字符串或正则表达式的WAFS。
两种类型的WAF都可以绕过。
在下面,我们显示了攻击者可以用来欺骗WAF并获得XXE的几种方法。
方法1:文档中的额外空间
由于XXE通常位于XML文档的开头,因此更容易的WAF可以避免处理整个文档并仅在开始时对其进行解析。但是,XML格式允许在格式化标签属性时使用任何数量的空间,因此攻击者可以在此类WAF中插入其他空间。
方法2:格式无效
要绕过WAF,攻击者可以发送特殊格式XML文档,以使WAF认为它们无效。
链接到未知实体
更成熟的WAF设置通常不会读取链接文件的内容。这种策略通常是有道理的,否则,WAF本身也可能是攻击的目标。问题在于,与外部资源的链接不仅可以存在于文档的第三部分(正义)中,而且还可以存在于声明中。
这意味着未读取文件内容的WAF不会读取文档中实体的声明。指向未知实体的链接反过来将阻止XML解析器造成错误。
幸运的是,防止这种旁路非常简单 - 在遇到一个未知实体后,命令WAF中的XML解析器不关闭。
方法3:外国编码()
除了上述XML文档的三个部分外,它们上方还有第四部分,该部分控制文档的编码(例如) - 该文档的第一个字节具有可选的BOM(字节订单标记)。
更多信息:#sec-
XML文档不仅可以使用UTF-8,还可以使用UTF-16(两个变体 - BE和LE),UTF-32(四个变体 - BE,LE,2143,3412)和编码来编码。
借助此编码,使用正则表达式可以很容易地绕过WAF,因为在这种类型的WAF中,正则表达式通常仅配置为单个字符集。
外国编码也可以用于绕过成熟的WAF,因为它们并不总是能够处理上面列出的所有编码。例如,解析器仅支持一种类型的UTF-32-UTF-32BE,尤其是不是BOM。
方法4:在一个文档中使用两种编码
在上一节中,我们证明了文档的编码通常由其第一个字节指定。但是,当包含编码属性的标签引用文档开头的不同字符集时会发生什么?在这种情况下,一些解析器会更改编码,以便该文件在开始时具有一组字符,其余的是另一组编码。 。也就是说,不同的解析器可以在不同时间转换编码。 Java (Javax.xml。)严格更改结尾之后的字符,而解析器可以在执行“编码”属性的值后或处理之前或处理后切换编码。
只有在根本没有处理这些文件时,更成熟的WAF才能可靠地防止这些文件中的攻击。我们还必须记住,有许多同义词编码,例如UTF-32BE和UCS-4BE。此外,某些编码可能有所不同,但是从编码文档的初始部分的角度来看,它们是兼容的。例如,似乎是UTF-8的文档可能包含字符串。
这是一些例子。为简单起见,我们不会将XXE放入文档中。
解析器将文档视为有效,但是,Javax.xml.Set中的Java引擎认为这是无效的:

反之亦然,该文档对于Javax.xml。有效,但对解析器无效:

该文档,将编码从UTF-16LE更改为标签中间的UTF-16BE:

该文档的编码从UTF -8更改为-us:

如您所见,有很多方法可以绕过它。防止XXE的最佳方法是配置应用程序本身,以安全的方式初始化XML解析器。为此,应禁用两个选项:
外部实体外部DTD架构
0x05知识星球
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。


客服1