一、引言
在我们的注入语句被带入数据库查询但却什么都没有返回的情况我们该怎么办?
例如应用程序返回到一个"通用的"的页面,或者重定向一个通用页面(可能为网站首页)。这时,我们之前学习的SQL注入的办法就无法使用了。这种情况我们称之为无回显,如果页面有信息显示,我们称之为有回显。回显状态的页面就用之前学的SQL注入的方式,无回显的这种我们就可以采用盲注的手段。
二、有、无回显
有回显
pikachu靶场
无回显
是指当攻击者控制目标系统执行命令时,目标并不会直接返回结果,造成攻击者无法知晓自己的攻击行为是否成功。
无回显的两种情况
①有防护,注入失败:过滤掉攻击语句,再去数据库查询
②无防护,注入成功:对响应数据进行了加工,只显示一条 ,若数据库查询出来的数据超过了一条,就报错,说查不到数据或404。此情况可使用盲注
三、盲注
盲注,即在SOL注入过程中,SOL语句执行选择后,选择的数据不能回显到前端,我们需要使用一些特殊的方法进行判断或尝试,这个过程称为盲注。
SQL盲注分为两大类:基于布尔型SQL盲注、基于时间型SQL盲注。
四、Boolian布尔型盲注
通过一种比较手段来得到一个真假值(布尔值,true 1真、false 0假),根据真假值来断定数据是什么样子的。
手动爆破
布尔型盲注入查询长度
要查询当前库名,首先确定要查询的数据库的长度,再通过截取字符进行对比
vince' and length(database())>=4#
代码中的4需要我们从1开始试
可查询出的界面
不可查询出的界面
综上,可知数据库长度为4
布尔型盲注入获取数据库名
数据库常用字符如下:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. @_
将这些字符和数据库中的每一个字符进行比较得到最终的数据库名
获取数据库第一个字符,输入
vince' and if(substring(database(),1,1)='p',1,0)
(这里p是爆破得到的)
一个一个爆破比较麻烦,建议用bp爆破
获取表
select table_name from information_schema.tables where table_schema=database() limit 0,1
获取列名
select column_name from information_schema.columns where table_name='users' limit 1,1
五、base on time时间型盲注
vince' and sleep(x)#
基于时间的延迟,构造一个拼接语句:
'vince'and if(substr(database(),1,1)='X'(猜测点),sleep(10),nu11#'
输入后,如果猜测正确,那么就会响应10秒,如果错误会立刻返回错误。
时间型盲注常用函数:sleep(x)、benchmark.如果sleep被防御掉了,可用另一个。或变换sElect、benCHmark等的大小写。
以上内容均为自己学习理解所得,如有错误,欢迎大家评论指正。