ctf show web 入门46

这道题目是上一题的升级版,过滤条件变得更加苛刻了。我们来分析一下新增的限制以及应对方案。

  1. 代码审计与变化
    相比之前,正则过滤 preg_match 新增了以下内容:
    0-9:禁止使用任何数字。这意味着 IFS9 这种绕过方式失效了。
    \:禁止使用美元符号 。这意味着 ${IFS} 变量绕过空格的方式失效了。
    *:禁止使用通配符 。这意味着 fl 这种模糊匹配失效了。
    依然存在的限制:
    禁止分号 ;、关键词 cat、flag 以及 空格。
    末尾依然有 >/dev/null 2>&1 屏蔽回显。

既然数字、$ 和 * 都被封死了,我们需要寻找更原始的 Shell 特性。

A. 绕过空格 (禁止 $ 和数字)

由于不能用 ${IFS},我们可以使用以下方式:

<:输入重定向(最推荐)。

<>:读写重定向。

%09:URL 编码的 Tab 键。

B. 绕过关键词 flag (禁止 *)

由于不能使用 *,我们可以使用 ?。? 在 Linux Shell 中代表匹配任意单个字符。

flag.php 可以写成 fla?.php 或 fl??.php。

C. 绕过关键词 cat

继续使用替代命令:

tac, nl, more, less, head, tail, sort, uniq 等。

D. 截断重定向 >/dev/null

由于分号 ; 被过滤,依然使用:

|| (逻辑或)

%0a (换行符)

第一步:列目录

首先要看看文件名(虽然不能用数字,但 ls 不需要参数):

?c=ls||

或者

?c=ls%0a

第二步读取flag

构造的payload为:

?c=tac%09fla?.php%0a

或者:?c=tac%09fla?.php||

  1. 为什么限制数字,但 %0a %09 却能成功?
    这是一个关于解析顺序的误解。
    核心原理:URL 解码发生在正则检查之前
    在 Web 服务器(如 Apache/Nginx)接收到你的请求后,PHP 会在脚本运行之前自动对 GET/POST 参数进行 URL 解码。
    你的操作:你在浏览器地址栏输入 ?c=ls%0a。
    服务器处理:PHP 收到请求,立刻将 %0a 解码为真正的 换行符(Hex: 0x0A)。
    变量赋值:此时,变量 c 的内容实际上是 ls 后面跟着一个不可见的"回车换行"。 正则检查:preg_match("/\[0-9\]/", c) 检查的是解码后的字符。
    %0a 在解码后是一个控制字符(换行),它不是字符 0 或 9。
    正则匹配的是字面上的数字字符(ASCII 48-57),而换行符的 ASCII 码是 10。
    结论:%0a 只是换行符在传输过程中的"皮囊"。一旦进入 PHP 内部,它就变成了换行符,不再包含数字 0。
  2. 为什么 || 可以绕过重定向限制?
    要理解这个,需要先看清楚题目中 system 拼接后的完整命令结构。
    命令拼接的真相
    题目代码:system($c." >/dev/null 2>&1");
    如果你传入 c=ls||,最终在服务器终端执行的命令是:
    ls || >/dev/null 2>&1
    Shell 的逻辑运算符原理
    在 Linux Shell 中,|| 是一个**逻辑或(OR)**运算符,它遵循"短路逻辑":
    命令A || 命令B:只有当 命令A 执行失败(返回非零值)时,才会执行 命令B。
    执行命令 A:首先执行 ls。
    判断结果:ls 成功执行(找到了文件),返回状态码为 0(代表成功)。
    短路效应:因为 命令A 已经成功了,根据 OR 的逻辑,整个表达式已经成立,Shell 会直接跳过后面的 命令B。
    结果:后面的 >/dev/null 2>&1(也就是负责把结果丢进黑洞的命令)被忽略了。ls 的输出直接流向了标准输出,最后被 PHP 捕获并显示在网页上。
相关推荐
157092511345 小时前
Android进阶之光:HTTP协议原理深度解析
android·网络协议·http
终端安全笔记5 小时前
安卓五品牌通道差在哪:监管通道拆解
android
尾善爱看海6 小时前
Vue 面试收官篇:SSR、性能优化落地、30 道高频面试题精讲(附标准答案)
前端·javascript·vue.js·面试·vue
v_34836087626 小时前
Android native端 堆栈打印
android·算法
老当益壮梁奶奶6 小时前
51单片机DS18B20温度传感器详解:单总线时序与C51驱动实现
笔记·stm32·单片机·嵌入式硬件·51单片机
一笑的小酒馆7 小时前
AndroidKMP之导航和WebView
android
驳是7 小时前
一个组件,提升 react-router 开发的幸福感
前端·preact
GreenTea7 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
星云API技术支持7 小时前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
小叶肥辉7 小时前
LangChain链和LangGraph图的学习笔记【三】——分别用langchain_openai库和langchain_community库调用大模型
笔记·python·langchain