上传三闸防线:27 项危险扩展名怎么拦截

CLARA轻量论坛系统
CLARA轻量论坛系统 星耀SVIP管理员 黑卡会员
发布于 2026-09-19 06:43 ·7 浏览 ·0 回复

拦截上传攻击,靠背一份 27 项危险扩展名的黑名单是拦不住的——真正有效的做法是三闸串联:**扩展名白名单(只放行你要的)+ 文件内容二次校验(图片必须真是图片)+ 存储执行隔离(就算传进来也跑不起来)**。Clara BBS 的上传安全基线就是「白名单 + 图片二次校验」,黑名单只配当兜底。

第一闸:扩展名白名单,只写「允许什么」

结论:黑名单天生列不全,白名单才是主力——你只需要决定放行哪几种后缀,其余一律拒绝。

这是最容易被配错的一闸。Clara BBS 后台把上传分成两套独立字段:**「系统设置→上传」里的"允许的扩展名"管图片,"附件允许的扩展名"管附件**,两者互不影响。很多人只改了图片那栏、以为大功告成,结果附件通道照样能传 `.php`。

一个可用的白名单参考:

  • 图片:`jpg,jpeg,png,gif,webp`
  • 附件:`zip,rar,7z,pdf,docx,xlsx,txt`

为什么不能靠黑名单?因为危险后缀的变体太多:`.php` 之外还有 `.php3/.php4/.php5/.php7/.phtml/.pht/.phar`,`.asp/.aspx/.asa/.cer`,`.jsp/.jspx`,`.cgi`;再加上双扩展名(`shell.php.jpg`)、大小写混写(`.PHP`)、末尾加点(`shell.php.`)、目录下的 `.htaccess`。你禁一个,攻击者换一个,永远追不上。

第二闸:内容二次校验,后缀对了不代表文件干净

结论:把 `muma.php` 改名成 `muma.jpg` 是最经典的绕过手法,只有校验文件真实内容才能拦住它。

Clara BBS 对图片做了「二次校验」:不只看扩展名,还会验证这个文件到底是不是真实图片(读文件头/图像结构)。改名的脚本马在这里就会被打回,因为它根本不是图片格式。

附件类没法做内容语义校验(zip 里装什么谁也不知道),所以第二闸对附件的策略是:改扩展名无效、不落可执行目录、下载时强制走下载头,让它即便进来也只是一坨死数据。

配置这一闸时顺手排查三处高频故障:① 后台两个扩展名字段是否都覆盖了你要的格式;② PHP 的 `upload_max_filesize` 与 `post_max_size` 是否大于文件体积——宝塔默认只有 2M,手机照片常超,建议调到 30M+;③ `uploads` 目录是否可写。上传失败时页面会直接提示具体原因(超 PHP 上限 / 白名单不符 / 目录不可写),照提示改就行。

第三闸:执行隔离,传进来了也执行不了

结论:前两闸是"不让它进来",第三闸是"进来了也没用",这是最后的保险。

核心动作只有一条:让上传目录不可执行脚本。Nginx 下在上传目录的 location 里拒绝 php/phtml/phar 等后缀执行(返回 403 或直接当静态文件下发),Apache 则在 `uploads/.htaccess` 里关掉脚本引擎。同时把目录权限设成"可写不可执行",并禁止路径穿越(文件名过滤 `../` 与特殊字符)。

第三闸的价值在于:万一哪天白名单被误改、或者用了某个框架解析漏洞,攻击者拿到的也只是一次"上传成功",而不是一个 webshell。

那份 27 项清单,怎么用才不浪费

结论:清单不该当唯一防线,而该当"兜底拦截 + 自检巡检表"。

一份有代表性的高危后缀清单(按类分组,共 27 项):

  • PHP 系 8 项:php、php3、php4、php5、php7、phtml、pht、phar
  • 其他服务端脚本 7 项:asp、aspx、asa、cer、jsp、jspx、cgi
  • 通用可执行 8 项:exe、dll、com、bat、cmd、scr、msi、vbs
  • 前端/容器注入 4 项:html、htm、svg、js

它的正确用法是:放进 WAF 或上传模块做一层快速拒绝,命中就记日志告警;同时定期拿它反向巡检自己的白名单——如果白名单里赫然躺着清单上的任何一项,说明配置出问题了。注意 `.svg` 和 `.html` 常被当成"图片/文档"放行,但它们能携带脚本,允许上传时务必配合单独的域名或强制下载。

配完做三次自测

结论:不测等于没配。传三个文件就能验证三闸是否生效:

  1. 正常传一张 `.jpg` 图片,应成功——验证白名单没误伤;
  2. 把 `shell.php` 改名为 `shell.jpg` 再传,应被内容校验拦下——验证第二闸;
  3. 直接传 `shell.php`,应被拒绝或落地后无法访问执行——验证第一、三闸。

三闸的顺序决定了容错率:白名单挡住 99% 的低成本尝试,内容校验挡住改名绕过,执行隔离兜住所有漏网之鱼。只做其中任何一闸,都等于把服务器安全押在"攻击者不会换个花样"上。

本文转载自 Clara轻量论坛系统,原文地址:https://www.leleweb.cn/thread-505.html
转载请注明出处,版权归原作者所有。

全部回复 0

还没有回复,来抢沙发~