概述
一個有效的字典可以大大提高暴力破解的效率
- 比如常用的用戶名/密碼TOP500
- 脫褲后的賬號密碼(社工庫)
- 根據特定的對象(比如手機、生日和銀行卡號等)按照指定的規則來生成密碼
暴力破解流程
- 確認登錄接口的脆弱性
- 嘗試登錄——抓包——觀察驗證元素和response信息,判斷是否存在暴力破解的可能
- 對字典進行優化
- 根據實際情況對字典進行優化,提高暴力破解的效率
- 工具自動化操作
字典優化技巧
- 根據注冊提示進行優化,比如注冊時要求密碼8位以上,我們就去掉少於8位的密碼
- 爆破管理后台,賬號是 admin / administrator / root 的可能是比較高,可以使用這3個賬號進行爆破
基於表單的暴力破解
輸入錯誤時,有以下提示
這里沒有驗證碼等其他驗證機制,抓包看看
發送到Intruder進行暴力破解
設置好Payload
然后把“ username or password is not exists~ ”復制到Grep Match中。后面可以利用Grep Match區分哪些請求里面有這個字符串
然后就可以開始攻擊了,匹配到 username or password is not exists 都是攻擊失敗的,另外,從響應長度也可以看出攻擊成功與否
驗證碼繞過(on server)
驗證碼可以用來防止惡意注冊、防止暴力破解。服務端驗證碼常見問題:
- 驗證碼在后台不過期,導致長期可以使用
- 驗證碼校驗不嚴格,邏輯出現問題
- 驗證碼設計的太過簡單和有規律,容易被猜解
我們先簡單的測試一下,不輸入驗證碼的情況下會提示驗證碼為空,輸入錯誤驗證碼的情況下會提示驗證碼錯誤,只有驗證碼正確的前提下才會提示賬號或密碼不存在
下面通過抓包判斷一下服務器端有沒有對驗證碼進行驗證,發現是有的
說明后端對驗證碼是有驗證的,我們來了解一下驗證碼生成的邏輯:
當我們刷新頁面的時候,我們會向后台發送一個請求,后台收到請求會生成一個驗證碼並在session中把驗證碼保存下來。
我們先生成一個新的驗證碼,然后在BurpSuite中輸入正確的驗證碼
提示賬號密碼不存在
我們換個密碼再發送一次
發現依然是提示賬號密碼不存在,正常來說應該提示驗證碼錯誤,這說明驗證碼長期有效,我們發送到Intruder中直接暴力破解
驗證碼繞過(on client)
這里我們需要輸入驗證碼,我們不能對驗證碼暴力破解,通過抓包發現請求里面只是多了驗證碼
通過查看源碼,發現驗證碼的驗證邏輯是在客戶端實現的
這個JavaScript會從0-9和26個大寫字母中隨機挑選5個作為驗證碼,然后用 validate() 去驗證
另外,通過源碼也可以看到,我們每點一次驗證碼,就會調用 createCode() 改變驗證碼
通過BurpSuite發現后台不會對輸入錯誤的驗證碼進行驗證,在瀏覽器中,輸入錯誤的驗證碼是有提示的
正常來說會有這個彈窗
說明前端設置的驗證碼如同虛設,后端不會對驗證碼進行驗證。那么我們不用理會驗證碼,直接進行暴力破解就可以了
token防爆破
利用開發者工具可以發現這里有一個隱藏的標簽
里面的數字就是我們的token,我的每次提交的請求都會有一個token值,后端會驗證這個token值
但是這個token已經寫到了html頁面中,攻擊者只需要寫個工具,提交認證前都加上這個token就好了
用一個簡單的python腳本測試,代碼如下:
import requests import re url = "http://192.168.171.133/pikachu/vul/burteforce/bf_token.php" def get_token_and_cookie(url): response = requests.get(url) content = response.text pattern = '(?<=value=")\w+(?=")' token = re.search(pattern, content).group() cookies = response.cookies return token, cookies users = ["admin", "root"] passwds = ["admin", "password", "123456"] data = {"submit": "Login"} for user in users: for passwd in passwds: data["username"] = user data["password"] = passwd data["token"], cookies = get_token_and_cookie(url) cookies = cookies.get_dict() headers = {"Cookie": ""} headers["Cookie"] = "PHPSESSID=" + cookies["PHPSESSID"] response = requests.post(url, data=data, headers=headers) content = response.text if "login success" in content: print("usernmae: ", user, "password: ", passwd)
輸出結果