CTFshow Web15通关秘籍:绕过PHP命令执行过滤的3种实战技巧
在网络安全竞赛和技能演练中,PHP代码执行与命令注入是Web安全领域的经典课题。CTFshow平台的Web15关卡,以其精巧的过滤规则设计,常常让刚入门的选手感到棘手。它不像那些直接暴露漏洞的题目,而是通过层层过滤,考验着解题者对PHP语言特性和HTTP协议交互的深刻理解。这篇文章,我将从一个实战者的角度,为你拆解这道关卡背后的逻辑,并分享三种超越常规思路的实战技巧。这些技巧不仅适用于这道题,更能帮助你建立起一套应对复杂过滤场景的通用思维模型。无论你是CTF新手,还是希望深化Web安全理解的爱好者,接下来的内容都将是一次从“知其然”到“知其所以然”的思维升级。
1. 环境剖析与核心挑战:理解过滤的本质
拿到一道CTF题目,尤其是代码审计类,最忌讳的就是一头扎进Payload的构造。高手的第一步永远是环境侦察与规则解析。Web15关卡呈现给我们的,是一个看似被“锁死”的PHP执行环境。
题目通常会给出部分源码,这是我们最重要的情报来源。假设我们看到的过滤逻辑大致如下:
$c = $_GET['c'];
$blacklist = array('system', 'exec', 'passthru', 'shell_exec', '`', '(', ')', '.', 'php', 'config', 'cat', 'flag', '>', '<', '=', '?', '&');
foreach ($blacklist as $keyword) {
if (stripos($c, $keyword) !== false) {
die('Hacker!');
}
}
eval($c);
注意:实际题目的过滤列表可能更长或略有不同,但核心思路是阻断我们直接执行系统命令或读取关键文件。这里的
eval($c)是漏洞的入口,但$c的内容被严格审查。
面对这样的过滤,新手容易感到绝望。但请记住,所有过滤规则都是人写的,而人的思维总有盲区。我们的任务就是找到这些盲区。首先,我们来分析一下这个过滤列表透露出的信息:
- 命令执行函数被禁:
system,exec等直接调用系统命令的函数名被过滤。 - 执行操作符被禁:反引号 ````` 也被过滤,这堵死了通过反引号执行命令的常见后路。
- 关键字符被禁:括号
()被禁,使得调用任何函数(即使函数名没被过滤)变得困难;点号.被禁,影响了字符串拼接和文件路径的表示;>、<、=被禁,影响了数据流重定向和比较操作。 - 关键词被禁:
php,config,cat,flag等直接指向目标文件(config.php)和读取命令的关键词被过滤。
这看起来像是一个“死局”。但仔细审视,我们或许能发现一些“幸存者”。例如,分号;是否被过滤? 在很多题目中,分号是允许的,因为它对PHP语句的结束至关重要,过滤它可能导致正常的代码也无法执行。再比如,过滤是针对GET参数,那么POST参数呢? 这是一个至关重要的攻击面分化思考。
| 过滤类型 | 被禁元素举例 | 可能意图 | 潜在绕过思路 |
|---|---|---|---|
| 函数与操作符 | system, ````` |
阻止直接命令执行 | 寻找未被过滤的执行方式(如passthru若未禁)、或利用PHP内置功能 |
| 关键字符 |



被折叠的 条评论
为什么被折叠?



