延时注入的原理
适用于,无法回现和无法显示错误页面的场景
利用函数sleep()让服务器休眠,通过休眠时间判断执行的语句对错,从而得到我们想要的信息
我们看到界面,首先在url栏进行GET传参,但是没有任何回显,界面没有变化
" and 1=2 %23
然后使用延时注入,
" and sleep(5) %23
1,判断当前库名的长度
这里我们用到了数据库里的if语句
有点类似于三元运算,条件成立,就执行第二个,条件不成立就执行第三个。
" and if(length(database())=12,sleep(5),1) %23
结果=12时网页睡眠,可以判断当前库名有12个字符
2,猜库名
" and if (ascii(substr(database(),1,1))=107,sleep(5),1) %23
结果=107时网页睡眠,可以判断库名第一个字符对应的ascii码为107 字符为 k
后面的步骤差不多是用if+ascii+subsrt函数来手动注入
接下来就用工具来跑了
原理
跟以往的方法不一样,这里不是看数据包的长度了,因为这里返回的所有数据都是一样的,所以也就所有的数据包的长度也都一样。
但是通过前面我们手动注入时发现,延时注入成功的话,页面会睡眠,然后再回显给你,
那么我们就来看那个数据包,没有回显过来。而是去睡眠去了,通过这样,我们来知道是否延时注入成功。
注意事项。
还有就是,因为我们是通过睡眠的页面来判断是否延时注入成功。那么我们肯定就不能全部一起跑,否则很难看出来。
这里我都是一个一个的爆破点跑的。
" and%20if(ascii(substr(database(),1,1))=107,sleep(20),1) %23
注意要变成url编码哟
把substr函数的起始位置一直手动替换,然后爆破,
最后拼接起来的
数据库名 kanwolongxia
查表语句:
这条查询语句查询出来可能会查询出多个表(多个字符串),
但是substr函数只能处理一个字符串,
所有我们要在后面加上 limit 函数,限制只能输出一个表(一个字符串)
" and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>106,sleep(5),1) -- +
后面的做法跟布尔盲注的思路都是一样的,只是多了个if语句和只能一个一个爆破点的跑。