本文原成于 2020 年末,缘起当时公司举办的针对内网系统的安全众测挖洞活动。本来我对内网实名论坛这种东西没什么兴趣,但在活动之前,有同事邀请在论坛内帮忙点赞刷人气,当时就发现了一些问题但没有深究。于是在活动期间深入研究一番,写了一篇 POC 提交了上去。
论坛在发状态的时候可以选择表情,这是一个很常见的功能。但该论坛里引用的表情图片竟然不是本地文件或者类似于微信的那种 [赞]
转义代码,而是外部(新浪微博)的 URL,如 http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/86/2018new_quantou_thumb.png
,而且在发状态的时候,选中的表情以完整的 URL 写在 POST body 中。安全信条说永远都不要相信用户的任何输入,那这种用户能控制的图片 URL 是否可以搞点事情,如储存型 XSS 呢?
把图片的 <img src>
替换为非法地址,附上事件代码 on error=alert
,提交以后弹窗成功。
储存型 XSS 验证成功了,如果引入外部的 js 代码真正构造一个 “跨站” 脚本攻击,还可以做点什么事呢?构造一个调用发帖接口发送内容的 js,在中招人不知情的情况下再发一帖,内容依然是偷摸发帖代码,导致看中招人帖的观众再中招再发帖,如此往复,这就是 XSS 蠕虫了。
使用 Burpsuite 的 CSRF 模块验证了一下,结果发现发帖时需要校验 HTTP 头部的 x-token,验证失败。但是再一番探测之后又发现一个越权查询接口 /……/get/user/info/{用户名} ,把用户名作为参数,在不需要 sessionID 的情况下都可以查到该用户当前的 x-token!至此,一个 XSS 蠕虫攻击的所有要件都已齐备。
试想,攻击者先发一帖,埋入储存型 XSS,看帖的人加载了攻击者所埋的 js 脚本,该脚本通过越权接口查询当前登入用户的 x-token,加到到请求头中,调用发帖接口再发出含有 XSS payload 的帖子,如上所述导致看帖者再中招发帖,似病毒传染一般形成 XSS 蠕虫。
由于我的 javascript 代码水 (ji) 平 (hu) 有 (bu) 限 (hui),况且也不能真的构造一个 js 蠕虫,那样影响实在太大,因此上述 POC 构思也仅仅是停留在当年的纸面上,随着论坛后来的升级改造,连土壤都不复存在。但给我的启示是,一两个漏洞看似危害不大,但是两个甚至更多的小漏洞的互相联合利用,将会带来危险程度呈指数级上升的严重危害。