当前位置:首页 > 综合

检测到目标站点存在javascript框架库漏洞

凌晨两点十七分,检测监控大屏上跳出一条告警:目标站点的到目点存洞AngularJS版本停留在1.2.29。这个版本号我太熟悉了——它带着CVE-2016-7444的标站烙印,一个老掉牙的框架库漏模板注入漏洞,能让攻击者直接在浏览器里执行任意JavaScript。检测扫描器不会说谎,到目点存洞但真正的标站麻烦在于,这家银行的框架库漏IT团队可能根本不知道自己在用这个框架。

JavaScript框架库漏洞和传统SQL注入不一样。检测后者像撬锁,到目点存洞前者更像拿到了一把万能钥匙。标站AngularJS的框架库漏双花括号表达式解析机制,原本是检测给开发者绑定数据用的,可一旦用户输入能进入模板上下文,到目点存洞就成了代码执行的标站入口。我见过一次真实攻击:攻击者在搜索框输入{ { constructor.constructor('alert(1)')()}},页面卡顿半秒,然后弹窗出现。就这么简单,连服务器都不需要碰。

框架漏洞的隐蔽性在于,它们藏在业务代码的下一层。业务代码是墙纸,框架是承重墙。大多数团队扫描业务代码,却忘了检查地基。去年某电商平台被拖库,事后溯源发现攻击路径是从一个Vue.js 2.0老版本的控制台警告触发的——那个版本有个已知的XSS漏洞,只要利用v-html指令传参不当就能绕过过滤。他们的WAF规则写得密密麻麻,可WAF根本不解析JavaScript框架的运行时行为。

修复这类漏洞往往比发现它更棘手。直接升级框架?那意味着重写部分组件,测试回归周期至少两周。打补丁?AngularJS 1.x官方早就停止维护,连补丁都没得打。有次给一家物流公司做渗透测试,对方IT主管摊手说:“我们连这个框架是哪个外包团队引入的都不知道,代码仓库里只有压缩后的文件。” 这就是现实——框架库漏洞像埋在地下的管道,漏了水,你还得先找图纸。

更头疼的是,这类漏洞的检测结果经常是误报。扫描器报“存在Vue.js 2.2.0已知漏洞”,可实际代码里根本没用到受影响的功能模块。但你不能赌它不存在。我倾向于用双重验证:先看框架加载的源文件版本,再追踪运行时是否有敏感函数被调用。有一次,我在某个政府门户网站发现React 16.8.3版本(CVE-2019-10160),但他们的表单组件全是自定义的,压根没碰React的SSR功能——最终判定为低危。可即便如此,我还是建议他们加了个CSP头,以防万一。

说句掏心窝子的话,检测到框架库漏洞,最该做的不是急着打补丁,而是先搞清楚这个框架在系统里到底承担了什么角色。它是不是暴露在公网?它处理的数据是否敏感?如果它只是渲染了一个静态页面,那漏洞再严重也白搭。反之,若它绑定了用户输入且无任何白名单校验,哪怕是个低危告警,也得当回事来办。

凌晨三点,我关掉告警弹窗,给客户写了封邮件:建议优先排查所有内嵌AngularJS的页面,把用户可控输入全部做转义。邮件发出去,我知道他们大概率不会立刻处理——毕竟框架漏洞不像服务器宕机那样火烧眉毛。但等真正被攻击的那天,他们或许会想起这个凌晨的告警。技术这行就是这样,你永远在跟“可能发生的事”赛跑,而不是等它发生后收拾残局。

分享到: