如果我们把一个本地文件夹拖到浏览器里打开,大部分浏览器应该都会显示里面的文件和文件夹。就像这样:
这样的地址是本地文件协议,url 如:
file:///C:/
如果可以通过在浏览器里运行 js 代码,请求本地文件的 url,并且可以任意遍历、读取文件(也就是全盘扫描了),那太可怕了。
我的常识告诉我,浏览器出于安全原因肯定会阻止这一行为,所以这应该是不可行的。在普通的网页里请求本地文件确实不可行,但是在浏览器扩展的后台脚本里呢?今天 Reinford 告诉我在后台脚本里可以任意请求本地文件,我试了下还真可以。
首先自己建立一个 Chrome 扩展项目,手动加载到 Chrome 中。在清单文件 manifest.json
的权限字段 permissions
里加入 "<all_urls>"
来获得请求任意 url 的权限。
之后指定一个 js 文件作为后台脚本,在里面用 xhr 来请求任意本地地址即可。
假设我的一个 ssh 秘钥文件路径是:
C:\Users\user\.ssh\ssh1
发起请求:
const h = new XMLHttpRequest() h.addEventListener('loadend', async () => { console.log(h.response) }) h.open('GET', 'file:///C:/Users/user/.ssh/ssh1', true) h.send()
没有任何阻碍,直接读取到了这个文件:
假如我被这样攻击了,那我的秘钥就泄露了。事实上这种请求方式可以任意遍历硬盘上的文件,所以攻击者可以获取到任何(能被 Chrome 浏览器读取的)文件并发送到远程服务器(假设有网络)。
这太可怕了,但还好,Chrome 应用商店发布的扩展都会经过审核,脚本主动去读取本地文件这种危险操作应该不会被通过。
上面的操作示例是用开发者模式手动加载的扩展(即未发布到 Chrome 应用商店),所以可以为所欲为。
虽然大多数情况下,人们不会离线安装别人提供的扩展程序,但是难免会有人遇到。我们需要对 Chrome 扩展的特权和安全性提高警惕了。
Chrome 扩展在开发者模式下可以读取任意本地文件
-
Google Chrome 75Android 5.1 -
Google Chrome 85Windows 这个很不好,不过国内没法打开chrome的应用商店,很多都是跑去edge的
edge有一个好 就是拓展页面可以自由打开(笑) -
Firefox 81Ubuntu x64 国内有许多人无法访问 Chrome 应用商店,所以,大多数情况下,人们“都会”离线安装别人提供的扩展程序
现在已养成用时开,不用时全部保持关闭,希望有点用