在PHP中,伪协议是一种强大的工具,允许开发者以不同的方式访问和操作文件及数据流。然而,需要注意的是,不当使用伪协议可能导致安全漏洞。
虽然PHP伪协议主要用于文件操作函数(如file_get_contents(), fopen(), include(), require()等),并且其中一些协议出于安全考虑被限制在某些上下文中使用,但了解它们仍然对安全研究和测试很有价值。
然而,需要注意的是,使用PHP伪协议来读取任何敏感文件通常是不被允许的,并且可能违反网站的安全策略。这些操作通常在渗透测试或安全评估的上下文中进行,并且必须得到明确的授权。
以下是一些PHP伪协议的例子
读取本地文件系统上的文件。
假设flag.php位于当前目录或其子目录中(这通常不是实际情况,因为安全限制)
file_get_contents('file:///path/to/flag.php');
?file=file://C:phpinto.txt
注意:在Web环境中,直接使用file://协议来读取服务器上的文件通常是不被允许的,因为这可能暴露敏感信息。此外,路径必须是绝对路径,并且PHP进程必须对该路径有读取权限。
用于读取/写入数据流,并可以对数据进行编码转换。
尝试读取并转换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)文件。
允许创建数据URI,这些数据可以被解释为文件或其他类型的数据
?file=data:text/plain:base64,PD9waHAKcGhwaW5mbygpOwo/Pg==
?file=
?file=data://text/plain;base64,PD9waHAKcGhwaW5mbygpOwo/Pg==
注意:data://协议通常不能用于包含PHP文件,因为PHP会执行文件内容而不是将其视为数据。
data://协议在包含文件时通常被禁用,因为它可能导致代码执行漏洞。
用于访问ZIP归档和Phar归档中的文件。
假设flag.php被打包在一个名为archive.zip的ZIP文件中
file_get_contents('zip://archive.zip#flag.php');
?file=zip://file.zip%23phpinfo.txt
注意:这些协议也受限于安全配置,并且不能用于包含(include/require)PHP文件,因为它们可能导致代码执行漏洞。
作用:用于读取原始的POST数据。当enctype不是multipart/form-data时,可以将POST请求中的数据作为PHP代码执行(但通常这会被安全配置阻止)。
假设有一个包含漏洞的脚本允许执行php://input中的数据
file_get_contents('php://input');
?file=php://input,post数据:
注意:eval()函数会执行传递给它的字符串作为PHP代码,这通常是非常危险的,因为它可以允许攻击者执行任意代码。
作用:分别用于向标准输出和标准错误输出写入数据。
示例:
fwrite(fopen('php://stdout', 'w'), 'Hello, stdout!');
fwrite(fopen('php://stderr', 'w'), 'Hello, stderr!');
注意:这些协议通常用于调试目的,而不是在生产环境中处理敏感数据。
作用:用于查找匹配特定模式的文件路径。
$files = glob('glob:///*.php');
print_r($files);
注意:使用glob://协议时,需要确保路径模式是安全的,以避免暴露敏感文件。
作用:用于访问Phar归档文件(PHP的打包格式)。
假设有一个Phar归档文件包含恶意代码
file_get_contents('phar://malicious.phar/stub.php');
注意:Phar归档文件可以被用来执行恶意代码,因此应该谨慎处理来自不受信任来源的Phar文件。
(注意:这不是一个标准的PHP伪协议,但在某些PHP配置中可能可用):
作用:允许与外部进程进行交互。
file_get_contents('expect://ls -l');
注意:expect://协议通常用于自动化脚本和测试,但在Web应用程序中很少使用,因为它可能引入安全风险。