伪协议:PHP带有很多内置URL风格的封装协议,可用于类似fopen()、copy()、file_exists() 和 filesize()的文件系统函数。当遇到文件包含时,我们可以这个特性来完成我们需要的指令。
php://input协议:可以读取没有处理过的POST数据,可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。
file://协议: file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响
使用:file:// [文件的绝对路径和文件名]
例子:http://127.0.0.1/cmd.php?file=file://D:/soft/phpStudy/WWW/phpcode.txt
data://协议:
例子:
http://127.0.0.1/code/1.php?file=data://text/plain,<?php phpinfo()?>
http://127.0.0.1/code/1.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
php://filter 是一种设计用来允许过滤器程序在打开时成为流的封装协议。这对于单独具有完整功能的文件函数例如 readfile(),file() 和 file_get_contents()很有用,否则就没有机会在读取内容之前将过滤器应用于流之上。
php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了
使用不同的参数可以达到不同的目的和效果:
resource=<要过滤的数据流> 指定了你要筛选过滤的数据流。 必选
read=<读链的筛选列表> 可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选
write=<写链的筛选列表> 可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选
例子1:?c=includeKaTeX parse error: Expected 'EOF', got '&' at position 10: _GET[0]?>&̲0=php://filter/…_GET[0]?>&0=php://filter/read=convert.base64-encode|string.rot13/resource=flag.php 释义:源等于flag.php ,读出方法为base64 编码和string.rot13
关于resource:resource= (required) 此参数必须位于 php://filter 的末尾并且需要指向向要过滤的流。