盲注同于union select查询注入,盲注只能得到数据库回显的正确和错误,利用返回的正确和错误一个一个判断。

LOW

审计源码

<?php

if( isset( $_GET[ 'Submit' ] ) ) {
// 获取 id
$id = $_GET[ 'id' ];
// 定义存在为 false
$exists = false;
// 判断数据库类型
switch ($_DVWA['SQLI_DB']) {
// MYSQL数据库
case MYSQL:
// 数据库查询
$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
// 定义存在还是 false
$exists = false;
// 判断数据库查询是否有结果
if ($result !== false) {
try {
// 获取返回结果中的函数
$exists = (mysqli_num_rows( $result ) > 0);
} catch(Exception $e) {
// 没有结果定义为 false
$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) {
// 查询成功
echo '<pre>User ID exists in the database.</pre>';
} else {
// 找不到用户
header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' ); // 插叙失败
echo '<pre>User ID is MISSING from the database.</pre>';
} } ?>

根据查询结果,只返回了查询正确和错误两种结果,对传入的id没有进行过滤,所以可以直接进行注入

通过观察在$id左右加入了'',所以这是一个字符型的注入

SQL盲注非常的繁琐

普通的注入为发现注入点 -> 判断注入类型 -> 获取当前数据库的名 -> 获取当前数据库中表明 -> 获取表中的字段名 -> 获取字段内容

盲注

1.判断注入类型 -> 2.获取当前数据库名:获取当前数据库的长度,获取当前数据库的第一个字符的ascii码值,获取当前数据库的第二个字符的ascii码值........ -> 3.获取当前数据库中的表名: 获取当前数据库中表的数量,获取第一个表名长度,获取第一个表名的第一个字符的ascii码值........ -> 4.获取第一个表中的字段名: 获取第一个表中字段的数量,获取第一个字段的长度,获第一个字段的第一个字符的ascii码值........ -> 5.依次类推

这里的绕过方法为1'#,详细步骤可以到另一篇博客

Less-5 和 Less-6 SQL盲注

这里也可以写一个sql盲注的脚本,后续补出来

Medium

审计源码

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
// 获取 id
$id = $_POST[ 'id' ];
$exists = false;
// 判断数据库类型
switch ($_DVWA['SQLI_DB']) {
// mysql数据库
case MYSQL:
// mysqli_real_escape_string 传入 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)) ? "" : "")); // 执行SQL语句
$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;
// 判断是否成功执行 SQl 语句
if ($result !== false) {
try {
// 获取执行 SQL 返回的行数
$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) {
// 返回结果
echo '<pre>User ID exists in the database.</pre>';
} else {
// 没有返回结果
echo '<pre>User ID is MISSING from the database.</pre>';
}
} ?>

使用POST方式传参id并使用mysqli_real_escape_string进行了实例化操作,但是这题是数字型的SQL注入,所对我们注入没什么影响

不用使用闭合,使用hackbar直接进行传参

payload:Submit=Submit&id=1 and length(database()) > 0 %23

判断当前数据库的长度是否大于 0



可以看到返回正确,这样一步结果就出来了

High

审计源码

<?php

if( isset( $_COOKIE[ 'id' ] ) ) {
// 获取传入的 id
$id = $_COOKIE[ 'id' ];
$exists = false; // 判断数据库类型
switch ($_DVWA['SQLI_DB']) {
case MYSQL:
// 进行数据库查询,后面的和Low基本一致
$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>';
}
} ?>

通过观察High的源码,除了获取id的方式和LOW级别不一样,其余都类似

使用1'#依然可以绕过

Impossible

审计源码

<?php

if( isset( $_GET[ 'Submit' ] ) ) {
// 检查user_token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
$exists = false; // 获取传入的id
$id = $_GET[ 'id' ]; // 查看 id 是否为数字
if(is_numeric( $id )) {
// 将 id 转换为字符串
$id = intval ($id);
// 判断数据库类型
switch ($_DVWA['SQLI_DB']) {
// mysql
case MYSQL:
// 使用 PDO 方法进行sql查询
$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 results
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>';
}
} // Generate Anti-CSRF token
generateSessionToken(); ?>

后面大概的我也没有看,首先判断是否为数字,然后类型转换为字符串类型,之后又使用PDO方法方法SQL注入,和普通的SQL注入一样的防御方法

DVWA-SQL Injection (Bind) SQL盲注的更多相关文章

  1. DVWA全级别之SQL Injection(SQL注入)

    DVWA全级别之SQL Injection(注入)   DVWA简介 DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web ...

  2. SQL Injection(SQL注入漏洞)

    审计前准备: 1.安�php程序(推荐phpStudy) 2.高亮编辑器(推荐 Sublimetext Notepad++) 3.新建一个文本,复制以下变量,这些变量是审计中需要在源码中寻找的 ### ...

  3. Fortify漏洞之Sql Injection(sql注入)

    公司最近启用了Fortify扫描项目代码,报出较多的漏洞,安排了本人进行修复,近段时间将对修复的过程和一些修复的漏洞总结整理于此! 本篇先对Fortify做个简单的认识,同时总结一下sql注入的漏洞! ...

  4. 【DVWA】SQL Injection(SQL 注入)通关教程

    日期:2019-07-28 20:43:48 更新: 作者:Bay0net 介绍: 0x00.基本信息 关于 mysql 相关的注入,传送门. SQL 注入漏洞之 mysql - Bay0net - ...

  5. SQL基于时间的盲注过程

    0x00 前言 由于要使用到基于时间的盲注,但是我觉得基于时间的盲注其实就是基于布尔的盲注的升级版,所以我想顺便把基于布尔的盲注分析总结了: 首先我觉得基于时间的盲注和基于布尔的盲注的最直观的差别就是 ...

  6. 依托http-headers的 sql注入和时间盲注

    机缘巧合接触了一点关于sql注入的网络安全问题 依托 headers 的 sql 注入 一般来说大家都很清楚用户输入的危险性,通常会对用户表单提交的数据进行过滤(引号转码). 但是如果写过网络爬虫,那 ...

  7. 渗透测试初学者的靶场实战 2--墨者学院SQL注入—报错盲注

    墨者SQL注入-MYSQL数据库实战环境 实践步骤 1. 决断注入点 输入单引号,提示错误信息: 输入and 1=1 返回页面正常: 输入 and 1=2 返回正常 输入-1,返回异常: 2. 带入s ...

  8. SQL注入学习-Dnslog盲注

    1.基础知识 1.DNS DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 ...

  9. SQL注入之延迟盲注

    延迟盲注 你不知道你输入的数据在sql被执行后是否是正确或错误的.你只知道有数据. 利用原理 借助if语句,如果正确就sleep(5),延迟5秒返回数据.通过数据返回的时间大小判断自己的语句是否正确执 ...

  10. 网络攻击技术:SQL Injection(sql注入)

    网络攻击技术开篇——SQL Injection   1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码 ...

随机推荐

  1. Android 将函数放到主线程运行

    有时候,app会检测加密函数是否在主线程运行,为了逃避这种检测,要将函数放到主线程运行 Class<?> aClass = RposedHelpers.findClass("co ...

  2. ubuntu20关机慢: A stop job is running for Snappy daemon

    Ubuntu  20 关机超时 问题 A stop job is running for Snappy daemon [1 min 30s ] 解决办法 1.修改以下配置文件超时时间,如下: sudo ...

  3. php excel导出列超过26个字母处理

    /** * String from columnindex * * @param int $pColumnIndex Column index (base 0 !!!) * @return strin ...

  4. ADOConnection调用连接窗口

    uses   AdoConEd; 使用函数 1.EditConnectionString(ADOConnection); 2.PromptDataSource

  5. UR #3 核聚变反应强度( gcd )

    tags: -分解质因数 , gcd 题目大意 给定\(n\)个数,求\(a_1\)与\(a_i\)次小公约数 分析 易知次小公约数是\(\gcd\)的因数,于是用\(\gcd\)除去它的最小质因子即 ...

  6. infoq上看视频1(持续更新)

    打破工程师思维 http://www.infoq.com/cn/presentations/break-engineer-thinking 百姓网人: 从技术走向产品的那点儿事 http://www. ...

  7. Leetcode 199

    199. Binary Tree Right Side View Given the root of a binary tree, imagine yourself standing on the r ...

  8. Linux磁盘相关工具 -- iostat

    iostat主要用于监控系统设备的IO负载情况,根据这个可以看出当前系统的写入量和读取量,CPU负载和磁盘负载. iostat主要用于输出磁盘IO和CPU统计信息. 1. iostat用法: iost ...

  9. SQL五十题记录 1-2

    前言: 创建以下四张表:①:课程表 ②:成绩表 ③:学生表 ④:教师表 1.查询课程编号为""01""的课程比"02"的课程成绩高的所有学生 ...

  10. transition实现元素动画平移

    效果: 将灰色背景区域移除屏幕,并实现动画效果 代码: 使用transition属性可定义平移的时间,巧用calc得出非确定高度元素的平移距离