在CTF比赛中,WEB方向的题目常常因为静态FLAG的存在而容易被作弊者利用。为了防止这种情况,动态FLAG成为了一个重要的解决方案。然而,市面上的动态FLAG实现方法大多复杂,需要编写脚本或拉取GitHub上的Docker镜像,这对于新手来说并不友好。本文将介绍一种全网最简单、最高效的GZCTF动态FLAG实现方法,适合那些想举办自己的比赛但又不清楚如何防止WEB方向题目作弊的人。
什么是动态FLAG?
动态FLAG是指在每次用户访问题目时,FLAG的内容都会发生变化。这样即使有人通过某种方式获取了FLAG,也无法在其他时间或其他用户身上使用。动态FLAG的实现可以有效防止作弊行为,提高比赛的公平性。
为什么选择GZCTF?
GZCTF是一个轻量级的CTF平台,易于部署和使用。它支持多种题型,包括WEB、PWN、RE等,非常适合小型比赛或个人练习。通过GZCTF,我们可以轻松实现动态FLAG功能,而无需复杂的配置和脚本编写。
GZCTF平台安装教程>>GZCTF 平台 一键安装完整教程-CSDN博客
一.平台创建题目
在GZCTF中创建web方向题目包括静态容器和动态容器,这里主要讲解动态容器。
1.创建题目
新建题目,选择动态容器
点击编辑附件及flag按钮即可编辑动态flag
这里以flag{[GUID]}测试,其他形式的flag页面有说明
二.动态FLAG的实现方式
在GZCTF平台中内置了一个环境变量'GZCTF_FLAG',这个环境变量会存储动态FLAG
常规方法包括创建一个flag.sh替换字符
#!/bin/sh
sed -i "s/flag{testflag}/$GZCTF_FLAG/" /var/www/html/index.php
export GZCTF_FLAG=""
或者手动编写动态flag生成规则,都非常麻烦
最简单的方法是直接在后端内获取这个环境变量,以下是web方向一些环境的获取环境变量的语句
php:
getenv('');
python:
import os os.environ.get('')
Node.js (JavaScript):
process.env['']
Ruby:
ENV['']
Go:
os.Getenv('')
Java:
System.getenv('')
三.创建镜像
写一个小型题目作为实验测试,使用php环境
目录如下
web/
├── Dockerfile
└── src/
└── index.php
Dockerfile
# 使用 PHP 7.4
FROM php:7.4-apache
#复制文件
COPY src/ /var/www/html/
index.php
<?php
$flag=getenv('GZCTF_FLAG');
echo $flag;
?>
运行以下命令创建镜像
docker build -t test .
创建完成后在平台输入镜像名称,之后创建并访问测试容器
像我一样直接返回动态FLAG即为成功🆗
总结
通过直接在后端获取环境变量,我们可以非常简单地实现动态FLAG功能,而无需复杂的脚本或Docker配置。这种方法非常适合新手使用,能够有效防止WEB方向题目的作弊行为。希望本文能帮助到你,祝你的CTF比赛顺利进行!
如果你有任何问题或建议,欢迎在评论区留言讨论。