渗透测试中PHP Stream Wrappers的利用技巧
流(Streams)这个概念是在php4.3引进的,是对流式数据的抽象,用于统一数据操作,用于统一数据操作,比如文件数据、网络数据、压缩数据等。简单点讲,流就是表现出流式数据行为的资源对象。在本文中,我将为大家介绍一些PHP Stream Wrappers在渗透测试中的利用技巧。
了解 IT 中的流
当不同的介质之间有数据交互的时候,就使用流来实现。数据源和目标可以是文件,TCP/IP或UDP网络连接,标准输入和输出,文件服务器上的文件传输或文件存档过程。即使这些流看起来彼此差异很大,但它们却有一个共同的线程:它们基本上都是读写的过程。你可以将数据从源写入到目标,也可以将从源读取的数据传输到目标。大致过程如下:
连接建立
数据读取
数据写入
连接结束
即使基本操作是读写,也需要执行其他操作才能访问Web服务器或存档文件,或是执行简单的输入和输出过程,以及通过TCP/IP或UDP建立连接。
流操作中的通用函数
我们可以通过PHP中的一些通用函数与流进行交互:
file
open
fwrite
fclose
file_get_contents
file_put_contents
在PHP中,你可以使用通用函数来执行各种流操作,而无需使用单独的函数,从而使整个过程更加简单。
直到今天,这些函数仍是流概念的主要部分并用于文件读写过程。我们现在可以在PHP中使用wrapper(包装器)来执行各种流处理,例如HTTP,FTP,SOCKET进程和标准输入/输出进程。
如果要使用流,则需要以特定格式指定其类型和目标。我们将在通用函数中使用的流类型定义如下:
://
占位符用于指定我们将使用的流类型,如File,FTP,PHPOUTPUT,PHPINPUT,HTTP或SSL。
如果你是PHP程序员,你应该熟悉以下代码。它会读取some.txt文件并打印其内容。
$handle = fopen("some.txt","rb");
while(feof($handle)!==true) {
echo fgets($handle);
}
在代码中,我们使用file://system wrapper调用fopen通用流函数。从技术上讲,上面的代码与以下代码完全相同:
$handle = fopen("file://some.txt","rb");
while(feof($handle)!==true) {
echo fgets($handle);
}
由于流函数中的默认包装器是file://,因此如果要使用它,则不必进行指定。
你可以使用以下代码列出允许使用的包装器。
php
print_r(stream_get_wrappers());
流上下文概念
对于大多数用例,流函数的默认用法可能已经足够。但是在某些情况下,你需要的不仅仅是默认用法。
file_get_contents(“http://www.example.com/news.php”);
我们假设可以使用file_get_contents命令来读取http://www.example.com/news.php上的新闻。但是,如果该网站需要某种形式的身份验证才能访问其内容呢?在这种情况下,你可以使用流上下文(Stream-Context)规范使用可选参数自定义流行为。
以下是一段流上下文的示例代码:
$postdata = '{"username":"ziyahan"}'
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/json;charset=utf-8;\r\n'.
'Content-Length: '.mb_strlen($postdata),
'content' => $postdata
)
);
$context = stream_context_create($opts);
$response = file_get_contents('http://www.example.com/news.php', false,
$context);
如上所示,流上下文实际上是一个数组。上面的键值表示将在上下文中使用的包装器类型(本例中为HTTP)。每个包装器都有各自的上下文参数。你可以在PHP文档中阅读有关它们的更多信息。
PHP 流过滤器
以上我们对流的读写过程已有了一个初步的了解。流包装器的主要优点是可以在读/写过程中即时的修改,更改或删除数据。
PHP为我们提供了一些流过滤器(string.toupper,string.tolower,string.rot13和string.strip_tags)。除此之外,还可以使用各种自定义过滤器。
我们可以使用stream_append_filter函数在流上应用过滤器。例如,下面的过滤器会将所有读取的句子转换为大写:
$handle = fopen('file://data.txt','rb');
stream_filter_append($handle, 'string.toupper');
while(feof($handle)!==true) {
echo fgets($handle);
}
fclose($handle);
在data.txt中读取的信息将以大写形式显示在屏幕上。
你还可以使用php://filter wrapper向流添加过滤器:
$handle = fopen('php://filter/read=string.toupper/resource=data.txt','rb');
while(feof($handle)!==true) {
echo fgets($handle);
}
fclose($handle);
流开始传输时将调用该方法。与第一个示例相比,该方法对于之后不允许过滤器附件的函数(如file()和fpassthru())更为可行。
你可以使用过滤器进行编码(rot13,base64)或文件压缩和提取。
除了PHP和预定义的包装器之外,你还可以使用第三方包装器(如Amazon S3或Dropbox),并为特定操作编写自定义包装器。
在此之前我们给出的示例属于本地文件包含(LFI)类目,其中包括将目标系统中的文件包含在代码中以提取系统的数据。
流(Streams)这个概念是在php4.3引进的,是对流式数据的抽象,用于统一数据操作,用于统一数据操作,比如文件数据、网络数据、压缩数据等。简单点讲,流就是表现出流式数据行为的资源对象。在本文中,我将为大家介绍一些PHP Stream Wrappers在渗透测试中的利用技巧。
了解 IT 中的流
当不同的介质之间有数据交互的时候,就使用流来实现。数据源和目标可以是文件,TCP/IP或UDP网络连接,标准输入和输出,文件服务器上的文件传输或文件存档过程。即使这些流看起来彼此差异很大,但它们却有一个共同的线程:它们基本上都是读写的过程。你可以将数据从源写入到目标,也可以将从源读取的数据传输到目标。大致过程如下:
连接建立
数据读取
数据写入
连接结束
即使基本操作是读写,也需要执行其他操作才能访问Web服务器或存档文件,或是执行简单的输入和输出过程,以及通过TCP/IP或UDP建立连接。
流操作中的通用函数
我们可以通过PHP中的一些通用函数与流进行交互:
file
open
fwrite
fclose
file_get_contents
file_put_contents
在PHP中,你可以使用通用函数来执行各种流操作,而无需使用单独的函数,从而使整个过程更加简单。
直到今天,这些函数仍是流概念的主要部分并用于文件读写过程。我们现在可以在PHP中使用wrapper(包装器)来执行各种流处理,例如HTTP,FTP,SOCKET进程和标准输入/输出进程。
如果要使用流,则需要以特定格式指定其类型和目标。我们将在通用函数中使用的流类型定义如下:
://
占位符用于指定我们将使用的流类型,如File,FTP,PHPOUTPUT,PHPINPUT,HTTP或SSL。
如果你是PHP程序员,你应该熟悉以下代码。它会读取some.txt文件并打印其内容。
$handle = fopen("some.txt","rb");
while(feof($handle)!==true) {
echo fgets($handle);
}
在代码中,我们使用file://system wrapper调用fopen通用流函数。从技术上讲,上面的代码与以下代码完全相同:
$handle = fopen("file://some.txt","rb");
while(feof($handle)!==true) {
echo fgets($handle);
}
由于流函数中的默认包装器是file://,因此如果要使用它,则不必进行指定。 内容来自无奈安全网
你可以使用以下代码列出允许使用的包装器。
php
print_r(stream_get_wrappers());
流上下文概念
对于大多数用例,流函数的默认用法可能已经足够。但是在某些情况下,你需要的不仅仅是默认用法。
file_get_contents(“http://www.example.com/news.php”);
我们假设可以使用file_get_contents命令来读取http://www.example.com/news.php上的新闻。但是,如果该网站需要某种形式的身份验证才能访问其内容呢?在这种情况下,你可以使用流上下文(Stream-Context)规范使用可选参数自定义流行为。
以下是一段流上下文的示例代码:
$postdata = '{"username":"ziyahan"}'
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/json;charset=utf-8;\r\n'.
'Content-Length: '.mb_strlen($postdata),
'content' => $postdata
)
);
$context = stream_context_create($opts);
$response = file_get_contents('http://www.example.com/news.php', false,
$context);
如上所示,流上下文实际上是一个数组。上面的键值表示将在上下文中使用的包装器类型(本例中为HTTP)。每个包装器都有各自的上下文参数。你可以在PHP文档中阅读有关它们的更多信息。
PHP 流过滤器
以上我们对流的读写过程已有了一个初步的了解。流包装器的主要优点是可以在读/写过程中即时的修改,更改或删除数据。
PHP为我们提供了一些流过滤器(string.toupper,string.tolower,string.rot13和string.strip_tags)。除此之外,还可以使用各种自定义过滤器。
我们可以使用stream_append_filter函数在流上应用过滤器。例如,下面的过滤器会将所有读取的句子转换为大写:
$handle = fopen('file://data.txt','rb');
stream_filter_append($handle, 'string.toupper');
while(feof($handle)!==true) { copyright 无奈人生
echo fgets($handle);
}
fclose($handle);
在data.txt中读取的信息将以大写形式显示在屏幕上。
你还可以使用php://filter wrapper向流添加过滤器:
$handle = fopen('php://filter/read=string.toupper/resource=data.txt','rb');
while(feof($handle)!==true) {
echo fgets($handle);
}
fclose($handle);
流开始传输时将调用该方法。与第一个示例相比,该方法对于之后不允许过滤器附件的函数(如file()和fpassthru())更为可行。
你可以使用过滤器进行编码(rot13,base64)或文件压缩和提取。
除了PHP和预定义的包装器之外,你还可以使用第三方包装器(如Amazon S3或Dropbox),并为特定操作编写自定义包装器。
在此之前我们给出的示例属于本地文件包含(LFI)类目,其中包括将目标系统中的文件包含在代码中以提取系统的数据。