PHP伪协议

PHP封装协议php

PHP有不少内置URL风格的封装协议,这类协议fopen(),copy(),file_exists(),filesize()等文件系统函数所提供的功能相似。常见协议以下:安全

file://          访问本地文件系统服务器

http://         访问HTTP(s)网址less

ftp://           访问FTP(s)URLsssh

php://         访问输入/输出流(I/O streams)函数

zlib://          压缩流量post

data://        数据(RFC 2397)测试

ssh2://        Secure Shell 2网站

expect://      处理交互式的流url

glob://          查找匹配的文件路径

//摘录自《Web安全深度剖析》

这个封装协议多用于文件包含漏洞

 

php伪协议的分类

伪协议是文件包含的基础,理解伪协议的原理才能更好的利用文件包含漏洞。

php://input

php://input表明能够访问请求的原始数据,简单来讲POST请求的状况下,php://input能够获取到post的数据。

使用条件:include( )、include_once( )、file_get_contents( )

比较特殊的一点,enctype=”multipart/form-data”的时候 php://input 是无效的。

用法举例:

  • 使用file_get_contents函数的伪协议包含有个经典的例子;
  • 可使用fputs文件输入流直接服务器某一存在的目录下写入文件。

 

php://output

php://output 是一个只写的数据流,容许你以print和echo同样的方式写入到输出缓冲区。

php://filter(重点)

php://filter是一种元封装器,设计用于数据流打开时的筛选过滤应用,也就是做为一种过滤器,可使用在数据流产生的地方。

 

 php文档中,标准的定义是这样的:

相似的过滤器还有string.rot1三、string.strip_tags、zlib.deflate和zlib.inflate等等,目前只要知道convert.base64-encode就行了。

URL 中包含点的常见形式

?file = xxx 或者 ?file = xxx.php

 

allow_url_fopen和allow_url_include

在测试了包含点存在包含漏洞之后,并非均可以使用filter伪协议包含出源码的,由于allow_url_fopen和allow_url_include会影响到fopen和include等函数对于伪协议的支持。

allow_url_include影响php://input的使用,若不打开则没法使用。

当allow_url_fopen打开时,能够包含任意url。

例如只打开allow_url_include时,只能包含远程文件和使用php://input

举个例子

题目连接:http://level3.tasteless.eu/

题目直接给出了源码:

根据提示,用php://input 伪协议读取php.ini

 

找到SERVER["DOCUMENT_ROOT"],也就是网站的根目录,能够找到当前脚本的目录,以下:

还能够看到一些文件包含的配置:

  • rfi是关闭的,也就是allow_url_fopen为Off;
  • allow_url_include开启,可使用php://input伪协议来列出当前目录下的文件。

payload:

 //摘录自i春秋博客园

 

 

 

 

 

附上一题文件包含

题目提示flag在index.php里,直接访问这个页面并无,可是看到url

 

 

咱们直接经过封装协议去读取index.php的源代码

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

 

 这样咱们会获得base64后的源码,咱们去解码一下

 

 由此咱们获得flag

相关文章
相关标签/搜索