Web漏洞_SQL注入(DVWA1.9版本SQL injection/SQL injection(Blind)靶机实验)

一、SQL注入的原理

场景:当我们在网站要登陆的时候,需要输入用户名、密码。这个过程由后台的程序将输入的内容连接数据库进行查询进行查询如php程序等。以php为例,当我们输入信息后,php程序会定义变量保存用户输入的信息,然后连接数据库,通过SQL语句进行查询。如果数据库中的用户名密码和我们相匹配则登陆成功最后php程序再返回结果。
SQL注入的原理就是由于php程序对我们输入的内容没有做好过滤,从而黑客可以构造一些语句带入到数据库中执行,获取信息。归根结底,SQL注入的问题主要出现在后台程序,而并不是数据库。

二、SQL注入分类

SQL注入的分类有很多种分法,这里先按照数字型和字符型进行分类,然后再介绍其他的一些具体注入方式。

1、数字型

数字型故名我们输入的参数为数字,举个例子:

select * from table where id=3;

此查询语句种参数id的值为数字,此种方法我们无需考虑闭合的问题。
判断方法:

  1. 输入’,id=3’ 报错进行下一步;
  2. 输入参数和and 1=1 查看页面是否正常;id=3 and 1=1 页面正常进行下一步
  3. 输入参数和and 1=2 查看页面是否正常;id=3 and 1=2 页面不正常则有可能存在数字型注入

2、字符型

字符型则是输入的参数为字符,后台语句可能如下:

select * from table where id='3';

此时id的值被单引号包起来,所以我们在构造语句的时候需要考虑闭合问题。
判断方法:

  1. 输入’,id=3’ 报错进行下一步;
  2. 输入参数单引号and ‘1’=‘1 id=3’ and ‘1’='1 显示正常下一步;//此种方法先将参数3闭合,然后构造恒为真的条件,等号右边的1没有加单引号是为了与sql语句本来右边的单引号进行匹配使得1闭合。
  3. 输入参数单引号and ‘1’='2 显示不正常则可能存在字符型注入

3、按注入位置分:GET注入、POST注入、Cookie注入

GET注入:注入方式通过GET请求,如地址栏中;
POST注入:注入方式通过POST请求
Cookie注入:注入的语句包含在Cookie中

4、按数据库分:Access注入、MySQL注入、SQL Server注入、Oracle注入等

由于只了解到MySQL注入所以只总结下MySQL注入
MySQL数据库的架构
数据库1数据表1数据列/字段内容数据表2......数据库2......
MySQL数据库元数据库
MySQL5.0及以上版本中提供了一个数据库information_schema设置了专门的数据表用来存储MySQL中数据库信息、数据表信息、字段信息。具体可见百度文库
常用的MySQL函数
system_user() 系统用户名
user() 用户名
current_user() 当前用户名
session_user() 连接数据库的用户名
database() 数据库名
version() MySQL数据库版本信息
load_file() 读取数据库本地文件信息
@@datadir 读取数据库路径
@@basedir MySQL安装路径
MySQL连接的用户密码信息可能存在下列路径文件
config.php
db_config.php
include/common.inc.php

5、盲注

我们不知道是否存在注入漏洞,就构造语句去测试。分为基于布尔、基于显错、基于时间
查看此文进行了解

6、宽字节注入

当后台的程序对单引号等特殊符号进行了转义时,如使用addslashes()函数。此时如果数据库使用的是GBK编码,可以尝试宽字节进行绕过。
原理:
GBK使用两个字节表示一个字符,ASCII使用一个字节表示一个字符。PHP函数中使用的是ASCII编码,如addslashes()函数添加转义\,为一个字节。如果输入%df’,经过转义之后会变成%df’,\的URL编码为%5c,最后的结果就是%df%5c’,此时%df%5c在数据库中是两个字节变为一个字符从而使得结尾的单引号将前面的单引号进行闭合。
SQL语句为select * from aaa where id='$id',当传参?id=1%df’ 之后时,经过转义带入语句就是select * from aaa where id='1%df%5c'',这里%df%5c表示一个汉字,所以单引号闭合前面的单引号,会出现报错。
sqli-labs中Less-33测试
输入1'会显示转义
在这里插入图片描述
输入1%df',此时报错成功将前面的单引号进行闭合
在这里插入图片描述

7、搜索型注入

select first_name,last_name from table where first_name like '%$id%';

$id为用户输入的内容,查询table表中first_name中包含关键字的first_name 和last_name,此时通过输入%或者_来查看是否将所有的内容都显示,若都显示则存在搜索型注入。可以通过闭合%和’来进行漏洞利用添加其他sql语句进行更深层次的查询。

三、SQL注入思路

  1. 判断是字符型注入还是数字类型注入
  2. 查询该sql语句所查询的列数,通过order by语句
  3. 查询当前数据库,database()
  4. 查询当前数据库中有哪些数据表,5.0版本及以上可通过information_schema进行查询,其他通过逐字猜解方法
  5. 查询我们想要的数据表中的数据列,方法同上
  6. 查询内容

可参考DVWA靶机的讲解(手工查询),新手指南:DVWA-1.9全级别教程之SQL Injection

四、DVWA SQL injection

Low级别:

