CTFd 动态 Web 题制作
CTFd 动态 Web 题制作
继上一篇 CTFd 搭建之后,紧接着要部署 Web 题了,这里比较麻烦,不过总会有解决办法的。
个人水平有限,Web 题主要是基于 PHP 语言搭建的,不过市面上大部分 CTF 比赛 PHP 占比还是蛮大的。
本篇文章参考:
1 基础环境说明
1.1 常用镜像
本篇文章所有镜像均采用 CTFHub 公开的环境基础镜像,主要使用镜像如下:
| 镜像名称 | 环境版本 |
|---|---|
| web_httpd | Debian 12 (bookworm) amd64 Apache/2.4.57 |
| web_nginx | Debian 12 (bookworm) amd64 nginx/1.22.1 |
| web_httpd_php_5.6 | Debian 9 (stretch) amd64 Apache/2.4.25 PHP 5.6.40 |
| web_httpd_php_7.4 | Debian 11 (bullseye) amd64 Apache/2.4.51 PHP 7.4.27 |
| web_httpd_mysql_php_5.6 | Debian 9 (stretch) amd64 Apache/2.4.25 PHP 5.6.40 MariaDB 10.1.45-MariaDB-0+deb9u1 |
| web_httpd_mysql_php_7.4 | Debian 9 (bullseye) amd64 Apache/2.4.51 PHP 7.4.27 MariaDB 10.5.19-MariaDB-0+deb11u2 |
| web_nginx_php_5.6 | Debian 9 (stretch) amd64 nginx/1.10.3 PHP 5.6.40 |
| web_nginx_php_7.4 | Debian 11 (bullseye) amd64 nginx/1.18.0 PHP 7.4.27 |
| web_nginx_mysql_php_5.6 | Debian 9 (stretch) amd64 nginx/1.10.3 PHP 5.6.40 |
| web_nginx_mysql_php_7.4 | Debian 11 (bullseye) amd64 nginx/1.18.0 PHP 7.4.27 |
看名称就知道用途了这里不多赘述,除此之外看个人使用情况,酌情添加。
简单整合的项目,删除了些个人用不到的文件:https://github.com/Y0n9zh/base_image
1.2 统一配置
镜像一般采用两种软件源:
环境变量:
- FLAG:设置 flag,如不覆盖 flag.sh 则默认写入到 /flag。
配置文件:
- php.ini:/usr/local/etc/php/php.ini
- nginx.conf:/etc/nginx/nginx.conf
- 000-default.conf:/etc/apache2/sites-available/000-default.conf
账号密码:
| 服务 | 账号 | 密码 | 主机 |
|---|---|---|---|
| mysql | root | root | localhost |
| mysql | web | web | localhost |
| mysql | web | web | 127.0.0.1 |
| mysql | ping | ping | % |
数据库文件:
- 位于 src/db.sql 的数据库文件将在启动时自动导入。
注:所有镜像生成之前,需要先在 enviroment 目录下使用 docker-compose build 生成父镜像。
2 静态 Web 题
本篇文章只涉及 example 目录内容,一般来说 enviroment 目录是不用动的。
2.1 目录结构
1 | root@docker:/opt/base_image/web_httpd/example# tree |
2.2 文件说明
| 文件名 | 说明 |
|---|---|
| docker-compose.yml | docker-compose.yml 文件的作用是定义和配置多容器 Docker 应用程序,用于生成镜像 |
| Dockerfile | Dockerfile 是一个文本文件,用于定义和配置 Docker 镜像的构建过程 |
| files | 可执行文件夹 |
| flag.sh | flag 设置脚本 |
| start.sh | 需要运行的程序脚本,一般不做修改 |
| src | Web 源码文件夹 |
| index.html | 这里是个统称,可放入任意 Web 文件 |
2.2.1 docker-compose.yml
1 | version: "3" |
2.2.2 Dockerfile
1 | FROM ctfhub_base/web_httpd |
2.2.3 flag.sh
1 | !/bin/bash |
2.2.4 start.sh
1 | !/bin/bash |
2.2.5 index.html
1 | test page <br> |
2.3 使用示例
2.3.1 父镜像创建
Web 题目容器需要先在 enviroment 目录下使用 docker-compose build 生成父镜像:
1 | docker-compose -f enviroment/docker-compose.yml build |
2.3.2 子镜像创建
有了父镜像,子镜像也按照相同步骤创建即可:
1 | docker-compose -f example/docker-compose.yml build |
2.3.3 CTFd-Web
镜像创建完成了,在 CTFd 上创建个题目,写 docker-compose.yml 中的名字:

