上传危险扩展 27 项黑名单:php 家族与 XSS 家族的拦截设计

CLARA轻量论坛系统
CLARA轻量论坛系统 星耀SVIP星耀SVIP管理员管理员 黑卡会员黑卡会员
发布于 2026-10-08 20:00 ·2 浏览 ·0 回复

学完这篇,你能搞清楚 Clara BBS 上传环节那 27 项危险扩展黑名单到底拦了什么、为什么这么分家族,以及上传失败时该去哪里改配置。

上传安全从来不是一个开关能解决的事。任何一个能被上传到服务器的文件,只要浏览器或服务器愿意执行它,站点就等于把后门钥匙挂在了门口。Clara BBS 的做法是三层叠加:扩展名黑名单兜底 → 后台白名单放行 → 图片二次校验。这篇重点讲第一层那 27 项到底怎么分、怎么设计的。

第一步:先理解为什么黑名单要分「家族」

单纯的扩展名列表很容易漏。攻击者换个后缀(.php 不行就试 .phtml,再不行试 .phar)就能绕过。所以这 27 项不是随便排的,而是按能被执行的脚本家族和能被浏览器当页面渲染的家族两块来组织。同一家族里,只要有一个环节放过去,另外几个就是逃生通道,必须一起堵。

第二步:php 家族 12 项——凡是能被 PHP 解析器吃掉的都算

这一类是最高风险,因为服务器上装了 PHP,任何被解析的文件都等于远程代码执行:

.php、.php3、.php4、.php5、.php7、.php8、.phtml、.pht、.phar、.phps、.inc、.module

设计逻辑有三点:

  • 版本号后缀:.php3 到 .php8 是老版本遗留习惯,很多服务器配置里仍然把它们映射到 PHP 解析器,不能因为「现在用 8.x」就删掉。
  • .phtml / .pht:Apache 的常见别名后缀,默认配置里就可能被当 PHP 执行。
  • .phar / .inc / .module:不直接访问时看着无害,但一旦被 include 或通过路径访问,同样能触发执行。.phps 虽然通常只输出源码高亮,但在部分配置下会暴露源码。

注意:别再往上传目录里放 .user.ini、.htaccess 这类无扩展名的配置文件。它们不走扩展名判断,却能把整个目录改造成可执行环境——这是比扩展名更隐蔽的入口。

第三步:XSS 家族 15 项——凡是浏览器会当页面渲染的都算

这一类不执行服务器代码,但在浏览器里执行 JS,用于窃取登录态、挂马、钓鱼:

.html、.htm、.xhtml、.shtml、.shtm、.svg、.svgz、.xml、.xsl、.xslt、.js、.mjs、.vbs、.hta、.swf

关键的两个容易漏:

  • .svg 和 .svgz:很多人觉得 SVG 是图片就放行,但 SVG 是 XML,内部可以写 <script>。用户直接访问这个「图片」时,脚本就在你的域名下执行了。
  • .shtml / .shtm:开启 SSI 的服务器会把它们当动态页面处理,等于给了一条执行路径。

.hta 在 Windows 上会被当可执行程序,.mjs 是 ES Module 后缀,都属于必须一起拦的同类。

第四步:真正生效靠的还是白名单

黑名单只负责「明确危险的一律拒绝」,它挡不住没被列出来的新后缀。所以 Clara BBS 的实际放行逻辑是白名单:只有白名单里的扩展名才能上传。

后台位置在「系统设置 → 上传」,这里有两个互相独立的字段:

  • 允许的扩展名:管图片(jpg、png、gif、webp 等)
  • 附件允许的扩展名:管附件(zip、rar、pdf、docx 等)

注意:很多人只改了「附件允许的扩展名」,然后抱怨图片传不上去。这两个字段互不影响,图片走的是前一个。

图片还会有二次校验:不光看后缀,还会解析文件内容确认它是不是真图片。把 shell.php 改名成 shell.jpg 传上来,会在这一层被拆穿。

第五步:服务器层再补一刀

程序层的拦截只是一半。建议在服务器上把上传目录的执行权限关掉——Nginx 里对 uploads 目录拒绝 .php 解析,Apache 里用 <FilesMatch> 禁掉。这样即使程序层的名单哪天被绕过,文件也执行不起来。

三层里任何一层单独都不够:只靠黑名单会漏新后缀,只靠白名单会被伪造内容骗过,只靠服务器配置则换个环境部署就失效。

第六步:上传失败怎么排查

按顺序看三处:

  1. 后台「系统设置 → 上传」里,对应字段(图片字段 or 附件字段)是否包含这个后缀;
  2. PHP 的 upload_max_filesize 和 post_max_size 是否大于文件体积(宝塔默认 2M,手机照片经常超,建议调到 30M+);
  3. uploads 目录是否可写。

上传失败时页面会直接给出原因,比如超过 PHP 上限、不在白名单内、目录不可写,照着提示改就行,不用猜。

小结

  • 27 项黑名单分两族:php 家族 12 项(可被解析执行)、XSS 家族 15 项(可被浏览器渲染执行)。
  • 黑名单是兜底,真正放行靠后台「系统设置 → 上传」的白名单,图片和附件是两个独立字段。
  • .svg、.phar、.phtml 是最容易被漏掉的三个,拦的时候别只盯着 .php。
  • 图片还有内容二次校验,改后缀骗不过去。
  • 服务器层建议把上传目录的执行权限关掉,这是独立于程序的最后一道保险。
  • 出问题先看后台白名单字段、PHP 上传上限、目录权限这三处。
本文转载自 Clara轻量论坛系统,原文地址:https://www.leleweb.cn/thread-754.html
转载请注明出处,版权归原作者所有。

全部回复 0

还没有回复,来抢沙发~