【17】WEB安全学习----MySQL注入-2(非盲注注入步骤)

目录

一、MySQL联合查询注入常规步骤-非盲注

1、数据库介绍

2、PHP代码介绍

3、SQL注入过程

判断注入点

判断MySQL版本

猜字段数

进行UNION联合查询

二、猜解注入

猜解表名

猜解字段名

猜解字段记录长度

逐字猜解字段值


一、MySQL联合查询注入常规步骤-非盲注

1、数据库介绍

当前数据库中有2个数据库:user数据库中有users表flag数据库中有flag_table表。需要通过SQL注入得到flag数据库中的flag值。

2、PHP代码介绍

<?php
    header('content-type:text/html;charset=utf-8');
    @$id=$_GET['id'];  //传参
    if(!isset($id)){
        die('请传入GET方法id参数值');
    }
    $mysqli=new mysqli();
    $mysqli->connect('localhost','root','root');
    if($mysqli->connect_errno){
        die('连接数据库失败:'.$mysqli->connect_error);
    }
    $mysqli->select_db('user');
    if($mysqli->errno){
        die('打开数据库失败:'.$mysqli->error);
    }
    $mysqli->set_charset('utf8');
    $sql="SELECT username,passwd FROM users WHERE id={$id}";  //动态构造SQL语句
    $result=$mysqli->query($sql);
    if(!$result){
        die('执行SQL语句失败:'.$mysqli->error);  //SQL语句执行错误会显示出来,说明为报错注入
    }else if($result->num_rows==0){
        die('查询结果为空');
    }else {
        $array1=$result->fetch_all(MYSQLI_ASSOC);
        foreach($array1 as $key=>$value){
            echo '用户名:'.$value['username'].'<br />'.'密码:'.$value['passwd'].'<br />';
        }

    }

执行效果:

3、SQL注入过程

判断注入点-判断数据库版本-判断字段数-进行UNION联合查询

关键代码:$sql="SELECT username,passwd FROM users WHERE id={$id}"; 

判断注入点

可看到,传入的是整数1,MySQL支持运算符操作,那么传入运算符操作,如果生效则证明SQL语句运行了

id=2的情况下:

id=3-1的情况下:和id=2结果相同,说明进行了运算操作

id=1+1的情况下:和id=2结果相同,说明进行了运算操作。注意:+号在MySQL中表示空格,所以这里要进行url编码为%2B

通过在id=1后面加入单引号或双引号,使拼接的SQL语句出错

$sql="SELECT username,passwd FROM users WHERE id=1‘";

$sql="SELECT username,passwd FROM users WHERE id=1“";

进行逻辑运算,1 and 1为真

1 and 0为假,所以查询结果为空

WHERE id=1 or 1相当于WHERE 1,所以显示出表中全部数据

判断MySQL版本

通过判断MySQL数据库版本,如果是>=5版本的,可以直接查询information_schema表,如果低于5版本则只能猜解。现目前低于MySQL5.0的站点很少,但掌握该技术是有必要的。

在注释的开头部分添加一个感叹号并在后面更上数据库版本编号,那么该注释将被解析成代码,只要安装的数据库版本高于或等于注释中包含的版本,代码就会被执行。

执行了2-1操作,说明数据库版本大于或等于4.1版本

未执行了2-1操作,说明数据库版本小于5.1

执行了2-1操作,说明数据库版本为5版本

猜字段数

知道了注入点及数据库版本号,MySQL支持UNION联合查询,可通过联合查询查询其他数据库中的信息,得到我们想要的结果。但在进行联合查询前,需要知道现在表查询的字段数,因为UNION联合查询需要字段数相同及数据类型兼容才可以。

可以通过ORDER BY 指定列数进行排序,如果超过了列数,就会进行报错,则就知道了当前查询SQL中的字段数。

经过测试,字段数为2,查看当前SQL语句得知,查询的字段数确实为2个。

$sql="SELECT username,passwd FROM users WHERE id={$id}"; 

进行UNION联合查询

知道了当前查询的字段数,数据类型为了兼容设置为NULL。

可看到,联合查询生效了。

MySQL支持系统函数及系统变量,可替换NULL进行查询数据库信息

可以通过查询information_schema数据库得到全部数据库名、表名、字段名,查询我们想要的数据。

得到数据库名:

得到数据库下表名:

得到字段名:

知道了数据库名、表名、字段名,直接查询

以上就是MySQL联合查询注入常规操作,其他变换也是在此步骤上进行变换。

二、猜解注入

当不支持UNION联合查询时,可使用猜解数据库名、表名、字段名来进行注入。

猜解表名

猜解字段名

猜解字段记录长度

可得知,username字段第一行记录值长度为4

逐字猜解字段值

后面会学到二分搜索法,可通过二分搜索法加快猜解速度。

猜你喜欢

转载自blog.csdn.net/a15803617402/article/details/82779185
今日推荐