DevOps php伪协议 · damn1t

cheungfeng · August 19, 2019 · 9 hits

什么是伪协议

也不知道伪协议这个名字是从什么时候开始出现的,但我第一次接触还是在打 ctf 的时候,与其说伪协议,倒不如直接了解 PHP 支持的协议和封装的协议
官方文档给出了如下的 php 所支持的协议:

file:// — 访问本地文档系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文档路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流

php://

定义:

访问各个输入/输出流(I/O streams)

php://input

php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 命令。当 enctype=” multipart/form-data” 的时候 php://input 是无效的。

16 年华山杯

<?php
$user = $_GET["user"];
$file = $_GET["file"];
$pass = $_GET["pass"];
if(isset($user)&&(file_get_contents($user,'r')==="the user is admin")){
echo "hello admin!<br>";
include($file); //class.php
}else{
echo "you are not admin ! ";
}
?>

则可以利用 php://input:

除此自外,还可以进行代码执行,但是有一个利用条件:allow_url_include = On,开启之后可以 post 如:<? phpinfo(); ?>,可以查看网站配置信息

php://filter

php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文档函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。

相关参数

  • resource=<要过滤的数据流> 这个参数是必须的。它指定了你要筛选过滤的数据流。
  • read=<读链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
  • write=<写链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
  • <;两个链的筛选列表> 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。

iscc2018 中有两道题考察了文档包含漏洞的相关知识,其中就涉及到该协议
第一题较为简单,但是考虑到过滤,所以要对php进行处理,在f后写 payload:

f=PHP://filter/read=convert.base64-encode/resource=index

就可以解出来
第二题,直接给出解题链接

php://output

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

php://fd

php://fd 允许直接访问指定的文档描述符。 例如 php://fd/3 引用了文档描述符 3。

php://memory 和 php://temp

参考链接:
https://www.anquanke.com/post/id/146063#h3-16
https://mp.weixin.qq.com/s/RaxfIg9x5Rh1qjDgFBr82Q
https://www.jianshu.com/p/237804b9f19b
http://www.4o4notfound.org/index.php/archives/31/

No Reply at the moment.
You need to Sign in before reply, if you don't have an account, please Sign up first.