0.浏览器的安全模型

浏览器安全限制

禁止主动读写本机文件

可以读取的操作

可以透过<input type=file>让使用者选择档案,选完以后用FileReader把档案内容读出来

<input type="file" onchange="show(this)">

<script>
function show(input) {
  const reader = new FileReader();
  reader.onload = (event) => {
    alert(event.target.result);
  };
  reader.readAsText(input.files[0]);
  
}
</script>
  1. fetch('file:///data/index.html')

  2. window.open('file:///data/index.html')

  3. 报错:Not allowed to load local resource: file:///data/index.html

  4. 如果可以 etc/passwd ssh密钥

主动读取本地文件漏洞案例:

# Bug Bounty Guest Post: Local File Read via Stored XSS in The Opera Browser

  1. Opera 是以Chromium 为基础打造的浏览器,而其中有一个「Opera Pinboards」的功能,可以建立一些笔记然后分享给其他使用者,而笔记页面的网址是:opera:pinboards 是属于特殊的协定,通常会给予一些特别的权限。

  2. 在建立笔记的时候,可以包含一个连结,例如说:https://blog.huli.tw,而Renwa 发现了除了可以使用正常的连结以外,也可以使用javascript:alert(1)这种类型的连结去执行程式码,因此就可以得到一个opera:pinboards底下的XSS 漏洞!

  3. 前面有提过在opera:底下会有一些特殊的权限,例如说可以开启file://的网页,还可以帮网页截图并得到截图的结果,因此就可以利用刚刚讲的XSS 去开启本机的档案并且截图,传到攻击者的伺服器,达成偷取档案的目的。

禁止交互系统API

浏览器没有提供给网页前端相对应的API,使Javascript与系统进行交互

被允许的API

  1. 浏览器提供了用于与蓝牙设备通信的Web Bluetooth API,因此在网页上的JavaScript中实际上可以创建与蓝牙相关的应用程序。

  2. 另一个MediaDevices API 允许JavaScript获取麦克风和摄像头等数据,因此也可以创建相关的应用程序。

当浏览器提供这些API时,它还会实现权限管理机制,通常会弹出通知,要求用户主动同意并授予相应权限,然后网页才能获取所需的数据。

禁止存取其他网页的内容

同源策略:每个网页都只有针对自己的权限,可以修改自己的HTML,执行所需的JavaScript代码,但不应获取其他网页的数据,这就是同源政策(同源策略,有时缩写为SOP)。如果需要从不同源的框架中获取数据,通常需要使用一些跨域通信技术,例如跨域资源共享(CORS)或跨文档消息传递(Cross-document Messaging)

在github.com执行以下程序

var win = window.open('https://blog.huli.tw')
setTimeout(() => {
  console.log(win.location.href)
}, 3000)
Uncaught DOMException: Blocked a frame with origin "[https://github.com"](https://github.com%22/) from accessing a cross-origin frame.

这个错误消息是浏览器的安全机制触发的,它指示一个网页框架(frame)试图访问另一个不同源(cross-origin)的框架,但被浏览器阻止了。

绕过案例

  • Issue 1359122: Security: SOP bypass leaks navigation history of iframe from other subdomain if location changed to about:blank,可以利用一個 iframe 的漏洞讀到 cross-origin 的網址。

    • 假设当前网页是 a.example.com,其中包含一个 iframe,其网址为 b.example.com。通过执行 frames[0].location = 'about:blank' 将 iframe 重新定向后,iframe会变成与 a.example.com 具有相同源(same-origin),此时尝试读取 iframe 的浏览历史记录:frames[0].navigation.entries(),会从中获取到原本的 b.example.com 网址。

    • 然而,这种情况不应该发生。当 iframe 被重新定向到其他网址后,navigation.entries() 应该被清空,这是一个bug。

参考链接

  1. https://aszx87410.github.io/beyond-xss/ch1/browser-security-model/

  2. https://www.chromium.org/Home/chromium-security/site-isolation/

  3. https://securitylab.github.com/research/in_the_wild_chrome_cve_2021_30632/

Last updated