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 即可。

相关推荐
Go Work5 小时前
实体类字段用 @Value 赋了默认值,取出来还是 null?
经验分享·笔记
白杨尚青5 小时前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl
传人5 小时前
悬停旋转放大和位移效果如何写
前端·javascript·css
zhangzeyuaaa6 小时前
Ruby 方法参数完全指南:默认值、可变参数与关键字参数
前端·python·ruby
粥里有勺糖6 小时前
视野修炼-技术周刊第135期 | 鼠标跟随宠物
前端·github·aigc
vilya6 小时前
我怎么给手机 GUI Agent 做双通道感知:无障碍树为主,投屏像素兜底
android·人工智能
粥里有勺糖6 小时前
拿 Codex 协助清理磁盘,Nice!
前端·后端·github
做运维的阿瑞6 小时前
mysql数据库视图笔记:创建、修改、删除与适用场景
数据库·笔记·mysql
Highcharts.js6 小时前
可视化商用图表库对比,如何选择?
前端·javascript·学习·信息可视化·highcharts·前端可视化
@Mike@6 小时前
12-数据库学习笔记(五种连接算法)
数据库·笔记·学习