⭐️PHP伪协议详解

本文详细介绍了PHP伪协议的概念、应用场景以及常见的几种伪协议,包括php://input、php://filter、zip://等,并提供了具体的使用示例。

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

PHP伪协议详解

一、前言

1.什么是PHP伪协议?

PHP伪协议是PHP自己支持的一种协议与封装协议,简单来说就是PHP定义的一种特殊访问资源的方法。

有些伪协议成功执行需要allow_url_fopen和allow_url_include的支持。

allow_url_fopen On/Off 允许或禁止打开URL文件
allow_url_include On/Off 允许或禁止引用URL文件


2.什么时候用PHP伪协议?

文件包含!!!的时候,可能遇到的文件包含函数:
1、include
2、require
3、include_once
4、require_once
5、highlight_file
6、show_source
7、flie
8、readfile
9、file_get_contents
10、file_put_contents
11、fopen (比较常见)


二、常见的php伪协议

php://input

php://input 是个可以访问请求的原始数据的只读流,获取POST请求数据的协议

当enctype=”multipart/form-data” 的时候 php://input 是无效的。

php://input 伪协议 成功执行前提
php.ini 中的 allow_url_include设置为On

格式示例:

php
<?php
@include($_GET["file"]);
?>

php://filter

php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。

在利用上很多都是与包含函数结合使用,读入或者输出获取文件源码然后编码让其不执行从而输出

php://filter 的使用:

php://filter/read=convert.base64-encode/resource=index.php
php://filter/resource=index.php

php://filter 伪协议组成:
read=<读链的筛选列表>
resource=<要过滤的数据流>
write=<写链的筛选列表>
php://filter/read=处理方式(base64编码,rot13等等)/resource=要读取的文件

read 对应要设置的过滤器:
常见的过滤器分字符串过滤器、转换过滤器、压缩过滤器、加密过滤器
其中convert.base64-encode ,convert.base64-decode都属于 转换过滤器

格式示例:

<?php
$a=($_GET["file"]);
echo(file_get_contents($a));//获取文件内容
?>

zip://与bzip2://与zlib://协议

zip:// 等属于压缩流的协议,通过直接压缩普通文件为zip文件,再通过zip:// 协议读取,可以直接执行php代码。压缩后的zip文件可以随意修改后缀也不影响zip://协议读取。(注意是如phpinfo.txt直接压缩为zip,而不是文件夹压缩zip)

格式示例:

<?php
$a=($_GET["file"]);
include($a);
?>

压缩及协议访问格式:

压缩文件为.zip后缀
zip://绝对路径/phpinfo.zip%23phpinfo.php
压缩文件为.bz2后缀
compress.bzip2://绝对路径/phpinfo.zip/phpinfo.php
压缩文件为.gz后缀
compress.zlib://绝对路径/phpinfo.zip/phpinfo.php


data://

data://伪协议可以通过请求提交的php代码数据配合文件包含函数可以达到代码执行效果。

data://伪协议 成功执行前提
php.ini设置allow_url_include 与allow_url_open都为On。

data://协议的格式是: data://数据流封装器,相应格式数据

格式示例:

<?php
$a=($_GET["file"]);
include($a);
?>

phar://

phar://伪协议可以对zip格式压缩包进行访问解析

格式示例:

phar://绝对路径\phpinfo.zip\phpinfo.php

注意这里与zip://不同的地方是,phar访问压缩包内容是通过/访问,而zip是通过#访问


Python老吕提醒
使用这些伪协议时,需要注意PHP配置和服务器环境的限制,某些协议可能因为配置或安全原因被禁用。
特别是在处理外部资源(如HTTP或FTP)时,需要注意安全性,确保不会暴露敏感信息或遭受注入攻击。
在使用 data://、phar:// 等伪协议时,应特别注意数据的验证和清洁,以避免安全漏洞。




👨‍💻博主Python老吕说:如果您觉得本文有帮助,辛苦您🙏帮忙点赞、收藏、评论,您的举手之劳将对我提供了无限的写作动力!🤞


🔥精品付费专栏:(暂时免费,尽快订阅、收藏哦)🔥
《跟老吕学Python编程》
《跟老吕学Python编程·附录资料》

🌐前端:
《跟老吕学HTML》
《XHTML》
《CSS》
《JavaScript》
《Vue》

💻后端:
《跟老吕学C语言》
《C++》
《Java》
《R》
《Ruby》
《PHP》
《Go》
《C#》
《Swift》
《Python》

💾数据库:
《跟老吕学Oracle语言》
《MYSQL》
《SQL》
《PostgreSQL》
《MongoDB》


### SSRF漏洞中的伪协议使用场景及防御措施 #### 伪协议的定义与常见类型 伪协议是指一些特殊的URL前缀,它们并不指向真实的网络地址,而是用于本地文件读取或其他特殊操作。在SSRF漏洞中,攻击者常通过伪协议实现敏感数据泄露或进一步攻击目标系统的行为。常见的伪协议包括但不限于 `file://` 和 `php://` 等[^3]。 #### 常见伪协议及其使用场景 1. **`file://` 协议** - 攻击者可以通过该协议读取服务器上的任意文件内容,例如配置文件、日志文件等。 - 示例代码片段展示如何利用此协议: ```python import requests url = 'http://example.com/vulnerable_endpoint?url=file:///etc/passwd' response = requests.get(url) if response.status_code == 200 and "root:" in response.text: print("File read successful!") ``` 2. **`php://filter` 协议** - 此协议允许对输入流进行过滤处理,可用于读取或修改PHP源码的内容。 - 示例代码如下: ```python payload = 'http://example.com/vulnerable_endpoint?url=php://filter/read=convert.base64-encode/resource=config.php' result = requests.get(payload).text if result.startswith('PD'): decoded_content = base64.b64decode(result).decode() print(decoded_content) ``` 3. **`data:` 协议** - 虽然主要用于嵌入小型数据,但在某些情况下也可能被滥用作为跳板执行更复杂的攻击逻辑。 #### 防御措施分析 为了有效防范基于伪协议的SSRF攻击,可以从以下几个方面着手: 1. **白名单机制** - 对于外部请求接口所接受的目标地址参数实施严格的校验策略,仅允许访问预设范围内的合法域名或IP地址列表[^4]^。 2. **禁用危险功能** - 关闭不必要的PHP设置选项如 `allow_url_fopen` 和 `allow_url_include` ,从而减少潜在威胁面^。 3. **沙箱环境隔离** - 将对外提供服务的应用程序部署到受限的操作环境中运行,即使发生突破也难以影响核心资产[^1]^。 4. **深入的日志记录与监控** - 定期审计API调用行为模式,快速识别异常活动迹象以便采取相应行动^。 5. **时间延迟引入** - 在解析用户提交的数据之前增加固定延时环节,有助于缓解部分自动化工具批量探测的压力^。 ```python def validate_and_process_input(user_supplied_data): allowed_protocols = ['https', 'ftp'] parsed_url = urlparse(user_supplied_data) protocol_used = parsed_url.scheme if protocol_used not in allowed_protocols: raise ValueError(f"Unsupported Protocol {protocol_used}") # Additional validation steps here... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python老吕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值