文件上传漏洞防御方法
一个网站被上传了一个PHP文件,文件服务器直接宕机。上传攻击者用的漏洞是一个几乎没人注意的旧头像上传接口,文件类型校验只检查了HTTP头里的防御方法Content-Type,伪造一个image/png简直太容易了。文件文件落地之后,上传他访问那个路径,漏洞webshell就执行了。防御方法整个过程不到两分钟。文件 防御文件上传,上传第一件事就是漏洞别信任何来自客户端的信息。文件名、防御方法文件类型、文件文件大小,上传全都可以被篡改。漏洞你看到的那个“jpg”,实际上可能是一段PHP代码,只是后缀被改了,或者图片里藏了脚本。真正的判断得靠服务器端,拿文件的实际内容说话。 最实用的做法是白名单校验。别去维护一个黑名单,列出哪些后缀不允许上传——这玩意儿永远跟不上攻击者的想象力。你只需要明确告诉服务器:只有.jpg、.png、.gif这些后缀才允许通过。其他的一律拒绝。代码就几行,但效果立竿见影。黑名单那种方式,今天禁了.php,明天人家上传.phtml、.php5、.pht,你又得补漏洞,永远在追赶。 文件内容校验也别落下。用getimagesize()这类函数去读图片的真实头部信息,看它是不是真的是一张图。光看后缀和MIME不够,得让服务器自己去解析。如果解析失败,直接扔掉。这里有个细节:图片上传后,最好重新压缩或转码一次。把原始像素数据抽出来,再生成一张新图,这样藏在图片里的恶意代码就被打散了,即使有也变成一堆无意义的像素点。 存储位置和权限设置是另一道防线。上传的文件不要放在Web根目录下,放到一个独立的目录,或者干脆放到服务器本地磁盘的某个路径,通过程序去读取。这样就算文件里真有恶意代码,它也没法被直接执行。同时,给上传目录设置好权限——只允许写入,禁止执行脚本。Nginx或Apache里可以单独针对上传目录做配置,去掉PHP的执行权限。这一步能挡掉大量攻击。 文件名也别用用户传上来的原始名称。服务器自己生成随机字符串,加上白名单后缀,比如“a3f8d2.jpg”。这样既避免了路径穿越攻击(像“../../etc/passwd”那种),也防止了攻击者猜到你存的文件路径。你想想,如果文件名是用户可控的,他传一个“shell.php.jpg”或者“test.php%00.jpg”,解析层面的问题就来了。 还有一点容易被忽略:上传文件的访问方式。有些文件上传后是为了给用户预览的,那就别用直接URL访问原始文件,而是通过一个下载脚本去读文件内容并输出。这样即使文件是恶意的,脚本在输出前也会检查它的类型和内容,相当于加了一层过滤。 日志监控也得做。上传接口的日志要记录完整,包括IP、User-Agent、文件名、文件大小、上传时间。一旦出问题,这些东西能帮你回溯攻击路径。我见过太多网站,被上传了n个webshell,连日志都没开,事后连攻击者从哪个IP来的都不知道。 最后说个实战中常见但又容易被忽视的点——上传接口的并发处理。有些开发者只做了单次请求的校验,但攻击者用脚本同时发多个请求,每个都绕过一次校验,就可能有一两个漏网之鱼。所以校验逻辑必须写在上传处理的入口处,集中处理,别分散到各个业务逻辑里。别觉得这是小事,实际攻击中,这种并发绕过的手法用得非常多。 文件上传这事儿,说穿了就是一场博弈。你堵住一个口子,攻击者就会想别的方式绕过。但只要你把上述这些点都做到位,大部分攻击者就会放弃,转而去挑那些更软的柿子捏。毕竟,攻击者也是讲投入产出比的。
-
上一篇
-
下一篇
- 最近发表
- 随机阅读
- 搜索
-
- 友情链接
-