盲注同于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. CentOS系统 / 目录下每个子目录的作用

    Text. 1./bin 该目录存放root和交互式登录用户使用的二进制可执行文件,如cat,cp,date,rm等. 2./boot 该目录主要存放系统启动所需要的相关文件,如何内核文件vmlinu ...

  2. CentOS7 修改root密码

    能登录系统修改root密码 passwd root(可以是其他什么用户) 输入新密码(两次)   忘记root密码不能进入系统,修改root密码   1.开机进入grub界面按e进入单用户编辑模式 2 ...

  3. G6-Editor 编辑器入门使用教程

    一.前言 G6-Editor 是 AntV 官方提供的.专注于图可视化编辑器的类库,也是市面上完成度较高的图可视化编辑器.然而令人诟病的是其文档对新手极度不友好,我一度怀疑此文档只有他们自己开发人员才 ...

  4. holiday06-英语语法-语序和五种基本句式

    第六天 英语五种基本句式: 基本句式一:S V (主+谓) 基本句式二:S V P (主+系+表) 基本句式三:S V O (主+谓+宾) 基本句式四:S V o O(主+谓+间宾+直宾) 基本句式五 ...

  5. 从redis中取出数据并转成java对象

    1.//数据存入redis中 redisTemplate.opsForValue().set(loginame, JSON.toJSONString(users),1000,TimeUnit.SECO ...

  6. Ajax的两种写法

    先写一串数据 1 { 2 "status": 200, 3 "data": { 4 "name": "web211001" ...

  7. 微信小程序 的 openid,appid,unionid

    openid: 用户在同一个小程序下的唯一表示,即同一个用户在不同的小程序下的openid是不同的 appid 小程序唯一凭证,即 AppID,每个小程序都有自己的一个appid unionid 如果 ...

  8. 基于Face-Recognition的计算机人脸识别安全认证程序

    20202411 2020-2021-2 <Python程序设计>实验四报告 基于Face-Recognition的计算机人脸识别安全认证程序 课程:<Python程序设计> ...

  9. 1903021126-申文骏 实验一 19信计java-Markdown排版

    项目 内容 课程班级博客链接 19级信计班 作业要求链接 实验一 课程学习目标 大致学会Markdown排版 任务1:在博客园平台注册个人博客账号和加入班级博客 注册了博客园的个人账号,提交了博客申请 ...

  10. python起航之路 Day1

    一.Python安装 windows 1.下载安装包 https://www.python.org/downloads/2.安装 默认安装路径:C:\python273.配置环境变量 [右键计算机]- ...