sql-labs靶场基于时间的注入

sql-labs靶场基于时间的注入_第1张图片

sql-labs靶场基于时间的注入_第2张图片

尝试直接让id=1试一试   右下角显示的执行时间为2秒钟,而我们让他延迟的时间是五秒钟,很显然我们输入的语句没有成功注入,所以我们得在1后面加上字符使其闭合sql-labs靶场基于时间的注入_第3张图片

 执行时间是七秒钟,七秒钟减去两秒钟正好是我们设置的五秒钟,语句是正确的,显然可以使用单引号闭合

 知道了if()函数的使用方法,你不妨自己尝试一下构造语句先来判断当前数据库名字符长度sql-labs靶场基于时间的注入_第4张图片

?id=1' and if((length(database())>7),sleep(5),1)--+

 你成功了吗,这句sql语句的意思即如果当前数据库名长度大于7,则延迟执行5秒,而这个1并没有什么作用,只是因为if()函数的使用格式需要在这放一个数值,所以改成任何数字都可以sql-labs靶场基于时间的注入_第5张图片

确定当前数据库名的长度为8, 接下来开始猜解当前数据库名sql-labs靶场基于时间的注入_第6张图片

 第一个字母的ASCII值大于a的ASCII值,OK,继续sql-labs靶场基于时间的注入_第7张图片

 当前数据库名的第一个字母是s,这个时候我们可以凭经验直接猜全名,如果和我们猜到都不一样当然还得一个一个的继续猜sql-labs靶场基于时间的注入_第8张图片

 猜对了,是security,接下来猜其他的数据库名(假设我们有这个需要),自己构造一下吧

?id=1' and if((substr((select schema_name from information_schema.schemata limit 0,1),1,1)>'a'),sleep(5),1)--+ 

sql-labs靶场基于时间的注入_第9张图片

 慢慢猜不着急sql-labs靶场基于时间的注入_第10张图片

猜半天搞出来个in   不用想了,直接猜他就是information_schema sql-labs靶场基于时间的注入_第11张图片

果然如此,接下来将limit 0,1换成limit  1,1就可以继续猜第二个数据库名了(有这个需要的话) 

不管了,接下来获取一下表名sql-labs靶场基于时间的注入_第12张图片

 不要急躁,先猜长度,再猜名字,不着急,慢慢来sql-labs靶场基于时间的注入_第13张图片

 长度为6,不用想,肯定是emails

?id=1' and if((substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,6)='emails'),sleep(5),1)--+

果然如此,接下来继续猜sql-labs靶场基于时间的注入_第14张图片

OK,猜到很有用的表users了,接下来猜字段名sql-labs靶场基于时间的注入_第15张图片

 长度是2,那应该是id了,继续sql-labs靶场基于时间的注入_第16张图片

 第二个字段长度是8,不是username就是password,冲啊sql-labs靶场基于时间的注入_第17张图片

 猜对了,那第三字段盲猜一下是password

?id=1' and if((substr((select column_name from information_schema.columns where table_name='users' limit 2,1),1,8)='password'),sleep(5),1)--+

sql-labs靶场基于时间的注入_第18张图片

 没毛病,接下来获取username和password两个字段里面的内容sql-labs靶场基于时间的注入_第19张图片

 先猜长度再猜具体内容,胜利近在咫尺!sql-labs靶场基于时间的注入_第20张图片

 OK,确定是dumbsql-labs靶场基于时间的注入_第21张图片

 密码这边第一个也是dumb 

到这里对if()函数,sleep()函数的学习勉强到位了

 sql-labs靶场基于时间的注入_第22张图片

 尝试学习一下benchmark()函数的使用,你可能有点疑惑,这个比单纯的使用sleep()函数还要麻烦,为什么要使用这个函数呢?呵呵,这个我也不清楚,但是我觉得会有一种情况benchmark()函数能用的上,比如说当if()不能使用的时候,这里简单介绍一下这种情况下我们怎样去使用benchmark()函数吧sql-labs靶场基于时间的注入_第23张图片

 security的长度是8,减去7就是1,会返回sleep(5)执行一次的时间,大概就是7s(多出来的2s不用管,因为语句没有执行的页面返回时间就是2s)

语句成功执行的页面返回时间-语句未执行的页面返回时间=你设置的延迟时间

假如我们不知道当前数据库名长度怎么办呢,这个不难,就是有点费时sql-labs靶场基于时间的注入_第24张图片

 看到了吧42s  那么长度大概就是8   (42-2)/5=8   直接得出来长度了都,你还敢说比用if()麻烦吗

ps:有亿点点费时,搞得不好你自己的网站先崩,要是实战就更惨了,注入给人家网站注崩了

你可能又要说了,那你为什么不把sleep()设置的延迟时间短一点呢,比如就设1s  那就试一试sql-labs靶场基于时间的注入_第25张图片

你说的没错,网络稳定的情况下这是一个好办法,但是网络不稳定的情况下,设置的延迟时间越短那么正确度就越低,能明白我意思吧sql-labs靶场基于时间的注入_第26张图片 让我们猜的字母转化为ASCII值再减去某个数,根据页面返回时间就能确定我们猜的字母具体是哪个(网络稳定的情况下),这里看到sleep(5)执行了一次,那么当前数据库名的第一个字母的ASCII值就是115,那就是s     (这里附上一个简单的大小写字母ASCII值对照表)sql-labs靶场基于时间的注入_第27张图片

 sql-labs靶场基于时间的注入_第28张图片

第一个表名长度是6(注意这里是sleep(1))sql-labs靶场基于时间的注入_第29张图片 第二个表名长度是8

.。。。。。。。。。。。。。。。。。。。。。。。(省略的猜解过程)sql-labs靶场基于时间的注入_第30张图片

?id=1' and benchmark((ascii(substr((select password from users limit 0,1),4,4))-97),sleep(5))--+

  password字段的第一个数据的最后一位的ASCII值是98   那就是b  

综合省略的过程中猜解的数据,我们已经得到了一个账号和一个密码即dumb和dumb

关于benchmark()函数的简单使用到此为止,谢谢观看

你可能感兴趣的:(sqli-labs靶场练习,sql,mysql,数据库,网络安全)