基于时间的注入
0x0 环境
关卡 sqli-labs/less-9
数据库 mysql-5.5.3
0x1 if语句
IF(expr1,expr2,expr3)
expr1为0,返回expr3
expr1为1,返回expr2
注:这里仅测试expr1为0与1的情况,因为ascii()=num只返回0或1
注:未测试过其他版本不确定不同版本是否会存在误差
查看下我正在使用的数据库名
获取数据库首字母
ascii编码
验证真返回1,否返回0,用于if判断
0x2 sql语句解析
select * from tables where id=1 and if(ascii(substr(database(),1,1))=116,sleep(1),1)
我的数据库为test,其首字母为t,ascii编码后为116
ascii(t)=116时,if语句为 if(1,sleep(1),1) 即返回sleep(1)函数,因此查询数据的时候会休眠,以达到延迟返回数据的效果
注:
在使用and进行基于时间的注入,如果and前的条件不成立是不会执行if()里面的语句的
可以尝试使用or 进行注入测试
select * from tables where id=1 or if(ascii(substr(database(),1,1))=116,sleep(1),1)
or的延迟时间会更长一点
if()的返回值建议使用0,
where id =1 or 1 会直接进行全表查询
如果数据量过大也可能会出现延迟的假象
对比
and
and关键字前面条件不成立无法执行if()
or
or关键字前面条件不管成立不成立都会执行if()
if()返回数值只能返回0,否则会全表查询,
if()返回sleep()函数,休眠时间会更长 ~~ 我也不理解为什么会这样
建议:
还是使用and来注入吧 emmmm
0x3 注入测试
测试
?id=1
?id=1 and if(ascii(substr(database(),1,1))=115,sleep(1),0)
emmm
加个注释再次尝试
ok,这里对id参数进行调整尝试,怀疑是字符类型
?id=1’ and if(ascii(substr(database(),1,1))=115,sleep(1),0) -- -
时间调整的长一点再来一遍
木的问题
顺便试了一下or 这时间过于真实,,,还是用and吧
0x4 or and 对比
下面是or并使用不存在的ID进行注入的,这里or时间会长一点但还是有效果的
ID不存在时,and就显得无能为力了