php中的伪协议

简介

在PHP中,伪协议是一种强大的工具,允许开发者以不同的方式访问和操作文件及数据流。然而,需要注意的是,不当使用伪协议可能导致安全漏洞。

虽然PHP伪协议主要用于文件操作函数(如file_get_contents(), fopen(), include(), require()等),并且其中一些协议出于安全考虑被限制在某些上下文中使用,但了解它们仍然对安全研究和测试很有价值。


然而,需要注意的是,使用PHP伪协议来读取任何敏感文件通常是不被允许的,并且可能违反网站的安全策略。这些操作通常在渗透测试或安全评估的上下文中进行,并且必须得到明确的授权。

 


以下是一些PHP伪协议的例子


file://

读取本地文件系统上的文件。
假设flag.php位于当前目录或其子目录中(这通常不是实际情况,因为安全限制)
 file_get_contents('file:///path/to/flag.php');

?file=file://C:phpinto.txt
 

注意:在Web环境中,直接使用file://协议来读取服务器上的文件通常是不被允许的,因为这可能暴露敏感信息。此外,路径必须是绝对路径,并且PHP进程必须对该路径有读取权限。


php://filter

用于读取/写入数据流,并可以对数据进行编码转换。
尝试读取并转换flag.php的内容
file_get_contents('php://filter/read=convert.base64-encode/resource=flag.php');

 

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

 

注意:php://filter通常也受限于安全配置,并且不能用于包含(include/require)文件。


data://

允许创建数据URI,这些数据可以被解释为文件或其他类型的数据

 

?file=data:text/plain:base64,PD9waHAKcGhwaW5mbygpOwo/Pg==

?file=

?file=data://text/plain;base64,PD9waHAKcGhwaW5mbygpOwo/Pg==

 


注意:data://协议通常不能用于包含PHP文件,因为PHP会执行文件内容而不是将其视为数据。

data://协议在包含文件时通常被禁用,因为它可能导致代码执行漏洞。


zip:// 和 phar://

用于访问ZIP归档和Phar归档中的文件。
假设flag.php被打包在一个名为archive.zip的ZIP文件中
file_get_contents('zip://archive.zip#flag.php');

?file=zip://file.zip%23phpinfo.txt

注意:这些协议也受限于安全配置,并且不能用于包含(include/require)PHP文件,因为它们可能导致代码执行漏洞。

 


php://input

作用:用于读取原始的POST数据。当enctype不是multipart/form-data时,可以将POST请求中的数据作为PHP代码执行(但通常这会被安全配置阻止)。
假设有一个包含漏洞的脚本允许执行php://input中的数据
file_get_contents('php://input');

 

?file=php://input,post数据:


注意:eval()函数会执行传递给它的字符串作为PHP代码,这通常是非常危险的,因为它可以允许攻击者执行任意代码。

php://stdout 和 php://stderr

 

作用:分别用于向标准输出和标准错误输出写入数据。
示例:

fwrite(fopen('php://stdout', 'w'), 'Hello, stdout!');
fwrite(fopen('php://stderr', 'w'), 'Hello, stderr!');


注意:这些协议通常用于调试目的,而不是在生产环境中处理敏感数据。

glob://

作用:用于查找匹配特定模式的文件路径。
$files = glob('glob:///*.php');
print_r($files);


注意:使用glob://协议时,需要确保路径模式是安全的,以避免暴露敏感文件。

 

phar://(前面已提及,但值得再次强调):

作用:用于访问Phar归档文件(PHP的打包格式)。
假设有一个Phar归档文件包含恶意代码
file_get_contents('phar://malicious.phar/stub.php');


注意:Phar归档文件可以被用来执行恶意代码,因此应该谨慎处理来自不受信任来源的Phar文件。

 

expect://

(注意:这不是一个标准的PHP伪协议,但在某些PHP配置中可能可用):

作用:允许与外部进程进行交互。

file_get_contents('expect://ls -l');


注意:expect://协议通常用于自动化脚本和测试,但在Web应用程序中很少使用,因为它可能引入安全风险。

 

 

你可能感兴趣的:(php,开发语言,安全,笔记,学习)