CTFd 动态 Web 题制作
- 继上一篇 CTFd 搭建之后,紧接着要部署 Web 题了,这里比较麻烦,不过总会有解决办法的。
- 个人水平有限,Web 题主要是基于 PHP 语言搭建的,不过市面上大部分 CTF 比赛 PHP 占比还是蛮大的。
- 本篇文章参考:
基础环境说明
常用镜像
- 本篇文章所有镜像均采用 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
统一配置
- 镜像一般采用两种软件源:
- 环境变量:
- 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 生成父镜像。
静态 Web 题
- 本篇文章只涉及 example 目录内容,一般来说 enviroment 目录是不用动的。
目录结构
1 | root@docker:/opt/base_image/web_httpd/example# tree |
文件说明
| 文件名 | 说明 |
|---|---|
| docker-compose.yml | docker-compose.yml 文件的作用是定义和配置多容器 Docker 应用程序,用于生成镜像 |
| Dockerfile | Dockerfile 是一个文本文件,用于定义和配置 Docker 镜像的构建过程 |
| files | 可执行文件夹 |
| flag.sh | flag 设置脚本 |
| start.sh | 需要运行的程序脚本,一般不做修改 |
| src | Web 源码文件夹 |
| index.html | 这里是个统称,可放入任意 Web 文件 |
docker-compose.yml
1 | version: "3" |
Dockerfile
1 | FROM ctfhub_base/web_httpd |
flag.sh
1 | !/bin/bash |
start.sh
1 | !/bin/bash |
index.html
1 | test page <br> |
使用示例
父镜像创建
- Web 题目容器需要先在 enviroment 目录下使用 docker-compose build 生成父镜像:
1 | docker-compose -f enviroment/docker-compose.yml build |
子镜像创建
- 有了父镜像,子镜像也按照相同步骤创建即可:
1 | docker-compose -f example/docker-compose.yml build |
CTFd-Web
- 镜像创建完成了,在 CTFd 上创建个题目,写 docker-compose.yml 中的名字:

- 开启题目:

- BingGo!

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

- 开启题目:

- BingGo!

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

- 开启题目:

- BingGo!

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Yongz丶!









