1. 函数
1)include_once
- 作用: include_once语句在脚本执行期间包含并运行指定文件。
- 特点: 与include类似,但唯一区别是如果文件已被包含过,则不会再次包含,且会返回true。
- 用途: 用于确保文件只被包含一次,避免函数重定义、变量重新赋值等问题。
2)require
- 作用: require和include几乎完全一样,用于包含并运行指定文件。
- 区别: require在出错时产生E_COMPILE_ERROR级别的错误,导致脚本中止;而include只产生警告(E_WARNING),脚本会继续运行。
3)require_once
- 作用: require_once与require类似,但确保文件只被包含一次。
- 特点: 如果文件已被包含过,则不会再次包含,避免重复包含导致的错误。
4)file
- 作用: file将整个文件读入一个数组中。
- 用途: 便于对文件内容进行逐行处理或分析。
2. PHP伪协议
- 定义: PHP伪协议是用来访问其他格式文件的一种协议。
- 支持协议:
- file:// - 访问本地文件系统
- http:// - 访问HTTP(s)网址
- ftp:// - 访问FTP(s) URLs
- php:// - 访问各个输入/输出流(I/O streams)
- zlib:// - 压缩流
- data:// - 数据(RFC 2397)
- glob:// - 查找匹配的文件路径模式
- phar:// - PHP归档
- ssh2:// - Secure Shell 2
- rar:// - RAR
- ogg:// - 音频流
- expect:// - 处理交互式的流
- 注意: 某些伪协议需要对应的扩展模块功能开启才能支持,例如expect协议用于执行命令,需开启相应模块。
二、知识小结
知识点 |
核心内容 |
考试重点/易混淆点 |
难度系数 |
文件包含漏洞相关函数 |
include, require, include_once, require_once, fopen, readfile, highlight_file, show_source, file_get_contents, file |
区分include和require的错误处理方式;理解include_once和require_once的防重复包含机制 |
★★★ |
伪协议 |
PHP内置URL风格的封装协议,用于访问不同格式的文件 |
识别并理解各种伪协议的作用;了解伪协议使用所需的扩展模块 |
★★★★ |
include与require |
include:包含并运行文件,错误时产生警告并继续运行;require:包含并运行文件,错误时终止运行并抛出错误 |
include与require的错误处理差异 |
★★ |
include_once与require_once |
防止文件被多次包含,只包含一次 |
include_once与require_once的防重复机制;与include/require的区分 |
★★★ |
文件操作函数 |
fopen:打开文件或URL;readfile:读取并输出文件;highlight_file/show_source:语法高亮显示文件;file_get_contents:读取整个文件到字符串;file:读取整个文件到数组 |
各函数的具体功能和使用场景;识别可能导致文件包含漏洞的函数 |
★★★★ |
伪协议种类 |
支持多种伪协议,如file://, http://, ftp://等,用于访问不同格式的文件 |
了解并识别各种伪协议;了解伪协议使用的限制和条件 |
★★★★★ |
一、文件包含漏洞相关案例演示
1. 部署DVWA靶场
- 部署环境:需要将DVWA的PHP代码解压到PHP集成环境(如PHPStudy)中,配置好Apache和PHP环境
- 数据库配置:部署完成后需要配置数据库才能正常使用
- 登录信息:默认用户名admin,密码password
2. 文件包含漏洞原理
- 核心函数:漏洞产生的原因是使用了PHP的include函数
- 设计意图:原本设计用于包含本地文件(file1.php、file2.php、file3.php)
- 漏洞成因:未对用户输入进行严格过滤,导致可以包含任意文件
- PHP配置要求:需要检查php.ini中的allow_url_fopen和allow_url_include配置是否开启
3. 文件包含漏洞演示
1)medium级别
- 防护措施:使用str_replace过滤"http://"、"https://"和"../"等字符串
- 绕过方法:采用双写方式绕过(如hthttp://tp://)
- 示例演示:
- 原始输入:http://192.168.142.66/alert.html
- 绕过输入:hthttp://tp://192.168.142.66/alert.html
- 限制:虽然有一定防护作用,但并非绝对安全
2)impossible级别
- 防护优势:从根本上杜绝了任意文件包含的可能性
- 最佳实践:这是最安全的防护方式,建议在实际开发中采用
- 绕过限制:即使结合文件上传漏洞,也无法绕过白名单限制
二、知识小结
知识点 |
核心内容 |
考试重点/易混淆点 |
难度系数 |
文件包含漏洞原理 |
使用include函数未严格过滤用户输入导致可包含任意文件 |
本地包含与远程包含的区别 |
⭐⭐ |
DVWA靶场部署 |
PHPStudy环境配置+数据库部署 |
默认账号admin/password |
⭐ |
Low级别漏洞利用 |
直接通过参数包含phpinfo.php或远程文件 |
路径跳转../../的使用 |
⭐⭐ |
Medium级别绕过 |
str_replace过滤http://和../的双写绕过 |
htthttp://tp://替换后重组 |
⭐⭐⭐ |
High级别突破 |
利用file://伪协议读取系统文件 |
需结合文件上传漏洞使用 |
⭐⭐⭐⭐ |
Impossible防护 |
白名单机制限制仅能访问file1/2/3.php |
正确修复方案示范 |
⭐ |
渗透测试技巧 |
Cookie携带security=low&PHPSESSID保持会话 |
工具调用时的认证问题 |
⭐⭐⭐ |