Less 9 GET - Blind - Time based. - Single Quotes
从题目来看的话,这一关是get方式的基于时间的单引号盲注。
打开链接构造参数访问看看
先添加单引号测试
页面显示正常,那么猜测可能就是双引号包含的。用双引号试试
依然显示正常。这下之前的基于报错和基于布尔的注入很明显就失效了。那么就只能用基于时间的盲注了。
实际上时间盲注是比较隐蔽的一种sql注入。只有当在页面的显示上没有报错信息也观察不到任何异常时可以考虑时间盲注。我们应该知道无论如何前端向服务器请求数据时,都必须等待数据库将数据返回,所以中间肯定是会有时间消耗的。基于时间的盲注就是利用这个时间的异常来注入。
时间盲注最常用到的函数就是sleep()。因为题目已经提示说是单引号了,所以这里先用sleep()函数测试一下
http://www.bj.com/sqli-labs/Less-9/index.php?id=1' and sleep(10) --+
可以看到箭头所指的地方一直在转圈说明在等待页面加载,这也表明sleep()函数确实是带入数据库执行了。再来对比一下正常访问和测试访问的响应时间差异
从响应时间来看也可以说明sleep()函数是执行成功了。
接下来的测试就跟布尔盲注没太大区别了,只不过是后面加一个时间函数而已。
先判断当前用户名的长度
http://www.bj.com/sqli-labs/Less-9/index.php?id=1' and if(( select length(user())>10),sleep(10),1) --+
通过响应时间来看,sleep()函数执行了,也就是说当前用户名的长度确实是大于10的。
再判断当前用户名的首字母是否是r
http://www.bj.com/sqli-labs/Less-9/index.php?id=1' and if(substr(user(),1,1)='r',sleep(10),1) --+
从响应时间判断用户名首字母确实是r。
之后的过程就是一步步手工注入出数据库的数据了。
这里需要注意的是在基于时间的盲注中不仅可以用sleep()函数还可以用benchmark()函数。
sleep(n) # 可以让数据库等待n秒再执行
benchmark(count,expr) #重复count次执行表达式expr,返回结果值总是0
Less 10 GET - Blind - Time based - double quotes
从题目来看只不过是将上一关的单引号换成了双引号
这里先用单引号测试
可以看到前面用单引号去闭合,后面用--+注释。但是响应时间是正常的,说明参数外部不是用单引号包裹的,是直接将1' and sleep(10) --+ 当做参数值带入数据库执行了。这个情况在之前几关中已经提及了,数据库只会将字符串最前面的数字1提取执行,所以后面的sleep()函数并没有执行,响应时间也就不会受到影响。
再用双引号测试
从响应的时间来看,可以很明显的看到sleep()函数成功执行了。也就是说双引号把前面的语句闭合了,--+也将后面的语句注释掉了。因为这样才使得sleep()函数成功执行。
后面的注入过程就是按部就班一步步猜解数据库信息了,这里就不再赘述。