Moxin 发表于 2025-11-13 21:01:20

【青少年CTF】题目投稿必看说明

# 前言

自平台创立以来,我们收到了众多小伙伴的热情投稿,贡献了大量高质量的CTF题目。随着社区的不断壮大和平台的持续演进,题库类型也日益丰富。在保留Crypto、Reverse、Misc、Pwn、Web等经典CTF题型的基础上,我们陆续拓展了多个专项方向,包括训练靶场、应急响应、OSINT(开源情报)、数字取证、工控安全,以及前沿的AI模型安全等新兴领域。

**感谢每一位参与共建的你,让我们一起探索更广阔的安全世界!**

# 投稿方式

平台中点击「投稿题目」即可进入。
![](./data/attachment/forum/202601/12/163749y5xnpxypmoiixsyn.jpg)

![](./data/attachment/forum/202601/12/163757ugbkvzge6devbweb.jpg)

当然,也可以在文章末尾的「阅读原文」中进行投稿。

# 投稿要求

模板: https://pan.baidu.com/s/1XNgqBB_-NqB52B393uKmfg?pwd=x2qx

## 静态题目

Misc、Crypto、Reverse等静态附件题目,需要按照上述模板要求,填写下方图片中示例文件夹的内容。

![](./data/attachment/forum/202601/12/163949cvmz1e2h5zh31mme.jpg)

题目描述文档(根目录的**描述.txt**),请按照下述示例内容填写。

![](./data/attachment/forum/202601/12/164215t2f1gj9zzgr1zv2j.jpg)
> 题目名称:黑白之秘
> 题目描述:这个东西你一定会解答吧?
>
> 题目难度:1
> 题目FLAG:flag{test_flag}
>
> 提示信息:
> 提示1:二维码识别

**题目附件**目录中,为了防止传输过程中出现差异、文件损坏,需要打包为**附件.zip**

![](./data/attachment/forum/202601/12/164228alfiuczcyuftycy9.jpg)

**题目工程文件**中放的是出题过程中重要节点的文件,比如一道Morse密码题目,我们需根据“原文”、“脚本”、“密文”进行,当然这里并不是强制要求。

**解题脚本**中放的是,这个题目如果需要自写脚本或者能够自写脚本,就建议大家放置脚本,脚本支持`.py`、`.bat`、`.sh`、`.c`等类型。

## Web题目

Web题目要求大家启用动态FLAG,这里我详细的说一下我们的动态FLAG是如何体现的,并给出几个代码示例。

我们提供了部分环境的模板,地址为:
https://github.com/qsnctf/qsnctf_base_docker_images

![](./data/attachment/forum/202601/12/164241t7lcgxgyg4uw6un9.jpg)


![](./data/attachment/forum/202601/12/164251kf0uz0k1k1sduhht.jpg)

在`docker-compose.yml`文件中,定义了容器的`image`(镜像名称)、`ports`(端口)、`environment` (环境变量)

我们这里一般需要修改的只有`image`,也就是需要修改成自己的镜像名称,比如你叫张三,题目是一个`sql`注入,你可以命名为`zs/web:sqlinjection`

#### 环境变量FLAG输出

比如,你想通过PHP读取环境变量的FALG,但是在测试过程中发现读不出来:
```php
<?php
    // 这里是题目操作代码
    ······
    // 读取env的FLAG
    $flag = getenv('FLAG');
    // 输出FLAG
    echo $flag;
?>
```
此时需要注意,我们默认模板中的`flag.sh`文件是将FALG置为not_flag的,默认是将flag输出到根目录下的`flag`文件。

所以我们还需要改写`flag.sh`

```bash
#!/bin/sh

echo $FLAG > /flag

export FLAG=not_flag
FLAG=not_flag

rm -f /flag.sh
```
↑ 这是原来的`flag.sh`

↓ 这是改过之后的`flag.sh`

```bash
#!/bin/sh

echo $FLAG > /flag

rm -f /flag.sh
```
其实就是把`export`这一块给删了就好了。

#### 读取FLAG文件输出

其实读取flag文件什么都不需要改

```php
<?php
    // 这里是题目操作代码
    ......
    // 读取/flag文件
    $flag = file_get_contents('/flag');
    // 输出FLAG
    echo $flag;
?>
```

#### 数据库里的FLAG

想把FLAG写入到数据库中,其实操作还是比较简单的。

![](./data/attachment/forum/202601/12/164312t1nv7f1n3vyz8711.jpg)
我们的`docker-entrypoint`文件是先导入了数据库的`db.sql`文件,然后再执行了`flag.sh`

![](./data/attachment/forum/202601/12/164324wttaogotttgpspo2.jpg)
所以直接在flag.sh中直接操作数据库就好了。

```bash
mysql -e "USE qsnctf;UPDATE user SET password='$FLAG' where username='user'" -uroot -proot
```

#### 注意事项
在部署其他端口服务,比如`Flask`、`Django`、`fast-api`项目时端口不一致,`docker-compose.yml`文件中只需要修改ports下最后那个端口号。

![](./data/attachment/forum/202601/12/164354ff19hqz7z39el39x.jpg)

![](./data/attachment/forum/202601/12/164404m950zn3nd9a7z2ny.jpg)
`environment`中的FLAG,只是测试使用的,本地构建推荐使用
```bash
docker compose build
docker compose up -d
```

![](./data/attachment/forum/202601/12/164418d9pmaxv9jr0aaude.jpg)

一个题目,只能有一个`service`,也就是服务、数据库等应该在一个Docker中,而不是分多个Docker。


## Pwn题目

Pwn题目需要提供题目附件,如有libc需求(如ASLR地址随机化、需要Libc函数、需要Libc地址泄露等),需要提供相应的libc,否则选手将无法解题。

#### 注意事项

Pwn题目端口要指定在`10000`端口!

![](./data/attachment/forum/202601/12/164430kdhiz3t5hh53n5cu.jpg)

![](./data/attachment/forum/202601/12/164441x76s8y767flb5pej.jpg)

![](./data/attachment/forum/202601/12/164455z2z6akzz02aujlk5.jpg)
页: [1]
查看完整版本: 【青少年CTF】题目投稿必看说明