首先需要手工进行测试是否存在注入
输入’,报错
输入1’ and 1=1 – ,返回正常
输入1’ and 1=2 – ,无回显,说明and1=2带入到语句中执行
由以上步骤可判断该页面存在注入,然后将URL复制,打开sqlmap,通过-u参数指定URL进行测试
在这里插入图片描述
可以看到提示一个302跳转,原因为我们需要登陆此网站之后才能对此页面进行测试。有两种办法可以解决:
1、通过–cookie指定cookie进行测试
首先打开浏览器审查元素的网络选项然后点击刷新页面
在这里插入图片描述
将cookie复制
然后在sqlmap中加入
在这里插入图片描述
在这里插入图片描述
存在注入点,sqlmap会将注入的类型以及payload进行显示,还会显示一些关于网站系统、web容器、数据库以及后台语言的相关信息
2、通过burpsuite进行抓包然后保存,在sqlmap中通过-r 指定抓到的包(由于抓到的包中包含了cookie信息所以也不会产生302的跳转)
首先浏览器需要开启代理到burpsuite
在这里插入图片描述
这里使用了一个火狐浏览器切换代理的插件 proxy switcher
然后打开burp suite开启拦截
在这里插入图片描述
在输入框输入1后提交,在burp找到拦截的包右键copy to file
在这里插入图片描述
这里我保存到本地,然后打开sqlmap输入-r参数,指定保存的数据包(需要加路径然后包名)
在这里插入图片描述
最终显示的结果同上面–cookie方式
查询到具有注入漏洞,可以通过参数对其进行查询,具体可参见SQLmap使用
通过–dbs查询网站的数据库有哪些
在这里插入图片描述
通过–current-db查询当前使用的数据库(类似database()函数)
在这里插入图片描述
通过-D 指定数据库 --tables查询指定的数据库中有哪些数据表
在这里插入图片描述
在这里插入图片描述
通过-D 指定数据库 -T 指定数据表 --columns查询指定表中有哪些字段
在这里插入图片描述
在这里插入图片描述
然后通过-D 指定数据库 -T 指定数据表 -C 指定字段 --dump 对指定字段的内容进行查询
也可以不指定字段,–dump-all方式将所有的字段都打印出来
在这里插入图片描述
在这里插入图片描述
如果不指定字段然后使用–dump则将指定的表中所有的的内容都打印出来
如果不指定字段使用–dump-all将会把此数据库中所有表的内容打印出来

Medium级别

打开medium级别时发现只有一个单选框限制了我们的输入。
可以通过抓包然后继续使用-r的参数对其进行测试
在这里插入图片描述
右键send to repeater
然后对包的内容修改查看页面回显
在这里插入图片描述
在这里插入图片描述
经过测试发现,存在数字型注入
然后将包进行保存,通过sqlmap进行测试
这里我将包命名为medium
在这里插入图片描述
同样可以测出sql注入,漏洞利用同上

<?php

if( isset( $_POST[ 'Submit' ] ) ) {
    // Get input
    $id = $_POST[ 'id' ];
    $id = mysql_real_escape_string( $id );

    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
    $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

    // Get results
    $num = mysql_numrows( $result );
    $i   = 0;
    while( $i < $num ) {
        // Display values
        $first = mysql_result( $result, $i, "first_name" );
        $last  = mysql_result( $result, $i, "last_name" );

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

        // Increase loop count
        $i++;
    }

    //mysql_close();
}

?> 

首先参数只接收POST提交的数据
其次对$id做了一层过滤。
mysql_real_escape_string( $id );
函数对字符串SQL语句中的特殊字符(\、’、")进行了转义mysql_real_escape_string()函数
当手工注入查数据库中的表时,需要语句union select 1,table_name from information_schema.tables where table_schema='dvwa'此时由于函数过滤单引号可以将dvwa进行十六进制编码绕过

union select 1,table_name from information_schema.tables where table_schema=0x64767761

或者通过database()函数进行绕过

union select 1,table_name from information_schema.tables where table_schema=database()

high级别

high级别的设置了另外的页面用来传递数值,后台通过session获取输入的值。查询提交页面与查询结果显示页面不是同一个,sqlmap无法通过页面回显来判断。所以此级别只能通过手工闭合前面的单引号注释后边的limit 1进行注入。
在这里插入图片描述
limit字句的作用:
limit可以给定两个整数的参数,如
select * from class limit 2,5; 含义为从class表中的第三行取到第七行数据
select * from class limit 2,2;含义为从class表中的第三行取到第四行数据
在这里插入图片描述
当只给定一个参数时如:
select * from class limit 1; 含义为只允许取出几行数据
在这里插入图片描述
此处只允许取出1行的数据,进行了限制,所以当输入1’ or 1=1’时会报错,在数据库中测试即使加上了or1=1的恒为真条件也被limit限制只输出一行的数据
在这里插入图片描述

1' union select user,password from users --

在这里插入图片描述

五、SQL injection(Blind)

Low级别

输入数字只回显是否存在,依旧通过之前的方法进行手工测试
输入1 and 1=1 和输入1 and 1=2 返回同样的结果说明不存在数字型注入
输入1’ and 1=1 – 返回存在
输入1’ and 1=2 – 返回不存在
说明存在字符型注入
然后将URL复制到sqlmap中指定cookie或者抓包-r指定数据包进行测试
这里我通过抓包命名为blind然后通过-r进行测试
在这里插入图片描述
显示存在基于布尔和基于时间的盲注,利用同之前的方法

medium级别

同sql injection中的方法

high级别

  1. 打开页面,输入数字开启代理burp suite抓包
  2. 将输入参数页面抓到的包中的内容复制到sqlmap --data中
    在这里插入图片描述
    forward此包,然后将发送后台查询抓到的包中的cookie复制到sqlmap中的–cookie中,并复制URL到sqlmap中的-u中
    在这里插入图片描述
    在这里插入图片描述
    –flush-session为清除之前的缓存然后测试(防止之前测出的结果的影响)
    在这里插入图片描述
    最后的结果显示未测出,此时将–level的值改为2继续进行测试
    在这里插入图片描述
    在这里插入图片描述
    最后结果显示是在cookie中存在注入。这也是由于提升level之后,会加入对cookie注入的测试。
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值