PHP伪协议

感觉web里面还会经常遇到php伪协议的,总结一下。

php支持的协议如下:

  1. file:// — 访问本地文件系统
  2. http://— 访问Http(s)网址
  3. ftp://— 访问ftp(s) urls
  4. php:// — 访问各个输入/输出流(I/O streams)
  5. zlib:// — 压缩流
  6. data:// — 数据(RFC 2397)
  7. glob:// — 查找匹配的文件路径模式
  8. phar:// — PHP 归档
  9. ssh2:// — Secure Shell 2
  10. rar:// — RAR
  11. ogg:// — 音频流
  12. expect:// — 处理交互式的流

环境概要

PHP.ini:

allow_url_fopen:默认为on ,该选项为on便是激活了url 形式的 fopen封装协议,使得可以访问 url 对象文件等。

allow_url_include: 默认为off,不允许url里的封装协议访问对象文件。

0x00 是否截断问题:

不需要截断



include($_GET['file'])

?>

需要截断



include($_GET['file'].'.php')

?>

0x01 allow_url_fopen与allow_url_include是否开启的问题:

file://协议

file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响。

使用方法:
file:// [文件的绝对路径和文件名]
PHP伪协议_第1张图片

php://协议

条件:
不需要开启allow_url_fopen,仅php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include。

php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input,php://filter用于读取源码php://input用于执行php代码


php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。
例如,有时url会传入?file=php://filter/read=convert.base64-encode/resource=./cmd.php

PHP.ini:
php://filter在双off的情况下也可以正常使用;

allow_url_fopen :off/on
allow_url_include:off/on


php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。

PHP.ini:

allow_url_fopen :off/on
allow_url_include:on

例:
PHP伪协议_第2张图片


zip://, bzip2://, zlib://协议

PHP.ini:

zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用;

allow_url_fopen :off/on
allow_url_include:off/on

zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名。

(1)zip://协议

使用方法:
zip://archive.zip#dir/file.txt
zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]
(注:由于#在get请求中会将后面的参数忽略所以使用get请求时候应进行url编码为%23)
例:?file=zip://D:/soft/phpStudy/WWW/file.jpg%23phpcode.txt

(2)bzip2://协议

使用方法:
compress.bzip2://[压缩文件绝对路径或相对路径]
例:?file=compress.bzip2://D:/soft/phpStudy/WWW/file.jpg
?file=compress.bzip2://./file.jpg

(3)zlib://协议

使用方法:
compress.zlib://file.gz
例(同上):?file=compress.zlib://D:/soft/phpStudy/WWW/file.jpg


data://协议

PHP.ini:

data://协议必须双在on才能正常使用;

allow_url_fopen :on
allow_url_include:on
例:

http://localhost/test.php?file=data://text/plain,
http://localhost/test.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
http://localhost/test.php?file=data:text/plain,
http://localhost/test.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

借用一下FreeBuf的图最后总结一下
PHP伪协议_第3张图片
文章转载自FreeBuf一个大佬的文章https://www.freebuf.com/column/148886.html

你可能感兴趣的:(PHP,Web安全)