涨姿势:jQuery 曾经的 XSS 漏洞

最近我管理的一台服务器被怀疑被利用发起 DoS 攻击(详情见长文学习构建之法(2):课程总结),被有关管理单位查了水表。他们附送了一份检测报告,指出我们存在若干安全漏洞。其中一条引起了我的兴趣。

URL:http://SSAST.ORG/static/javascripts/libs/jquery.js。
详情:发现存在漏洞的’jquery’库,版本号:’1.6.2’。
风险:中危。

此外还报告了 jquery-ui-dialog 版本 1.8.11。

科协主页确实很老了,还在用上古时代的 jQuery 的上古版本。令我很感兴趣的是,前端的漏洞,除了 XSS 或者 CSRF 还能是啥?jQuery 这种万众瞩目的库,难道不是经过无数人 review?还能出这种问题?

我选择去找我的好朋友,Google.com。

google-jquery-1-6-2

哈哈,I’m feeling lucky. 点开,果然是 XSS。CVE-2011-4969#9521 jQuery Bug Tracker

我感觉这不能算是 jQuery 的漏洞,而在于程序员对 jQuery 的用法。简言之,很多知名网站和前端库里有 $(location.hash) 这样的写法(然而我无法理解为什么要这样做)。攻击方法是诱导用户点击精心构造的合法 URL,比如 http://example.com/#<script>alert('hello');</script>

jQuery 1.6.3 的 Release Note 指出该漏洞已被修复,方法简单粗暴,$() 用一个正则表达式来过滤,拒绝任何跟在 # 字符后面的 HTML 标签。