当前位置:首页 > 休闲

禁上传文件的后缀名

上周帮一个做HR的禁上件朋友整理校招简历,她收到一份PDF,传文打开后电脑直接卡死。后缀IT部门查了半天,禁上件结论是传文文件里嵌了一个带宏的Excel对象,触发了解析器漏洞。后缀后来他们公司内网就挂出一条规则:禁止上传.xlsm、禁上件.docm、传文.pptm这类带宏的后缀Office文件。这条规则看起来粗暴,禁上件但确实管用。传文

文件后缀名这东西,后缀普通人当它是禁上件格式标签,搞安全的传文当它是第一道过滤网。Web应用里但凡有上传功能,后缀后端几乎都会维护一份黑名单或白名单。黑名单常见的有:.php、.jsp、.asp、.aspx、.exe、.sh、.bat。这些后缀一旦被解析执行,服务器就可能变成别人的肉鸡。我见过一个老旧的CMS,上传目录没做脚本禁用,攻击者传了个.php文件,里面就一行system($_GET['c']);,整台机器就交代了。

但黑名单有个经典漏洞:大小写和特殊后缀。比如.pHp、.php5、.phtml,甚至.php.(Windows下末尾点会被忽略)。有些中间件还认.php%00.jpg这种截断。所以真正靠谱的做法是白名单——只允许.jpg、.png、.pdf、.docx这些明确安全的格式。可白名单也有代价,业务部门会跑来问:为什么我的.heic传不了?为什么.zip被拦了?

我自己的服务器上,上传目录是独立分区,挂载时加了noexec。后缀名过滤只做第一层,后面还有MIME类型校验、文件头魔数检查、重命名存储。比如你传一个.jpg,但文件头是MZ(Windows可执行文件标志),直接丢弃。这招能挡住大部分改后缀的雕虫小技。

有个做在线教育的朋友踩过坑。他们允许老师上传.svg当课件插图,结果有人传了个带<script>的SVG,学生点开就中招。SVG本质是XML,能嵌JS,很多安全清单里它算“可执行”格式。后来他们把.svg也拉黑了,改用.png或.webp。

另一个容易忽略的是.htaccess。Apache环境下,攻击者上传这个文件,就能让服务器把.jpg当PHP解析。所以上传目录必须关掉AllowOverride。Nginx用户也别笑,.user.ini有类似效果。这些后缀名不在常规黑名单里,但杀伤力一点不小。

说回开头那个HR朋友。他们后来加了一条:所有简历先转成纯文本再入库,原始文件扔进对象存储,只给下载链接,且下载时强制Content-Disposition: attachment。这样即使文件带毒,也不会在浏览器里直接渲染。后缀名过滤只是起点,后面还有很长的链条。但起点没做好,后面全白搭。

如果你在维护上传功能,别只盯着.php。把.jspx、.cgi、.pl、.py、.rb、.war、.jar都过一遍。还有.lnk、.url、.scf这些Windows快捷方式,钓鱼常用。最后,记得把.htaccess和.user.ini也写进拒绝列表。别问为什么,照做就行。

分享到: