盲注,与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示页面上获取执行结果,甚至连注入语句是否执行都无从得知。
盲注分为基于布尔的盲注、基于时间的盲注以及基于报错的盲注。
1.判断是否存在注入,注入是字符型还是数字型
2.猜解当前数据库名
3.猜解数据库中的表名
4.猜解表中的字段名
5.猜解数据
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 = mysql_query( $getid ); // Removed 'or die' to suppress mysql errors
// Get results
$num = @mysql_numrows( $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>';
}
mysql_close();
}
?>
从源代码可以看出并没有什么过滤,而且返回来的话语也没有多大的提示。
基于布尔的盲注
1.判断是否存在注入,注入是字符型还是数字型
1.输入1 存在2.输入1' AND 1=1 # 存在
3.输入1' AND 1=2 # 不存在
结合非盲注来判断,感觉就是要证明,这个注入点和数字型还是字符型有关,和谁有关输入一真一假就会有不同的变化。去看dvwa-sql injection
可以看出是字符型注入点。
2.猜解当前数据库名
猜解数据库的名字,我们只能猜数据库的长度先,因为这个注入点只会告诉你对错,不会直接说出数据库的名称的。
当输入1’ and length(database())=4 # 的时候给出正确答案。
那么接下来肯定是猜四个位置上的字母啦,按照判断对错的话岂不是要弄4*26次,这里用了二分法。
形如:1’ and ascii(substr(databse(),1,1))>97 # ...接着就是一系列的排查了,最后得到dvwa
substr(str, pos,