【18】WEB安全学习----MySQL注入-3(非盲注注入例子)

通过上一章,学习了MySQL注入的步骤,这一章进行练习。

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} limit 0,1";  //添加了limit语句
    $result=$mysqli->query($sql);
    if(!$result){
        die('执行SQL语句失败:'.$mysqli->error);
    }else if($result->num_rows==0){
        die('查询结果为空');
    }else {
        $array1=$result->fetch_all(MYSQLI_ASSOC);
        //无论有多少条记录,只显示第一行记录
        echo '用户名:'.$array1[0]['username'].'<br />'.'密码:'.$array1[0]['passwd'].'<br />';
    }

判断注入点

进行了运算操作,%23是mysql注释符#的编码,因为在实际测试中,你并不知道SQL语句后面还写了什么,为了方便判断,直接注释后面的语句。

进行了逻辑运算

进行了数学函数运算

猜字段长度

可得知,当前查询语句为2个字段

进行联合查询

这里要注意一点,因为代码设置了只能显示一行记录,为了显示union后面的记录,故要把前面的查询记录设置为空,所以这里ID=-1

注意:因为只能显示一条记录,故这里用limit语句控制记录行数。

闭合SQL语句

在其它情况中,关键是如何拼接SQL语句的,在SQL注入中就要闭合相关语句,可通过报错信息查看拼接信息。如果不显示报错信息,则只有FUZZ了。

 $sql="SELECT username,passwd FROM users WHERE id={$id} limit 0,1";
 $sql="SELECT username,passwd FROM users WHERE id='{$id}' limit 0,1";
 $sql="SELECT username,passwd FROM users WHERE id=({$id}) limit 0,1";
 $sql="SELECT username,passwd FROM users WHERE id='({$id})' limit 0,1";
......

猜你喜欢

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