Pikachu漏洞練習平台實驗——暴力破解(一)


概述

一個有效的字典可以大大提高暴力破解的效率

  • 比如常用的用戶名/密碼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)

輸出結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM