1.什么是盲注?
盲注就是在sql注入过程中,sql语句执行的选择后,报错的数据不能回显到前端页面(后台使用了错误消息屏蔽方法屏蔽了报错)。在无法通过返回的信息进行sql注入时,采用一些方法来判断表名长度、列名长度等数据后来爆破出数据库数据的的这个过程称为盲注。
2.boolean盲注的案例演示
基于boolean盲注主要表现:
1.没有报错信息
2.不管是正确的输入,还是错误的输入,都只显示两种情况(我们可以认为是0或者1)
3.在正确的输入下,输入and 1=1/and 1=2发现可以判断
到pikachu平台下boolean盲注,按照之前的思路输入一个payload vince' or 1=1#
,但这样返回的数据并不能判断是否存在sql注入。
采用sql语句中and的方法,返回正确或错误来构造,按照之前的思路构造一个SQL拼接:
vince' and extractvalue(0,concat(0x7e,version()))#
输入后根据返回的信息判断之前的思路不再适用。
来到mysql来演示获取数据的逻辑。
输入语句select ascii(substr(database(),1,1))>xx;
通过对比ascii码的长度,判断出数据库表名的第一个字符。
那么通过这个方法,虽然只能通过判断单个字符,我们同样可以使用length来判断表名的长度,判断出长度后就能多次输入payload来爆破出每一个表名的字符。输入语句:select length(database())<xx;
判断表名长度为7.
回到pikachu平台按照之前的逻辑,我们构造语句,如果返回1,那么就会爆出选择的信息,返回0,就会返回 您输入的username不存在! 。按照之前逻辑,输入sql语句: vince' and ascii(substr(database(),1,1))=112#
,通过这个方法,就能得到后台数据库的名称的第一个字符的ascii码。同之前的办法,我们也可以获得information_schema.tables里的数据。但在实际操作中通常不会使用手动盲注的办法,可以使用sqlmap等工具来增加盲注的效率。
3.base on time盲注的案例演示
到base on time盲注下,输入上个演示中设置好的payload vince' and ascii(substr(database(),1,1))=112#
,返回的信息发现不存在注入点。那这样就不能进行注入了?但其实可以通过后端的执行时间来进行注入。这里会用到的payload :vince' and sleep(x)#
打开web控制台,在网络模块下点击重新载入,再设置payload来进行测试,输入payload :vince' and sleep(10)#
,找到这个耗时11075ms,大约10秒的get请求,判断后台将输入sleep(10)这个函数执行了,那么这个地方就存在sql注入的漏洞。
基于时间的延迟,构造一个拼接语句: vince' and if ((substr(database(),1,1)='(猜测点)',sleep(10),null#
,输入后,如果猜测真确,那么就会响应1秒,如果错误会立刻返回错误。输入:vince' and if ((substr(database(),1,1)='p',sleep(10),null#
,再web控制台下,判断出database的表名的一个字符为p。通过这个办法我们就能逐步向下获取数据。