文件上传漏洞原理,CMS站点防护方法
很多站长在访问某些链接时会遇到 404 页面,但你可能不知道,404 页面本身也可能成为文件上传漏洞的入口。
文件上传漏洞是指攻击者利用网站上传功能,把恶意脚本传到服务器并执行,从而控制站点。
CMS 站点因为功能开放、目录结构固定,一旦上传点过滤不严,很容易被利用。
下面从原理到防护,一步步讲清楚怎么排查和加固。
先理解漏洞是怎么发生的
文件上传功能本意是让用户传图片、文档,但服务端如果没有严格校验文件类型和内容,攻击者就能上传 .php、.jsp 等可执行文件。
常见触发点包括:头像上传、附件上传、编辑器上传,以及某些 CMS 自带的 404 页面自定义功能。
关键判断:只要上传后的文件能被 Web 服务器当作脚本执行,就存在漏洞。
以 PHP 站点为例,如果上传目录允许执行 PHP,攻击者上传 shell.php 后访问对应 URL,就能执行任意命令。
部分 CMS 会把 404 页面做成可上传模板或图片,若路径可控且未限制扩展名,同样会被利用。
加固前先确认这几件事
动手改配置前,先备份网站文件和数据库,并确认你拥有服务器 SSH 或宝塔面板权限。
- 确认 Web 服务器类型:Nginx、Apache 还是 IIS。
- 找到 CMS 的上传目录,常见路径如
/uploads/、/data/attachment/、/public/uploads/。 - 确认 PHP 运行用户,一般是
www或nginx。 - 记录当前 Nginx 或 Apache 配置文件位置,例如
/etc/nginx/conf.d/或宝塔面板的“网站-设置-配置文件”。
服务器层防护:让上传目录无法执行脚本
这是最有效的一步。
以 Nginx 为例,在站点配置文件的 server {} 块中加入以下内容,禁止上传目录执行 PHP:
location ~* ^/(uploads|data/attachment|public/uploads)/.*\.(php|php5|phtml|jsp|asp|aspx)$ {
deny all;
}
如果使用宝塔面板,操作路径是:网站 → 设置 → 配置文件,把上面代码粘贴到 server {} 内,保存后重载 Nginx。
Apache 站点可以在上传目录放一个 .htaccess 文件,内容如下:
Require all denied
验证方式:上传一个测试用的 .php 文件到上传目录,然后浏览器访问该文件,如果返回 403 或 404,说明配置生效。
CMS 后台与代码层配合
服务器配置是兜底,CMS 自身也要收紧上传规则。
- 进入 CMS 后台,找到上传设置,限制允许的扩展名为
jpg,jpeg,png,gif,pdf,docx等必要类型,不要勾选 php、html、js。 - 如果 CMS 支持,开启图片二次渲染或文件内容检测,避免伪造图片头部的恶意脚本。
- 检查 404 页面设置,如果允许自定义模板或上传文件,关闭上传功能或限制为仅图片。
- 修改上传目录权限,Linux 下建议设为
755,文件属主为 Web 运行用户,避免其他用户写入。
chmod -R 755 /www/wwwroot/你的站点/uploads
chown -R www:www /www/wwwroot/你的站点/uploads
容易踩坑的地方
只改 CMS 不配服务器,攻击者可能绕过 CMS 直接访问上传目录;
只配服务器不改 CMS,正常上传功能可能受影响。
- 不要只靠前端 JavaScript 校验,攻击者可以抓包绕过。
- 不要使用黑名单只禁
php,phtml、php5、PHP大小写变体都可能绕过。 - 上传目录不要给执行权限,也不要放在网站根目录下可被直接解析的位置。
- 定期更新 CMS 和插件,很多漏洞来自旧版本组件。
怎么确认防护已经生效
完成配置后,按下面顺序检查:
- 访问一个正常图片,确认能打开。
- 尝试上传
.php文件,应被 CMS 拒绝或上传后无法访问。 - 直接访问上传目录下的
.php文件,应返回 403 或 404。 - 查看 Nginx 错误日志,确认没有异常执行记录。
如果以上都通过,文件上传漏洞的风险会明显降低。安全加固不是一次性的,建议每季度复查一次上传目录和 CMS 版本。
常见疑问
问:404 页面和文件上传漏洞有什么关系?
答:部分 CMS 允许自定义 404 页面并上传模板文件,如果该功能未限制文件类型,攻击者可能上传脚本并通过 404 路由访问执行。
问:已经按教程配置了,还需要装安全插件吗?
答:可以装,但插件不能替代服务器配置。建议以服务器层禁止执行为主,插件作为辅助检测。
问:虚拟主机没有 Nginx 配置权限怎么办?
答:联系主机商确认是否支持 .htaccess,或请对方协助在上传目录禁用脚本执行。
问:上传目录权限设成 755 还是 644?
答:目录用 755,文件用 644,确保 Web 用户能读但不可执行脚本。
如果你正在处理 404 文件上传漏洞和 CMS 站点防护,建议先按本文步骤完整执行,再根据自己的环境微调;
遇到异常时优先回看避坑部分。