接下來我們開始進入pikachu的學習了。
Pikachu下載地址
下載地址1:https://github.com/zhuifengshaonianhanlu/pikachu
下載地址2:https://pan.baidu.com/s/1JpJjLDQF5DXIuxbgmclRbA 提取碼:ulm5
將其放入WWW文件下即可,在此我就不贅述了,網上的教程很多。
暴力破解
一、概述
Burte Force(暴力破解)概述
“暴力破解”是一攻擊具手段,在web攻擊中,一般會使用這種手段對應用系統的認證信息進行獲取。 其過程就是使用大量的認證信息在認證接口進行嘗試登錄,直到得到正確的結果。 為了提高效率,暴力破解一般會使用帶有字典的工具來進行自動化操作。
理論上來說,大多數系統都是可以被暴力破解的,只要攻擊者有足夠強大的計算能力和時間,所以斷定一個系統是否存在暴力破解漏洞,其條件也不是絕對的。 我們說一個web應用系統存在暴力破解漏洞,一般是指該web應用系統沒有采用或者采用了比較弱的認證安全策略,導致其被暴力破解的“可能性”變的比較高。 這里的認證安全策略, 包括:
1.是否要求用戶設置復雜的密碼;
2.是否每次認證都使用安全的驗證碼(想想你買火車票時輸的驗證碼~)或者手機otp;
3.是否對嘗試登錄的行為進行判斷和限制(如:連續5次錯誤登錄,進行賬號鎖定或IP地址鎖定等);
4.是否采用了雙因素認證;
...等等。
千萬不要小看暴力破解漏洞,往往這種簡單粗暴的攻擊方式帶來的效果是超出預期的!
你可以通過“BurteForce”對應的測試欄目,來進一步的了解該漏洞。
從來沒有哪個時代的黑客像今天一樣熱衷於猜解密碼 ---奧斯特洛夫斯基
二、基於表單的暴力破解
知識補充
- Sinper:一個變量設置一個payload進行攻擊
- Battering ram:可以設置兩個變量,把payload同時給兩個變量
- Pitchfork:兩個變量分別設置payload,然后按順序一一對應進行破解
- Cluster bomb:兩個變量分別設置payload,然后交叉列所有情況進行破解(常用)
①配置瀏覽器代理,使用burpsuite抓包,發送至Intruder(入侵者)模塊
②如圖所示設置攻擊類型Attack type以及變量。
③在playloads中添加變量的字典,點擊load加載,並開始破解。
④根據爆破返回出的長度確定正確用戶名以及密碼。 (admin-123456) 當然了,正確的用戶名和密碼有很多,這個只是我的字典爆出的,受字典影響,肯定不全。
三、驗證碼繞過(on server)服務器
if(isset($_POST['submit'])) { if (empty($_POST['username'])) { $html .= "<p class='notice'>用戶名不能為空</p>"; } else { if (empty($_POST['password'])) { $html .= "<p class='notice'>密碼不能為空</p>"; } else { if (empty($_POST['vcode'])) { $html .= "<p class='notice'>驗證碼不能為空哦!</p>"; } else { // 驗證驗證碼是否正確 if (strtolower($_POST['vcode']) != strtolower($_SESSION['vcode'])) { $html .= "<p class='notice'>驗證碼輸入錯誤哦!</p>"; //應該在驗證完成后,銷毀該$_SESSION['vcode'] }else{ $username = $_POST['username']; $password = $_POST['password']; $vcode = $_POST['vcode']; $sql = "select * from users where username=? and password=md5(?)"; $line_pre = $link->prepare($sql); $line_pre->bind_param('ss',$username,$password); if($line_pre->execute()){ $line_pre->store_result(); //雖然前面做了為空判斷,但最后,卻沒有驗證驗證碼!!! if($line_pre->num_rows()==1){ $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>'; } } } } } }
分析源碼,在比較完驗證碼后,沒有重置驗證碼,漏洞由此可見,在我們輸入了正確的驗證碼之后,驗證碼並沒有過期,一直有效,可以繼續使用。
①同樣我們通過burpsuite抓包,發送至intruder模塊,將驗證碼改為正確的驗證碼(因為正確的驗證碼一直有效),這樣的們就可以繞過驗證碼來爆破用戶名和密碼了。
過程相似,我不一一截圖了,參考表單的步驟。
②開始爆破,根據返回包長度判斷正確的密碼。
③登錄測試,登陸成功。
四、驗證碼繞過(on client)客戶端
這關依舊有驗證碼,通過觀察源碼不難發現,此次驗證碼是在前端中的js代碼進行驗證,與上一關的服務器端驗證不同。
<script language="javascript" type="text/javascript"> var code; //在全局 定義驗證碼 function createCode() { code = ""; var codeLength = 5;//驗證碼的長度 var checkCode = document.getElementById("checkCode"); var selectChar = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');//所有候選組成驗證碼的字符,當然也可以用中文的 for (var i = 0; i < codeLength; i++) { var charIndex = Math.floor(Math.random() * 36); code += selectChar[charIndex]; } //alert(code); if (checkCode) { checkCode.className = "code"; checkCode.value = code; } } function validate() { var inputCode = document.querySelector('#bf_client .vcode').value; if (inputCode.length <= 0) { alert("請輸入驗證碼!"); return false; } else if (inputCode != code) { alert("驗證碼輸入錯誤!"); createCode();//刷新驗證碼 return false; } else { return true; } } createCode(); </script>
①Burpsuite抓包發送至Intruder模塊。
②添加字典開始爆破。
五、token防爆破
①利用burpsuite抓取數據包,我們發現登錄時提交了username,password,token,submit四個參數,每次服務器返回的登錄頁面都會包含一個隨機的token值,這樣每次提交都要驗證token值,表面上可以防止爆破,但是后端產生的token每次都會以明文形式傳到前端,從而產生了漏洞。
②將抓取的數據包發送至Intruder模塊
③將Attack type 設置為pitch fork,為password和token值添加payload標志。
④在options欄中找到Grep-Extract,點擊Add,點擊Refetch response,進行請求,選取提取的token字符串,上面會自動填入數據的起始和結束標識,將此值保存下來,后面會用到。另外,將線程更改為1.
⑤在payloads欄中,將1變量設置密碼字典,將2變量(token)選擇為Recursive grep,並在下面如圖所示的地方填入保存的值。
⑥從Results中可以看到上一次訪問得到的token作為了本次請求的參數。而且從響應信息上也可以看到,沒有提示token錯誤。長度不一樣的password即為密碼。
注:recursive grep類型只能單線程attack。(剛才我就忘了設置導致不能攻擊)