接下來我們開始進入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。(剛才我就忘了設置導致不能攻擊)
