作者:L3B1anc
本文為作者投稿,Seebug Paper 期待你的分享,凡經采用即有禮品相送!
投稿郵箱:paper@seebug.org
最近做銀行系統比較多,遇到了很多前端校驗導致無法重放也不能上掃描器和sqlmap,最后想出來了個解決辦法針對js的校驗可以直接繞過
最近做測試的時候,一頓測完0 high 0 medium 0 low,想著上掃描器和sqlmap一頓梭哈的時候,發現請求包一重放就失效了,這樣交報告那也不能夠啊,只能想想怎么繞過這個防重放機制了。

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

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

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

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重放。

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

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

最后完整代碼見https://github.com/L3B1anc/ytjs
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1415/
暫無評論