PHP伪协议(封装协议/内置协议)

PHP内置协议/封装协议/伪协议

PHP带有很多内置URL风格的封装协议,这类协议与fopen()、copy()、file_exists()、filesize()等文件系统函数所提供的功能类似;可结合文件包含进行漏洞利用

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://input——执行PHP代码

php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。 而且,这样的情况下 $HTTP_RAW_POST_DATA 默认没有填充, 比激活 always_populate_raw_post_data 潜在需要更少的内存。 enctype=“multipart/form-data” 的时候 php://input 是无效的。

使用php://input可以执行PHP语句,但使用这条语句时需要注意:php://input受限于allow_url_include选项。也就是说,只有在allow_url_include为On时才可以使用。

构造URL:http://www.xxser.com/index.php?page=php://input,并且提交数据为:<?php system ('net user');?>,如果提交<?fputs(fopen("shell.php","w"),"<?php eval($_POST['xxser']);?>")?>语句,将会在index.php所在的目录下生成shell.php

php://filter——读取源码

php://filter 是php中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取;根据名字filter,可以很容易想到这个协议可以用来过滤一些东西; 使用不同的参数可以达到不同的目的和效果:

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

主要有一下两个应用:
1、利用base64获得源码
2、通过读写编码实行绕过操作

  • base64获取源码
    通常会构造payload:‘php://filter/read=convert.base64-encode/resource=xxx.php’
    php://filter与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,阻止其不执行。从而导致任意文件读取。
    read=convert.base64-encode,用base64编码输出,不然会直接当做php代码执行,看不到源代码内容。
    php://filter协议,用base64编码的方式来读文件flag.php;这时页面会显示出源文件flag.php经过base64编码后的内容,然后经过base64解码就可以看到flag

    ctf练习题:buuctf web [ACTF2020 新生赛Include]一定要练习,用过之后才会印象深刻

  • 通过读写编码执行绕过操作
    详解php://filter以及死亡绕过

筛选过滤应用:
1、 字符串过滤器:
string.rot13 对字符串执行ROT13转换 string.toupper转换为大写
string.tolower 转换为小写 string.strip_tags去除html和php标记
2、 转换过滤器:
convert.base64-encode & convert.base64-decode :base64编码/解码
convert.quoted-printable-encode & convert.quoted-printable-decode:将quoted-printable 字符串转换为 8-bit 字符串
3、 压缩过滤器:
zlib.deflate和 zlib.inflate
bzip2.compress和 bzip2.decompress
4、 加密过滤器:
mcrypt.tripledes和mdecrypt.tripledes等

data:// 协议

  • 条件:
    allow_url_fopen:on
    allow_url_include :on

  • 作用:自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。

  • 用法:
    data://text/plain,
    data://text/plain;base64
    将读取后面base编码字符串后解码的数据作为数据流的输入

  • 练习题:buuctf web [ZJCTF 2019]NiZhuanSiWei

zip:// & bzip2:// & zlib:// 协议

  • 条件:
    allow_url_fopen:off/on
    allow_url_include :off/on
  • 作用:zip:// & bzip2:// & zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等。

http:// & https:// 协议

  • 条件:
    allow_url_fopen:on
    allow_url_include :on

  • 作用:常规 URL 形式,允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源。CTF中通常用于远程包含。

  • 用法:

    http://example.com
    http://example.com/file.php?var1=val1&var2=val2
    http://user:password@example.com
    https://example.com
    https://example.com/file.php?var1=val1&var2=val2
    https://user:password@example.com

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃_早餐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值