ctf show web入门48

这是一道典型的 PHP 代码审计与命令注入(Command Injection) 绕过题。

  1. 代码逻辑分析

    代码的核心逻辑如下:

    输入点:通过 GET 方式接收参数 c。

    过滤机制:使用 preg_match 进行正则匹配,过滤了大量关键字符和命令:

    符号类:; (分号), | (管道符), & (后台运行/与), (空格), $ (变量符号), \ (转义), * (通配符), 0-9 (数字), ' (单引号), " (双引号), ` (反引号)。

    命令类:cat, flag, more, less, head, sort, tail, sed, cut, awk, strings, od, curl。

    执行点:如果输入的 c 不匹配上述正则,则执行 system($c." >/dev/null 2>&1");。

  2. 核心难点

    黑洞重定向:>/dev/null 2>&1 会将命令的标准输出和错误输出全部丢弃,这意味着你无法直接在页面上看到命令执行的结果(无回显)。

    空格过滤:无法直接使用空格分隔命令和参数。

    关键字过滤:无法直接读取包含 flag 字样的文件,也无法使用常用的文件查看命令(如 cat)。

  3. 解题思路与绕过技巧

    A. 解决"无回显"问题

    既然输出被重定向到了 dev/null,我们需要想办法让命令连续执行。通常使用 ;、& 或 &&,但 ; 被滤了。

    利用 URL 编码:在 Linux shell 中,换行符 %0a 可以起到分隔并执行多条命令的作用。

    Payload 结构:?c=ls%0a。由于 ls 执行后的输出原本会被截断,但换行后的第二部分才是重定向,所以 ls 的结果有机会显示出来。

B. 绕过空格限制

常用的空格替代符:

{IFS} (但 被滤了,不能用)

IFS9 (同上,不能用)

%09 (Tab 键的 URL 编码):这是本题最可能的解法。

< (重定向符号):例如 cat<flag.php(但 cat 被滤了)。

C. 绕过关键字过滤 (flag, cat 等)

绕过 cat:可以使用 tac(倒序查看)、nl(添加行号查看)、vi、uniq 等。

绕过 flag 字样:可以使用通配符。虽然 * 被滤了,但 ? 没有被滤!

可以用 f??? 代表 flag。

绕过数字:如果需要数字,可以使用 shell 里的算术运算,但本题重点似乎不在数字。

payload为:?c=tac%09fla?.php%0a

或者使用?c=nl%09fla?.php%0a 然后查看源代码

nl (Number Lines):主要用于给文件内容加上行号后输出。

虽然 nl 的初衷是编排行号,但为了编排行号,它必须读取并显示文件内容。在绕过过滤(Filter Bypass)的场景下,我们并不在乎输出里是否多了行号,只要能看到文件里的 flag 即可。

相关推荐
牧艺10 分钟前
cos-design v3.0:从 15 个 Demo 到 49 个组件的视觉特效库
前端·视觉设计
通玄11 分钟前
Jetpack Compose 入门系列(六):Navigation 3 页面导航
android
lichenyang45311 分钟前
ASCF 架构升级总览:WebRuntimePage 为什么要变薄
前端
道友可好12 分钟前
从今天开始:你的第一个 Harness Engineering 实践
前端·人工智能·后端
Linsk14 分钟前
组件 = 模板 + 业务逻辑
java·前端·vue.js
二月龙1 小时前
移动端 H5 页面开发:响应式适配 + 低版本兼容实战指南
前端
小强19881 小时前
HTML5 新表单全解:日期、手机号、颜色选择器
前端
妙码生花1 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(二):目录结构、初始化 GIT、设计并开发配置系统
前端·后端·go
鱼人1 小时前
HTML5 本地存储终极指南
前端
超绝大帅哥1 小时前
React的Fiber是什么? Vue为什么不需要Fiber ?
前端