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

相关推荐
Hilaku2 分钟前
外包前端和大厂前端,写的代码到底有什么本质区别?
前端·javascript·程序员
liangshanbo121512 分钟前
React Hooks 为什么不能在条件分支/循环中调用?
前端·react.js·前端框架
豆角焖肉19 分钟前
Layui+Layer 弹出层实现 CRUD:AJAX 无刷新新增修改删除后台实战
前端·ajax·layui
wordbaby19 分钟前
npm / yarn / pnpm:别再靠感觉选了
前端·前端工程化
sunphp开发者21 分钟前
制作手绘地图瓦片切图
前端·uni-app
尤水就下28 分钟前
聊聊 Prompt 是怎么一路进化到 Harness 的
前端·人工智能·ai编程
李溪白29 分钟前
深入 JavaScript 作用域:从变量提升到执行上下文的底层逻辑
前端
YF021130 分钟前
开机自启动预置App最简单、最快方案
android
想风33 分钟前
Claude Code 实用技巧工作坊 —— Boris Cherny
前端·后端·github
梦想blog34 分钟前
Claude Code + Chrome MCP:让浏览器自动化测试更简单
前端·chrome·自动化·mcp