暴力破解
原理:攻擊者使用自己的用戶名和密碼字典,一個一個去枚舉,嘗試是否能夠登錄。因為理論上來說,只要字典足夠龐大,枚舉總是能夠成功的!
一、准備工作
設置瀏覽器代理
二、基於表單的暴力破解
在表單中輸入數據提交表單,使用Burp Suite抓包
抓包,提交方式為POST請求,賬號為admin,密碼為asdf,沒有驗證機制,可以暴力破解,將包發送Intruder模塊
在Intruder模塊中Positions選項卡中,選擇攻擊類型:Cluster bomb,選中Clear,清除默認變量,再選中輸入的賬號和密碼,點解Add,添加成變量
選中第一個有效載荷集,點擊Load,導入用戶名的字典
選中第二個有效載荷集,點擊Load,導入密碼的字典,點擊Start attack,進行爆破
查看Length,判斷字典條目是否爆破成功
進行驗證,成功爆破,成功登錄
三、驗證碼繞過(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>';
}
}
}
}
}
}
驗證驗證碼是否正確之后,驗證完成后,並沒有銷毀,導致該驗證碼一致可以使用
輸入用戶名和密碼,並輸入正確的驗證碼,進行抓包
之后與基於表單的暴力破解相似
四、驗證碼繞過(on client)
<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>
在前端對驗證碼進行驗證,可以通過抓包,進行爆破,繞過前端驗證
之后與基於表單的暴力破解相似
五、token防爆破?
輸入用戶名和密碼,進行抓包,發送至Intruder模塊
進入options,Grep-Extract 打勾點擊add,點擊refetch response 找到響應包中的token的值選擇點擊確定。然后在Redirections中選擇always。
選擇on-site only,
將剛才篩選到的token加入下圖輸入處,不然第一遍爆破時就會沒有token
設置線程為1,開始攻擊
繞過token,爆破成功
防御措施
-
設計安全的驗證碼(安全的流程+復雜而又可用的圖形)
-
對認證錯誤的提交進行計數並給出限制,比如連續5次密碼錯誤,鎖定兩小時,驗證碼用完后銷毀,能有效防止暴力破解
-
必要的情況下,使用雙因素認證