RedTiger 通关学习总结

本文作者: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 文件,构造语句即可,有回显,无过滤,万事大吉

?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 插件可以进行字符串和十六进制之间的转换。

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

$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;}

原文发布于微信公众号 - 信安之路(xazlsec)

原文发表时间:2018-03-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏linux驱动个人学习

Linux内核同步机制之completion

1442
来自专栏我和PYTHON有个约会

Django来敲门~第一部分【5.1.项目配置settings.py详解】

我们创建好了一个Python项目(mysite/)之后,需要在项目中添加模块应用(polls/),在模块应用中添加处理功能逻辑,如添加模块中的视图处理函数(po...

953
来自专栏FreeBuf

安全科普:SQLi Labs 指南(Part 3)

Freebuf上有两篇SQLi Labs的教程安全科普:SQLi Labs 指南 Part 1和安全科普:SQLi Labs 指南 Part 2。这两篇教程只讲...

2079
来自专栏世界第一语言是java

网站调用支付宝进行支付-Java后台调用支付宝支付

6213
来自专栏安恒网络空间安全讲武堂

从零基础到解题之 Python is the best language

-目录- 前言 环境搭建 源码结构 题目分析 Python is the best language1 Python is the best langua...

2904
来自专栏IT笔记

JAVAWEB开发的微信公众号H5支付

一切需求都是来源于业务需要,前一阵子做了微信扫码支付,的确相对PC用户来说方便了很多。但是如果手机下单,你总不能让用户自己扫自己吧?查看了一下文档,微信还是支持...

1.6K5
来自专栏iOS技术

YYCache 源码剖析:一览亮点

YYCache 作为当下 iOS 圈最流行的缓存框架,有着优越的性能和绝佳的设计。笔者花了些时间对其“解剖”了一番,发现了很多有意思的东西,所以写下本文分享一下...

4315
来自专栏好好学java的技术栈

SpringBoot 使用Swagger2打造在线接口文档(附源代码)

想必很多小伙伴都曾经使用过Swagger,但是打开UI界面之后,却是下面这样的画风,纯英文的界面并不太友好,作为国人还是习惯中文界面。

1991
来自专栏有趣的Python

最新Django2.0.1在线教育零基础到上线教程(四)-3&4

演示地址: http://mxonline.mtianyan.cn 教程仓库地址1: https://github.com/mtianyan/DjangoGe...

4004
来自专栏杨建荣的学习笔记

操作系统存储管理和oracle数据库(第一篇) (r3笔记第76天)

在上大学的时候,学习操作系统感觉特别枯燥,都是些条条框框的知识点,感觉和实际的关联不大。发现越是工作以后,在工作中越想深入了解,发现操作系统越发的重要。像现在的...

2727

扫码关注云+社区