文件上传和文件包含最近在继续学 Web 安全。原本我以为文件上传漏洞和文件包含漏洞是两个完全不同的东西。结果越学越发现很多真实环境里它们几乎是绑定出现的。甚至很多 getshell 思路。本质上都是文件上传 文件包含今天就整理一下我最近学习时真正理解到的东西。一、什么叫文件包含先说最基础的。很多网站会有这种功能?pagehome.php服务器会根据参数include($_GET[page]);动态加载页面。正常情况下加载的是网站自己的文件比如home.phpnews.phpuser.php但如果没有做好限制。攻击者就可能控制 include 的内容这就是文件包含漏洞概念性讲可以理解为当包含路径参数可被用户控制且未严格过滤时攻击者可构造恶意路径迫使应用加载执行非预期文件本地或远程从而引发安全漏洞。二、为什么文件包含这么危险因为include 不只是“读取”很多时候。它会执行文件里的 PHP 代码这就非常关键了。也就是说如果攻击者能控制“被包含的文件”就可能直接执行代码。三、我一开始一直有个误区以前我一直觉得jpg 就只是图片直到后来学了图片马。才发现GIF89a?php phpinfo(); ?这种文件其实很特殊。它看起来像图片能通过某些检测但里面其实有 PHP 代码这时候我突然意识到一件事上传成功 ≠ 漏洞结束真正危险的可能是后面的文件包含四、经典漏洞链到底是怎么形成的这里也是我最近真正开始理解“漏洞链”的地方。攻击流程通常是上传图片马↓服务器保存文件↓存在文件包含漏洞↓include 图片文件↓PHP 代码被执行↓getshell也就是说很多时候。攻击者根本不需要直接上传 php 木马因为网站可能早就禁止了。但只要最后能被 include图片一样能执行。这一点真的让我对 Web 安全理解变化很大。五、为什么很多网站“以为自己很安全”因为很多开发会觉得我已经限制上传 php 了于是认为上传功能安全但问题是服务器真正危险的。不只是“能不能上传”而是“后面会不会被解析”如果后面还有includerequire模板渲染phar反序列化那么风险会突然放大。六、我现在越来越理解“服务器行为”了以前学习漏洞总感觉漏洞是固定知识点比如XSS 是 XSS上传是上传文件包含是文件包含但现在越来越发现真实环境里漏洞之间其实会互相影响。真正核心的是服务器到底怎么处理数据比如怎么解析文件include 到底做了什么为什么图片会执行PHP 为什么会解析这段代码这些东西开始串起来之后才第一次感觉自己是在真正理解 Web我们可以用一张图片感受一下一些上传点的“安全错觉”七、为什么很多师傅都强调“漏洞链思维”因为真实环境里。很多单独漏洞危害并不大但一旦组合风险会指数级上升。例如文件上传 文件包含或者SSRF Redis再比如反序列化 phar这时候我终于理解为什么很多实战里重点已经不是“这个漏洞叫什么”而是“这个漏洞能不能和别的东西连起来”八、最后文件包含漏洞表面上看只是include 一个文件但真正深入之后会发现。它本质上其实是在利用服务器对文件的解析行为而这东西恰恰又和文件上传phar反序列化命令执行全部都能连起来。这里给大家一个学习时候可以用的检查清单最近越学越感觉Web 安全真正难的不是背漏洞。而是理解服务器到底在干什么文章内容仅供交流学习请勿用于非法用途。