作者:L3B1anc
本文為作者投稿,Seebug Paper 期待你的分享,凡經采用即有禮品相送!
投稿郵箱:paper@seebug.org

最近做銀行系統比較多,遇到了很多前端校驗導致無法重放也不能上掃描器和sqlmap,最后想出來了個解決辦法針對js的校驗可以直接繞過

最近做測試的時候,一頓測完0 high 0 medium 0 low,想著上掃描器和sqlmap一頓梭哈的時候,發現請求包一重放就失效了,這樣交報告那也不能夠啊,只能想想怎么繞過這個防重放機制了。

image-20201125144745119

1、發現驗證機制

用burp對比了同樣的兩個請求,發現兩個請求之間不同的只有H_TIME,H_NONCE,H_SN三個參數了,其中H_TIME一看就是時間戳。

image-20201125145331536

按照經驗來說,這種類似token的值,應該是每次請求頁面都會去從服務器端生成一個新的token值,通過這個token值來進行防重放的。然而,發送請求后,發現返回的包里面的參數和提交請求的參數是一樣的,那這樣就只剩一種情況了,就是前端通過js生成校驗碼發送到服務器進行校驗的。

image-20201125145821784

F12大法搜搜兩個關鍵字,發現還是某tong他老人家的安全機制,接著看看這個getUID的代碼,

image-20201125152335502

getUID:function(){
        var s = [];
        var hexDigits = "0123456789abcdef";
        for (var i = 0; i < 36; i++) {
            s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
        }
        s[14] = "4";  // bits 12-15 of the time_hi_and_version field to 0010
        s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);  // bits 6-7 of the clock_seq_hi_and_reserved to 01
        s[8] = s[13] = s[18] = s[23] = "-";

        var uuid = s.join("");
        //localStorage.setItem("LOGIN_UID",uuid);
        return uuid;
    }

這個代碼就很簡單了,生成了36位隨機值,只在第15,20位有了特殊要求,那這樣就隨便改一位uuid就可以了,在burp上試了一下,確實是改了H_SN和H_TIME就可以了。

2、繞過腳本

但是問題來了,機制發現了,咋繞過能用掃描器掃呢,這時候想起來了原來見過大佬繞狗的操作來了,我自己寫個http server做個轉發把請求里面的相關參數替換掉就行了。

生成一個H_SN,剛好學習了python中execjs庫可以直接執行js代碼,這下方便了

def uuid():
    # H_SN = 'H_SN'
    uuid1 = execjs.compile("""

    function uuid2(){
        var s = [];
        var hexDigits = "0123456789abcdef";
        for (var i = 0; i < 36; i++) {
            s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
        }
        s[14] = "4";  // bits 12-15 of the time_hi_and_version field to 0010
        s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);  // bits 6-7 of the clock_seq_hi_and_reserved to 01
        s[8] = s[13] = s[18] = s[23] = "-";

        var uuid = s.join("");
        return uuid;
    }
    """)
    H_SN = uuid1.call("uuid2")
    return(H_SN)

然后就是萬能的flask, 自行搭建http server,然后對傳入的參數自動替換掉,接著向目標網站發送替換后的請求,最后把返回數據直接扔給flask,這樣無論是sqlmap還是burp的掃描,都可以直接啟動了。

@app.route('/<path:path>', methods=['POST'])
def post_Data(path):
    path1 = request.full_path
    data1 = json.loads(request.data)
    head = data1['head']
    head['H_SN'] = uuid()
    head['H_TIME'] = timestap1()
    data1['head'] = head
    data2 = post2bank(data1)
    return jsonify(data2), 201

3、使用效果

在repeater里面,把targert改成自己搭建的http server,向自己發送請求,通過轉發替換后,可以成功繞過H_SN重放。

image-20201125160247153

最后是測試sqlmap,原數據包跑的時候一片紅,根本不能用,在數據包里面把host改為127.0.0.1指向自己的http server后,還是 0 high 0 medium 0 low

image-20201125160749877

不過好歹能用了,通過這種方式,同樣能夠處理網站中常見的前端js加密、簽名等等防爆破防重放的機制,至于為什么不用burp插件直接替換,因為是真的不會寫。

image-20201125160932668

最后完整代碼見https://github.com/L3B1anc/ytjs


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1415/