您现在的位置是:烟消火灭网 > 娱乐
文件包含漏洞如何避免
烟消火灭网2026-10-17 07:39:12【娱乐】0人已围观
简介一个下午,我盯着日志文件里的一串十六进制字符,后背发凉。那是攻击者留下的payload,编码后指向服务器上的`/etc/passwd`。文件包含漏洞,就这么悄无声息地躺在一个老旧的PHP后台模板参数里
一个下午,文件我盯着日志文件里的包含一串十六进制字符,后背发凉。漏洞那是何避攻击者留下的payload,编码后指向服务器上的文件`/etc/passwd`。文件包含漏洞,包含就这么悄无声息地躺在一个老旧的漏洞PHP后台模板参数里。
这漏洞的何避本质很简单:程序把用户输入当成了文件路径来用。你传一个`../`,文件它就能跳出当前目录;你传一个远程URL,包含它就直接把别人服务器上的漏洞代码拉下来执行。听起来像天方夜谭,何避但现实中,文件这类漏洞在中小站点里仍然常见。包含
要堵住这个口子,漏洞最笨但最有效的办法是**白名单**。别让用户决定“加载哪个文件”,而是让用户只能从你预设的几个选项里挑。比如`?page=about`,程序内部只认`about`、`contact`、`news`这三个值,映射到固定的本地文件。任何不在名单里的输入,直接拒绝。这招能干掉百分之九十的本地文件包含问题。
可远程文件包含更危险。攻击者会让你的服务器去读取他控制的恶意脚本。杜绝它的手段也简单:在php.ini里把`allow_url_include`设为`Off`。这个开关一关,PHP就不会去执行远程文件里的代码。很多框架默认是关的,但总有人手贱打开。你打开它图什么?图方便?那代价就是服务器被人当肉鸡。
光靠配置不够,代码层的输入过滤也得做。别指望黑名单,你永远猜不全攻击者会用什么编码绕过。`%2e%2e%2f`、Unicode变体、双重URL编码——黑名单迟早被绕过去。正确姿势是**只保留允许的字符**,比如只允许字母、数字、下划线和斜杠,其他全部拦截。白名单式的过滤永远比黑名单可靠。
还有个常被忽略的坑:文件包含和文件上传经常联手作恶。攻击者先上传一个图片马,再用文件包含去执行它。解决思路是分开存储——上传的文件放在Web根目录之外,或者直接存到对象存储里,用独立域名访问。这样即使包含漏洞存在,攻击者也找不到可执行的本地文件。
另外,别迷信框架。Laravel、ThinkPHP这些框架确实内置了防护,但你得用对方法。有些人图省事,直接用`include($_GET['path'])`,框架的防护形同虚设。框架只是工具,关键还是写代码的人有没有安全意识。
最后说个真实案例。去年我审计过一个开源CMS,它的主题编辑器允许用户指定模板文件名。开发者做了过滤,但只过滤了`../`,没过滤绝对路径。攻击者传一个`/proc/self/environ`,配合请求头里的恶意UA,直接拿到了服务器环境变量。修复方案很简单:加一个`realpath()`检查,确保解析后的路径必须在模板目录内。就这么一两行代码的事,能省下多少麻烦。
文件包含漏洞不是什么高深技术,但它的破坏力取决于你给了攻击者多少可乘之机。白名单、关闭远程包含、严格过滤、分离上传目录、检查真实路径——这几件事做扎实了,大部分风险就能化解。别指望靠运气,攻击者比你想象的更有耐心。你懒,他们可勤快得很。
很赞哦!(8)