开启题目:

BingGo!

3 动态 Web 题(No MySQL)
3.1 目录结构
1 | root@docker:/opt/base_image/web_nginx_php_7.4/example# tree |
3.2 文件说明
| 文件名 | 说明 |
|---|---|
| docker-compose.yml | docker-compose.yml 文件的作用是定义和配置多容器 Docker 应用程序,用于生成镜像 |
| Dockerfile | Dockerfile 是一个文本文件,用于定义和配置 Docker 镜像的构建过程 |
| files | 可执行文件夹 |
| flag.sh | flag 设置脚本 |
| start.sh | 需要运行的程序脚本,一般不做修改 |
| src | Web 源码文件夹 |
| index.php | 这里是个统称,可放入任意 Web 文件 |
3.2.1 docker-compose.yml
1 | version: "3" |
3.2.2 Dockerfile
1 | FROM ctfhub_base/web_nginx_php_7.4 |
3.2.3 flag.sh
1 | !/bin/bash |
3.2.4 start.sh
1 | !/bin/bash |
3.2.5 index.php
1 |
|
3.3 使用示例
3.3.1 父镜像创建
Web 题目容器需要先在 enviroment 目录下使用 docker-compose build 生成父镜像:
1 | docker-compose -f enviroment/docker-compose.yml build |
3.3.2 子镜像创建
有了父镜像,子镜像也按照相同步骤创建即可:
1 | docker-compose -f example/docker-compose.yml build |
3.3.3 CTFd-Web
镜像创建完成了,在 CTFd 上创建个题目,写 docker-compose.yml 中的名字:

开启题目:

BingGo!

4 动态 Web 题(MySQL)
4.1 目录结构
1 | root@docker:/opt/base_image/web_nginx_mysql_php_5.6/example# tree |
4.2 文件说明
| 文件名 | 说明 |
|---|---|
| docker-compose.yml | docker-compose.yml 文件的作用是定义和配置多容器 Docker 应用程序,用于生成镜像 |
| Dockerfile | Dockerfile 是一个文本文件,用于定义和配置 Docker 镜像的构建过程 |
| files | 可执行文件夹 |
| flag.sh | flag 设置脚本 |
| start.sh | 需要运行的程序脚本,一般不做修改 |
| src | Web 源码文件夹 |
| db.sql | 数据库文件 |
| index.php | 这里是个统称,可放入任意 Web 文件 |
4.2.1 docker-compose.yml
1 | version: "3" |
4.2.2 Dockerfile
1 | FROM ctfhub_base/web_nginx_mysql_php_5.6 |
4.2.3 flag.sh
1 | !/bin/bash |
4.2.4 start.sh
1 | !/bin/bash |
4.2.5 db.sql
1 | CREATE DATABASE IF NOT EXISTS web; |
4.2.6 index.php
1 |
|
4.3 使用示例
4.3.1 父镜像创建
Web 题目容器需要先在 enviroment 目录下使用 docker-compose build 生成父镜像:
1 | docker-compose -f enviroment/docker-compose.yml build |
4.3.2 子镜像创建
有了父镜像,子镜像也按照相同步骤创建即可:
1 | docker-compose -f example/docker-compose.yml build |
4.3.3 CTFd-Web
镜像创建完成了,在 CTFd 上创建个题目,写 docker-compose.yml 中的名字:

开启题目:

BingGo!







