1. 文件上传漏洞基础认知第一次接触文件上传漏洞时我盯着浏览器里那个选择文件按钮发呆了十分钟。这个看似无害的功能竟然能成为攻破整个网站的入口后来在Shop靶机实战中踩了无数坑才明白文件上传功能就像快递柜的取件码——设计不当的验证机制相当于把取件码贴在快递柜表面。文件上传漏洞的本质是服务器对用户提交的文件未做充分校验。常见漏洞触发点包括头像上传、商品图片、附件提交等场景。去年某电商平台漏洞报告中41%的漏洞源于文件上传功能缺陷。攻击者通过上传Webshell如%eval request(pass)%这样的ASP一句话木马就能获得服务器控制权。我曾用Wireshark抓包分析正常图片上传过程发现完整验证链条包含五个环节客户端JS校验扩展名如只允许.jpg服务端检查MIME类型如image/jpeg文件头内容验证检测真实文件类型文件重命名策略防止覆盖存储目录权限控制禁止脚本执行2. 黑名单绕过实战技巧在Shop靶机环境中遇到黑名单机制就像玩扫雷游戏。系统禁止上传.asp/.php等扩展名但总有漏网之鱼2.1 大小写变异攻击# 原始黑名单 blacklist [php, asp, jsp] # 绕过样本 Webshell.php → Webshell.PhP Webshell.asp → Webshell.aSp某次渗透测试中用shell.aSp成功绕过某CMS系统验证后来发现其黑名单校验用的是大小写敏感匹配。2.2 冷门脚本扩展名这些扩展名常被忽略.asaIIS6可执行.cerIIS6可执行.cdxIIS6可执行.php5部分环境解析.phtmlApache配置解析2.3 特殊符号截断在Windows系统下尝试这些组合test.asp. test.asp(空格) test.asp:1.jpg原理是Windows会自动去除末尾点和空格。在Burp Suite抓包测试时记得切换到Hex视图修改3. MIME类型欺骗的艺术上周帮朋友审计某OA系统时发现前端JS代码里有这样的验证function checkFileType(file){ return file.type image/jpeg; }这种客户端验证形同虚设。用Burp拦截上传请求修改Content-Type即可绕过原始请求头Content-Type: application/x-php修改后Content-Type: image/jpeg更隐蔽的做法是制作图片马# Linux下合成命令 cat normal.jpg webshell.php shell.jpg # Windows下合成命令 copy /b normal.jpg webshell.php shell.jpg实测发现PHP的exif_imagetype()函数能检测这种伪造但GD库的getimagesize()可能被绕过。4. 解析漏洞组合拳4.1 IIS6双重扩展名解析上传shell.asp;.jpg会被解析为ASP文件。原理是分号后的内容被忽略这种特性在旧版IIS中尤为危险。4.2 Apache解析特性尝试上传shell.php.xxx当xxx不在解析列表时Apache会向左识别扩展名。某次实战中.php.abc意外被解析成功。4.3 Nginx配置错误错误配置导致/uploads/shell.jpg/被解析为PHPlocation ~* \.php$ { fastcgi_pass 127.0.0.1:9000; include fastcgi_params; }攻击者可上传shell.jpg文件然后访问/shell.jpg/index.php触发解析。5. 00截断技术详解在Shop靶机渗透时发现路径拼接漏洞上传路径/var/www/uploads/【用户控制】/filename利用步骤Burp拦截上传请求在路径参数插入shell.php%00.jpgHex视图将%00替换为00NULL字符服务器最终存储为shell.php关键原理C语言中NULL字符表示字符串结束。某次比赛中这个技巧帮我绕过了三层过滤机制。6. 防御方案设计去年给某企业做安全加固时我们实施了五层防护6.1 白名单验证$allowed [jpg, png, gif]; $ext strtolower(pathinfo($name, PATHINFO_EXTENSION)); if(!in_array($ext, $allowed)){ die(非法文件类型); }6.2 文件内容校验使用finfo检测真实类型$finfo new finfo(FILEINFO_MIME); $mime $finfo-file($_FILES[file][tmp_name]);6.3 重命名策略$new_name md5(uniqid())...$ext; move_uploaded_file($tmp, /safe_dir/.$new_name);6.4 目录权限控制chmod -R 750 uploads/ find uploads/ -type f -exec chmod 640 {} \;6.5 二次渲染用GD库重新生成图片$img imagecreatefromjpeg($tmp); imagejpeg($img, $new_path, 100);7. 渗透测试经验谈有次客户坚持说他们的上传功能绝对安全我掏出这个组合技先上传info.jpg包含?php phpinfo();?利用文件包含漏洞/index.php?pageuploads/info.jpg成功触发代码执行这个案例说明没有孤立的漏洞只有未被发现的攻击链。建议每次测试时准备三类测试文件正常图片文件基准测试混合Webshell的图片马纯脚本文件测试黑名单最后提醒新手所有操作务必在授权环境下进行。有次我忘记关Burp的拦截功能导致客户公司内网OA瘫痪了半小时——那天的检讨书现在还在我抽屉里。