当前位置: 首页 > news >正文

ctfshow-web进阶-命令执行绕过技巧(web71-web74)

1. 命令执行漏洞基础与CTF常见场景

命令执行漏洞(Command Execution)是Web安全中一种高危漏洞,它允许攻击者在服务器上执行任意系统命令。在CTF比赛中,这类题目通常会模拟真实环境中开发者未对用户输入进行严格过滤的场景。

我刚开始接触CTF时,遇到的第一道命令执行题就是个典型例子:题目只过滤了"flag"这个关键词,但允许直接执行system函数。当时我傻乎乎地输入system("cat flag.php"),结果页面返回一片空白——原来题目把输出内容中的字母数字都替换成了问号。这种"看似能执行却看不到结果"的情况,在CTF中非常常见。

PHP中常见的危险函数包括:

  • system():执行系统命令并输出结果
  • exec():执行命令但不输出结果
  • shell_exec():通过shell执行命令
  • 反引号`:与shell_exec等效
  • passthru():直接输出命令执行结果

2. web71:exit()函数的妙用

这道题的突破点在于输出缓冲区的处理。题目源码中使用了ob_get_contents()获取输出缓冲区内容,然后用preg_replace替换所有字母数字为问号。但如果在命令执行后立即调用exit(),就能提前终止脚本,避免后续的替换操作。

我实际测试时发现几个关键点:

  1. exit()必须紧跟在有效操作后面
  2. 使用include比直接读文件更可靠
  3. 目录遍历时scandir()ls更稳定

有效payload示例:

// 列出根目录文件 c=var_export(scandir('/'));exit(); // 包含flag文件 c=include("/flag.txt");exit();

这种绕过方式的本质是利用了PHP的执行流程控制。当exit()执行时,它会:

  1. 立即终止当前脚本执行
  2. 刷新所有输出缓冲区
  3. 跳过后续所有代码逻辑

3. web72:open_basedir绕过技巧

这道题新增了open_basedir限制,它限定了PHP脚本能访问的目录范围。默认配置通常只允许访问/var/www/html及其子目录。我在实际渗透测试中遇到过多次这种情况,有几种经典绕过方法:

3.1 glob://伪协议绕过

glob://是PHP的一个伪协议,它可以绕过部分目录限制。通过DirectoryIterator类可以遍历目录:

c=$a=new DirectoryIterator("glob:///*"); foreach($a as $f) { echo($f->__toString().' '); } exit();

这个payload的工作原理是:

  1. 创建DirectoryIterator实例扫描根目录
  2. 遍历输出所有文件和目录名
  3. exit()避免输出被污染

3.2 UAF漏洞利用

当常规方法失效时,题目可能需要使用UAF(Use After Free)漏洞。下面这个经典payload利用了PHP的对象销毁机制:

c=?><?php function pwn($cmd) { // 省略具体实现... // 包含内存操作和函数地址泄露 } pwn("cat /flag0.txt"); ?>

这种方法的原理比较复杂,简单来说:

  1. 通过PHP对象销毁触发UAF
  2. 泄露内存中的函数地址
  3. 构造虚假的闭包对象
  4. 最终执行系统命令

4. web73:进阶目录遍历技巧

这道题延续了之前的限制,但flag位置变成了/flagc.txt。除了使用web72的方法,还可以尝试:

4.1 直接数组索引访问

c=echo(scandir("/")[6]);exit();

这种方法的优点是:

  • 不需要复杂遍历
  • 直接定位目标文件
  • 适用于已知flag位置的情况

4.2 include直接包含

c=include('/flagc.txt');exit(0);

注意点:

  1. 文件路径必须是绝对路径
  2. 文件内容必须是合法PHP代码
  3. 如果flag是纯文本,需要确保PHP不会将其当作代码解析

5. web74:终极绕过实战

这道题禁用了scandir()函数,但我们可以组合之前的技巧:

5.1 opendir+glob组合

c=$a=opendir("glob:///*"); while(($file=readdir($a))!==false){ echo $file."<br>"; }; exit();

5.2 文件包含终极方案

c=include("/flagx.txt");exit();

在实际CTF比赛中,我总结出几个通用原则:

  1. 先尝试最简单的include/require
  2. 目录受限时用glob://伪协议
  3. 输出受限时用exit()提前终止
  4. 函数被禁时找替代方案(如DirectoryIterator代替scandir

6. 防御方案与实战建议

从防御角度看,开发者应该:

  1. 使用escapeshellarg()处理所有命令参数
  2. 设置严格的open_basedir限制
  3. 禁用危险函数(在php.ini中设置disable_functions
  4. 对输出内容进行适当编码

对于CTF选手,我建议:

  1. 熟记常见PHP危险函数
  2. 掌握伪协议的各种用法
  3. 了解PHP的异常处理机制
  4. 积累各种绕过技巧的实际payload

在真实渗透测试中,命令执行漏洞的危害极大。我曾在一个实际案例中发现,通过精心构造的命令可以绕过多层防御,最终获取服务器权限。这也提醒我们,在开发中必须对用户输入保持高度警惕。

http://www.cnnetsun.cn/news/1602618.html

相关文章:

  • 收藏 | Agent 也能“记得事“:手把手教你实现记忆系统,让大模型更智能
  • 从Java转行大模型应用,LlamaIndex入门
  • github+PicGo极简图床搭建
  • OpCore Simplify:三阶自动化引擎彻底革新OpenCore EFI配置工作流
  • 深度学习ReLU激活函数详解(新手友好,附实战代码)
  • Bootstrap 下拉菜单:全面解析与应用指南
  • 零基础也能掌握的小米表盘设计工具:Mi-Create从入门到精通
  • Z-Image-Turbo-辉夜巫女使用技巧:中英文提示词怎么写?8步出图效果更好
  • 5分钟掌握流放之路2终极角色规划器:Path of Building PoE2完整指南
  • Unity游戏开发:集成RMBG-2.0实现实时背景去除
  • 数字图像处理核心算法手撕实现 (一)
  • CPU 亲和性
  • 微服务架构最佳实践:2025 实战指南
  • 基于stm32的智能体重秤设计[单片机]-计算机毕业设计源码+LW文档
  • C++:跳表
  • AI 开发实战:需求池越堆越乱,先让 AI 帮你做一轮梳理
  • 如何轻松地将三星手机中的照片传输到电脑?
  • Ceph存储集群搭建:如何选择RAID卡模式(HBA vs IT vs non-RAID)
  • 终极指南:如何在Windows 10上免费安装Android子系统
  • GHelper:实现华硕笔记本高效硬件控制的轻量级工具解决方案
  • Qwen3.5-9B GPU算力适配方案:A10/A100/V100显存占用与吞吐量对比
  • 影刀RPA × AI大语言模型:解锁企业智能自动化的无限潜能
  • JeecgBoot:AI驱动的企业级低代码平台高效构建与智能生成实践
  • VSCode的Partial Diff插件:轻松比对任意两段代码
  • 告别文献堆砌!PaperXie AI 文献综述:重构学术写作逻辑,3 步打造导师青睐的深度综述
  • 别再硬熬毕业论文!Paperxie AI:3 天搞定初稿,查重率直接降到 10% 内
  • AI辅助开发:让快马平台Kimi模型帮你构建《构石》官网智能搜索功能
  • AI编程新范式:GME-Qwen2-VL-2B辅助代码生成与视觉逻辑理解
  • Phi-3-mini-4k-instruct-gguf环境部署:CUDA推理路线+隔离venv最佳实践
  • 量子修道会:在纠缠态保存人类技术