暴力破解概述
暴力破解”是一攻擊具手段,在web攻擊中,一般會使用這種手段對應用系統的認證信息進行獲取。 其過程就是使用大量的認證信息在認證接口進行嘗試登錄,直到得到正確的結果。 為了提高效率,暴力破解一般會使用帶有字典的工具來進行自動化操作。 理論上來說,大多數系統都是可以被暴力破解的,只要攻擊者有足夠強大的計算能力和時間,所以斷定一個系統是否存在暴力破解漏洞,其條件也不是絕對的。 我們說一個web應用系統存在暴力破解漏洞,一般是指該web應用系統沒有采用或者采用了比較弱的認證安全策略,導致其被暴力破解的“可能性”變的比較高。 這里的認證安全策略, 包括: 1.是否要求用戶設置復雜的密碼; 2.是否每次認證都使用安全的驗證碼(想想你買火車票時輸的驗證碼~)或者手機otp; 3.是否對嘗試登錄的行為進行判斷和限制(如:連續5次錯誤登錄,進行賬號鎖定或IP地址鎖定等); 4.是否采用了雙因素認證; ...等等。 千萬不要小看暴力破解漏洞,往往這種簡單粗暴的攻擊方式帶來的效果是超出預期的!
從來沒有哪個時代的黑客像今天一樣熱衷於猜解密碼 ---奧斯特洛夫斯基
個人理解
上面是官話版的暴力破解.我個人理解為暴力破解就是瞎猜.瞎試.結合你收集的一切信息利用社工也好,32GB大字典也好.反正就是逐一亂猜...猜對了.就破解成功了.
爆破小技巧
我們在生成破解密碼對應的文件的時候, 應該去嘗試注冊一個賬號,看看目標站點要求我們使用什么樣的密碼.例如目標站要求我們使用6位以上的密碼.顯然,我們的字典如果存在6位或者6位以下的就是不合理的.可以利用此方法.去除字典中不必要的密碼.
如果是爆破的后台,往往最應該嘗試的是admin/administrator/root/adminroot/等象征性比較高的用戶名,可以重點對這些用戶名+密碼進行嘗試.觀看返回結果.確定用戶名.
實驗演示
測試目標: http://www.php09.cn
測試工具: burp suite
我們密碼和用戶名使用同一個字典:
我們隨便鍵入用戶名和密碼, 可以看到發送的為POST請求, username 對應的用戶名.password處對應的密碼.當然,我們此處登錄失敗.
我們抓到這次請求之后,使用burp的intruder進行爆破.
我們首先選擇bomb模式, 因為這個模式會窮舉字典的一切組合,來嘗試所有可能出現的用戶名,密碼. 我們username和password處進行標記,標記的意思就是等會要替換的位置
接下來我們載入字典文件.一般來說,前面設置了幾個變量,后面就需要載入幾個字典(跟爆破模式相關), 字典可以一直,載入完字典也可以再次進行手動添加,字典也可以根據特定的規則進行自動生成.替換等.
載入完字典 ,我們開始爆破.
破解的時候 我們可以點擊某一次請求 來查看具體發送的內容. 下方則顯示整體進度條
剛才由於我的字典文件里面沒有正確的密碼(123456),導致破解不成功, 我手動添加了123456之后,破解完成之后可以看到,響應的長度和眾多響應不一樣,我們可以點開查看響應.
還有一種快速分辨的技巧.我們通過手工登錄得知,如果賬號密碼為錯的情況下.頁面會返回我們
username or password is not exists~ ,那我們把 響應包含 username or password is not exists~ 給排除 是不是就是成功的登錄信息了呢.?
設置burp 添加規則,從新嘗試, 從上次我們已經得知賬戶為admin,密碼為123456,這次我們節省時間,字典少一點..
添加完之后,我們開始爆破. 完了點擊排序. 我們很快的發現有一個請求沒有打鈎,沒有打鈎就證明沒有出現username or password is not exists~,我們點開請求查看,可看到對應的正確的賬號密碼.
源碼解析
# 如果提前的請求submit 和 username 和password 都不為空的時候. 點擊登錄,submit就默認賦值了,而username和password對應的我們的賬號密碼.
if(isset($_POST['submit']) && $_POST['username'] && $_POST['password']){ $username = $_POST['username']; # 獲取用戶名 $password = $_POST['password']; # 獲取密碼 $sql = "select * from users where username=? and password=md5(?)"; # 組合sql語句查詢用戶名等於xxx 同時密碼等於MD5后的xxx $line_pre = $link->prepare($sql); # 執行查詢sql $line_pre->bind_param('ss',$username,$password); if($line_pre->execute()){ $line_pre->store_result(); if($line_pre->num_rows>0){ $html.= '<p> login success</p>'; } else{ $html.= '<p> username or password is not exists~</p>'; } } else{ $html.= '<p>執行錯誤:'.$line_pre->errno.'錯誤信息:'.$line_pre->error.'</p>'; } }
可以看到上述源碼沒有對登陸失敗做任何處理,只是單純的輸出一句話. :username or password is not exists~
沒有沒有驗證碼,沒有其他控制措施,典型的暴力破解應用場景.
修復方案
建議增加驗證碼.登陸次數失敗過多的情況下鎖定賬號或ip等一系列手段.