XML注入(XXE)

扫码查看

XML所有元素都必须要有一个结束标志
大小写敏感
所有元素嵌套必须正确
所有的XML文档都必须要有一个根标志

XML包括XML声明,DTD文档类型定义(可选),文档元素
DTD即文档类型定义,用来为XML文档定义语义约束
DTD可以嵌入在XML文档中(内部声明),也可独立放在一个文件中(外部声明),由于其支持的类型有限,无法对元素或属性的内容进行详细规范,在可读性和可扩展性方面也比不上XML Schema

引用方式

    DTD内部声明
    <!DOCTYPE 根元素 [元素声明]>
    DTD外部引用
    <!DOCTYPE 根元素名称 SYSTEM "外部DTD的URI">
    引用公共DTD
    <!DOCTYPE 根元素名称 PUBLIC "DTD标识名" "公用DTD的URI">

DTD内部声明:

    <!ENTITY writer "me">
    XML:
    <author>&writer;</author>
    一个实体由三部分构成:
    一个&
    一个实体名称
    一个;
示例:<!DOCTYPE FOO [
<!ELEMENT foo ANY>
<!ENTITY xxe "Thinking">
<foo>&xxe;</foo>

DTD外部引用

示例:
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY xxe SYSTEM "file:///c:/win.ini">
]>
<foo>&xxe;</foo>

引用公共DTD

    格式
    <!ENTITY 实体名称 PUBLIC "public_ID" "URI">
    示例
    <!ENTITY public_dtd PUBLIC "DTD_name" "DTD_location">
    在公共类型DTD加载的时候,首先会使用DTD_name来检索,如果无法找到,则通过DTD_location来寻找此公共DTD
    利用DTD_location。在一定的环境下可以用来做内网探测

XXE注入,即XML外部实体注入
通过XML实体,"SYSTEM"关键词导致XML解析器可以从本地文件或远程URI中读取数据。攻击者可以通过XML实体传递自己构造的恶意值,使处理程序解析它。当引用外部实体时,通过构造恶意内容,可导致读取任意文件,执行系统命令,探测内网端口等危害。

XXE分类
1.基础XXE注入:外部实体注入本地DTD
2.基于盲注的XXE注入:XML解析器在响应中不显示任何错误
3.基于错误的XXE注入:成功解析之后,XML解析器始终显示SAME响应,可用解析器将文件内容"打印"到错误响应中。

04-15 08:26
查看更多