HTTPS网站被劫持, 塞上了混淆的JS代码
/ 4 min read
下午突然有位同事的手机在 app 上频繁请求打开其他 app: 京东拼多多UC等. 经过测试, 只有在安卓上会有这种事情发生, 并且只有在某一特殊页面会发生.
当时怀疑过是不是 app 应用商店故意给安装包里塞进去了莫名的代码导致的, 但通过没经过商店打得包安装后在页面上也会出现这种问题.
App 是个套壳 app, 是一个 webview 加载了单页应用, 但是发生事故但页面明明是 HTTPS 的呀, HTTPS 的页面怎么会被黑?
原因可能有3种:
- 证书泄漏(不太可能, 大公司的证书泄漏可是大罪)
- 中间人劫持(经过各种网络测试都会复发, 排除)
- CDN回源路径中存在劫持(Bingo)
探究
经过一系列调查, 发现在 chrome 网站资源里面有一诡异的来源: https://gov.papastars.com/aoll.min.js
这里面的代码不是一般的 js 代码, 但它仍然是 js 代码, 只是不是人所理解的代码:
看到 \x66
就想到了当初写 python 时候的遇到的 bytes
类型, 经过转化上述代码可以翻译为:
这里省略了特别长的一串字符串 (xxxxxxx…xxx).
让我们来解释下这里的代码, 首先从最里面的括号开始:
['son'] + []
结果是字符串 son
, 所以它的构造器是 f String() {}
.
接下来是 String.fromCharCode(?)
, 到底参数是什么需要进一步推断:
这里执行的是 str.split(/[a-zA-Z]{1,}/)
将 str
的字母部分拿掉, 剩下的用数组形式代表, 以字母切割的数组.
所以这里是 String.fromCharCode([88, 111, 222....])
.
真相大白, 上面说的省略了特别长的字符串是用来混淆 charCode 的, 拿掉无关的字母, 剩下的数字才是关键, 并且通过 fromCharCode 可以格式化为 js 代码:
可以发现, 这段劫持的代码干了哪些事:
- 判断环境系统
- 500毫秒定时器
- 插入不可见的 iframe
- 设置 cookie
- 插入了一个 script, 内容是: https://s1.safessd.com/abc.min.js
- 通过应用名称打开了无数个 app:
原始网站前端代码里在这里可以找到对应被插入的脚本代码:
Ref