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中可成功爆破
原因如下:
缺少“;”
原本的;被#注释掉了