文件包含漏洞的一般特征不包含
发帖时间:2026-10-17 05:13:26
文件包含漏洞的文件常规画像,几乎每个安全从业者都能背出来:动态函数拼接、包含不包未过滤用户输入、漏洞include或require关键字。特征但真正在代码审计里摸爬滚打过的文件人都知道,这套标准答案经常失灵。包含不包我见过最阴间的漏洞案例,是特征一个CMS后台的模板渲染功能——攻击者上传一个包含PHP代码的图片,然后通过修改模板路径参数去包含它。文件整个过程没有出现一次直接的包含不包`$_GET`拼接到include语句,但漏洞确实存在,漏洞而且危害极大。特征 所以,文件要谈文件包含漏洞的包含不包“一般特征”,不如先谈它**不包含**什么。漏洞这更有意思,也更接近实战。 第一,文件包含漏洞不必然需要可见的`include`或`require`函数。现代框架普遍采用路由分发,控制器方法里可能只写`$this->load->view($page)`,而`$page`的值来自配置文件或数据库。如果攻击者能污染数据库字段,或者通过session注入改变配置项,那么文件包含的触发点就藏在框架底层,表面代码看起来干干净净。我审计过一个老旧的PHP项目,它的错误处理机制里有一行`include($error_template)`,这个变量从cookie里读取——谁能想到错误页面成了突破口? 第二,文件包含漏洞不总是需要远程URL。很多人一看到`allow_url_include=Off`就放松警惕,觉得只能本地包含,危害可控。但本地文件包含玩到极致,一样能拿Shell。比如配合日志注入——往User-Agent里写PHP代码,然后包含`/var/log/apache2/access.log`。或者利用`/proc/self/environ`,只要请求头里有恶意载荷,包含这个伪文件就能执行代码。这些路径完全在服务器本地,不需要任何远程能力,但效果等同于RCE。 第三,文件包含漏洞不一定以`.php`文件为猎物。攻击者常常包含图片、文本、甚至压缩包。只要目标文件内容里含有可被解析的PHP代码块,扩展名根本拦不住。有个真实案例:某站点允许用户上传SVG图片,SVG本质上是XML,但攻击者在里面嵌入了``,然后通过文件包含漏洞去加载这个SVG。PHP引擎不会因为扩展名是`.svg`就拒绝解析,它照样执行。这类“非标准文件”的利用,恰恰是漏洞检测工具最容易漏报的地方。 第四,文件包含漏洞不包含明显的输入点。常规扫描器喜欢抓`?page=home`这种参数,但实际漏洞可能藏在HTTP头、Cookie、甚至环境变量里。比如某个应用将`$_SERVER['HTTP_X_FORWARDED_HOST']`直接拼进模板路径,攻击者改个Host头就能触发包含。这种输入点不在请求体里,WAF很难拦截,代码审计时也容易忽略。 第五,文件包含漏洞不限于服务端代码执行。如果目标环境是Python的`flask`或`django`,包含文件可能触发SSTI(模板注入)或者反序列化,最终效果可能是读取任意文件而非直接命令执行。很多新手看到“文件包含”四个字就默认等于PHP,但Java的`ClassLoader`、Node的`require`同样存在类似问题。不同语言下的利用链天差地别,用统一的“特征”去套,只会让你错过真正的攻击面。 说到底,文件包含漏洞的本质是**路径控制权和内容解释权**的错配。它不需要固定的函数名,不需要显眼的参数,不需要远程服务器,甚至不需要PHP。死记硬背那些“一般特征”,就像拿着旧地图寻找新大陆——你找到的永远是别人设计好的陷阱,而不是真实的漏洞。真正靠谱的做法,是追踪每一个外部可控变量如何流向文件系统操作,而不是等一个`include`出现在眼前。