前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RedTiger 通关学习总结

RedTiger 通关学习总结

作者头像
信安之路
发布2018-08-08 16:22:04
8980
发布2018-08-08 16:22:04
举报
文章被收录于专栏:信安之路信安之路

本文作者:Ph0rse 文章来源:RTIS CTF 雏鹰进阶之路的第一周分享任务中优秀的报告,其他报告请前往知识星球查看

本文涉及的一些文件放在了下面:

https://pan.baidu.com/s/1WY_iDeeNFFi89v7FdVxPIw

学习 SQL 注入有两套必刷题,一个是 sqli-labs,这个已经有了成套的 wp 讲解,在上面的网盘里。

另一个就是这个 RedTiger 了,题目非常地巧妙,每一关对应一个 SQL 知识点,一套下来,能学到很多东西。

唯一美中不足的是,因为题目是在一套环境下,为了防止从第一关的注入点注出第十关的 flag,所以都限制了函数和一些关键字,导致无法使用正常的注入流程来爆出表名、列名,不过题目提示已经说的比较清楚了,稍微动下脑子就能猜到 username、password 这类常用列名。

更妙的一点是,这套题在 wechall 上面也有相应的题目区域,可以在做完题之后在 wechall 上提交 flag 加分。

PS: wechall (https://www.wechall.net/) 是全球型的 ctf 平台,上面有各种题目,可以学到很多知识~

Wechall 在 RedTigher 上的提交分地址:

https://www.wechall.net/14-levels-on-Hackit.html

第一题

送分儿题,根据提示,注入参数为 cats,测试后为数字型注入,orderby 确定字段数,select 确定显示位。根据提示的表名,直接按照常规思路,查询 username 和 password 即可,本来以为需要按照常规流程获取表名,但后面发现过滤地很死,应该是不想让人在第一关获取后面的 flag 吧。

flag: 27cbddc803ecde822d87a7e8639f9315 The password for the next level is: 4_is_not_random

第二题

送分儿题,常规的万能密码绕过

Payload:username=admin&password=‘’or 1=1#

即可

第三题

这道题有点意思~刚开始进去,没有找到注入点,然后点击那两个超链接发现了注入点 usr。

提示说弄出个错误,刚开始还以为是 盲注+base64加密。测试无效后,尝试将点击超链接后的内容 base64 解码,发现是乱码,即这个字符串不是通过 base64 编码而来的。摸索一阵之后想起之前遇到的一道 ctf 题,在传递参数 usr 的时候,传递数组进去。即 usr[]=123;

就产生了报错

访问那个文件,可以拿到加解密字符串的算法;

不过这个时候要注意,算法里用到了伪随机数,但在 win 系统和 linux 系统下即使相同种子,产生的伪随机数也是不同的,导致加密结果也不同,从错误信息中的目录可以看出,题目用的是 linux 的服务器,所以我们要把这个加密脚本放到 ubuntu 下去产生注入语句。

接下来根据题目里的 inc 文件,构造语句即可,有回显,无过滤,万事大吉

代码语言:javascript
复制
?usr=Admin' order by 7%23

' union select 1,2,3,4,5,6,7%23

' union select 1,password,3,4,5,6,7 from level3_users where username=0x41646d696e%23

得到 admin 的密码~

Get password~

其中 password 字段是猜出来的,因为题目对 information_schema 表做了一些限制,无法通过常规方式获取说的列名。

第四题

在 RedTiger 的首页提示了第四关是唯一的盲注,所以这道题思路很清晰。

首先测试 id=1id=0,发现回显不一样,所以这就是基于布尔的盲注了,然后是用 order by 查询字段数:

测出来是两列

https://redtiger.labs.overthewire.org/level4.php?id=-1%20union%20select%201,keyword%20from%20level4_secret%20where%20length(keyword)=21-->+

测出来长度为 21

接下来就是写脚本的事情了,写这个脚本要注意的一点是,访问第四关是要携带前几关的 cookie 的。我刚开始就是卡在了这里,死活注不出来~最后借鉴了哈士奇师傅的脚本,才弄了出来,哈士奇大佬的学习记录:

http://lucifaer.com/index.php/archives/19/

代码写得比我的漂亮多了~

最后 kayword : killstickswithbr1cks!

第五题

这道题测试得很是恼火,它莫名其妙把关键字 admin 过滤了~ 尝试绕过了很长时间,忽然想起来,它是要绕过 login,不一定要以 admin 登录。

题目过滤了 mid/substring/substr,由过滤了逗号,这样的话就没办法盲注了~(至少我没办法了)

所以现在两个输入框中进行一般的 SQL 测试,发现 username 处填写正常语句时总是回显用户不存在,但该处又对单引号敏感。如果不在 username 处引入单引号,后面的 password 无论写什么东西,都回显用户不存在。所以应该就是在 username 中进行绕过,但在注释符测试成功后发现无法使用万能密码绕过。

猜测查询语句中对 username 的验证和对 password 的验证不在一起,根据提示 ‘the password is md5-crypted’ 猜测查询语句是根据用户名查询出数据库里的密码,然后将输入的 password 值进行 md5 加密

然后进行对比。(实战环境一般会加盐之后在加密储存)

union select 1,2,3,4,5,6,7,……,n#测试

测出来总共是两列,之后再测试的时候回显就是 登录失败而不是用户名不存在了,这是个好兆头。

然后我们让注入查询出的数据,与输入的 password 进行 md5 加密后的数据相等即可绕过验证,登录成功。

username='union select md5(1),2#&password=1&login=Login

username='union select 1,md5(2)#&password=2&login=Login

两种 payload 测试后发现第二种是正确的,getflag~

第六题

这道题是大佬提示之后做出来的,一个二次查询的题目

首先根据提示找到了注入点 user,可测试出查询语句是由单引号闭合的,然后根据 order by 发现为 5 个字段。

但之后尝试了 union 查询列名,失败。

直接查询 username 和 password 字段,失败。

尝试报错,发现括号被过滤掉了,失败。

绝望后,通过询问大佬,知道了有二次查询这个东西。即将第一次查询结果中的某一数据,再放入第二次查询中进行查询。

测试的思路如下:

我们现在有以下信息

将已有的信息进行十六进制编码,分别放到后面的注入位上。

// 这里进行十六进制编码是因为,如果直接放到第一个查询语句中,会被认为是一个列名,如果带上双引号,如果第二个查询也是用双引号包裹的就会报错~所以转换为数字,然后前面加上 0x 是最佳选择。

火狐的 hackbar 插件可以进行字符串和十六进制之间的转换。

在放到第二位的时候,出现了正常回显,所以猜测在代码中的查询语句大致为:

代码语言:javascript
复制
$sql = "select 1,username,3,4,5 from level6_users where id=’注入点’";

result1 = mysql_query(sql);

result2 = mysql_fetch_row(result1);

username = result[1];//该数组的第二个

$sql2 = "select 1,username,3,email,5

from level6_users where username="."'".$username."'";

然后根据正常注入流程,注入即可

比如将 ’union select 1,2,3,4,5# 编码后放入语句中的回显结果为

即显示位是 2、4,根据提示从执行表中查询 status 为 1 的 username 和 password,然后将 ' union select1,username,3,password,5 from level6_users where status=1# 编码后得:

登录,get flag~

第七题

在测试注释符的时候发现,没有被过滤,这代表有机会使用该注释,后测试 --%a0(换行符)成功注释,接下来就是常规流程了,直接用 group_concat 将所有的作者名都注出来即可。

关于 group_concat 的用法可以参照:

http://hchmsguo.iteye.com/blog/555543

接下来直接 union 查询,常规流程即可

Payload:

search=10000')union select 1,2,3,(select group_concat(autor) fromlevel7_news)--%a0&dosearch=search%21

第八题

经测试之后发现这是 updata 中的注入,且更新数据后,新的数据会出现在默认输入框中,updata 相关知识,后面的会覆盖掉前面的。

使用单引号可以发现,只有 email 处对单引号敏感,从报错语句中可以看出,icq/age 数据都是在 email 之后更新的,猜测 name 字段是在 email 之前。

所以猜测原 SQL 语句类似为:

update table1 set name='注入点',email='icq',age='$age' where id=1

所以使用 payload:123',name=password,age='

注入语句就会变成

update table1 set name='$name',email='123',name=password,age='',icq='$icq',age='$age' where id=1

后面的更新语句会覆盖前面的更新语句,即 name=password 会覆盖前面的 name=’$name’,所以就把密码给爆了出来。

Cybercyber_vuln

第九题

此处考察的是 insert 注入知识,测试后发现只有最后的留言框存在注入,而页面在插入语句执行成功后会回显插入的数据,

正常的 insert 语句为:

insert into level7_news(name,title,text) values('$name','$title','$text');

$text 是我们可以控制的注入点, 而看下面的语句:

也就是同时注入两行数据。

所以在 text 处构造以下语句之后

Payload:123'),((select group_concat(username) fromlevel9_users),(select group_concat(password) from level9_users),'123 insert into level7_news(name,title,text) values('title','123'),((selectgroup_concat(username) from level9_users),(select group_concat(password) fromlevel9_users),'123');

插入了两行数据,回显为

最后提交的时候记得把注释内容也加上

第十题

拿到题后抓包,发现 login 后面跟着一串 base64 字符,解码得:

a:2:{s:8:"username";s:6:"Monkey";s:8:"password";s:12:"0815password";}

这是一条反序列化的内容,关于反序列化,请移步哈士奇师傅的反序列化总结:

http://bobao.360.cn/learning/detail/4122.html

这时候需要用到一个技巧性的东西:布尔值

当 where 后面的条件语句中的某一个变量为布尔值-“真”的时候,整个语句会变成真,能够取出资源,并且在 if($result) 处验证为真,但取出的是一个空资源,并不会输出数据库里的值,可以用来绕过验证。

有兴趣的朋友可以在本地测试一下~

最后使用 payload 即可 getflag~

a:2:{s:8:"username";s:9:"TheMaster";s:8:"password";b:1;}

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 信安之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档