前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP伪协议的几种使用姿势

PHP伪协议的几种使用姿势

作者头像
Andromeda
发布2022-10-27 14:20:23
1.4K0
发布2022-10-27 14:20:23
举报
文章被收录于专栏:Andromeda的专栏Andromeda的专栏

常见的文件包含函数

首先归纳下常见的文件包含函数:includerequireinclude_oncerequire_oncehighlight_fileshow_sourcereadfilefile_get_contentsfopenfile

代码语言:javascript
复制
# 默认开启,该选项为on便是激活了URL形式的fopen封装协议使得可以访问URL对象文件等。
allow_url_fopen:on  
 
# 默认关闭,该选项为on便是允许包含URL对象文件等。
allow_url_include:off 

file://协议

file在allow_url_fopen和allow_url_include均off的情况下也可使用。

file://通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响。

文件系统是PHP使用的默认封装协议,展现了本地文件系统。 当指定了一个相对路径(不以/、\、\或 Windows 盘符开头的路径)提供的路径将基于当前的工作目录。 在很多情况下是脚本所在的目录,除非被修改了。 使用 CLI 的时候,目录默认是脚本被调用时所在的目录。

image-20220929095233012
image-20220929095233012

php://协议

不需要开启allow_url_fopen,仅php://inputphp://stdinphp://memoryphp://temp需要开启allow_url_include

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

php://input是个可以访问请求的原始数据的只读流。但是当enctype="multipart/form-data" 的时候php://input是无效的。

php://filterallow_url_fopenallow_url_includeoff也能正常使用。参数列表如下

image-20220929211446930
image-20220929211446930

例题【读取源代码】- php://filter

分析下代码,告诉我们flag/flag里面,需要使用php://伪协议。

image-20220929200611447
image-20220929200611447

使用php://filter读取源代码并进行base64编码输出。

payload为

代码语言:javascript
复制
?file=php://filter/read=convert.base64-encode/resource=/flag

得到的数据如下图所示,进行base64解码即可得到flag

image-20220929200926694
image-20220929200926694

例题【远程包含】- php://input

image-20220929201906743
image-20220929201906743

看下phpinfo,发现两个都开了。

php://input,然后post我们需要执行的代码,看下当前目录的文件。只有index.phpphpinfo.php

image-20220929202247216
image-20220929202247216

去上一级看看吧,发现了flag文件。

image-20220929202404681
image-20220929202404681

读取一下,拿到flag。

image-20220929202500175
image-20220929202500175

data://协议

根据官方文档,使用data://协议必须满足allow_url_fopenallow_url_include都开启。

image-20220929211949738
image-20220929211949738

以下代码打印data://的内容。

代码语言:javascript
复制
<?php
// 打印 "I love PHP"
echo file_get_contents('data://text/plain;base64,SSBsb3ZlIFBIUAo=');
?>

获取媒体类型。

代码语言:javascript
复制
<?php
$fp   = fopen('data://text/plain;base64,', 'r');
$meta = stream_get_meta_data($fp);

// 打印 "text/plain"
echo $meta['mediatype'];
?>
image-20220929213205809
image-20220929213205809

下面是是两个实例。

代码语言:javascript
复制
http://127.0.0.1/test.php?file=data://text/plain,<?php phpinfo()?>

http://127.0.0.1/test.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
image-20220929213621074
image-20220929213621074
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 常见的文件包含函数
  • file://协议
  • php://协议
    • 例题【读取源代码】- php://filter
      • 例题【远程包含】- php://input
      • data://协议
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档