伪协议
PHP伪协议
作用#
PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器
作用域#
一般存在文件包含漏洞中
漏洞形成一般条件#
1.存在文件包含函数
2.开启相关配置
常见文件包含函数#
1、include() : 会将指定的文件读入并且执行文件中的程序,引入不存文件时产生一个警告且脚本还会继续执行
2、require() :会将目标文件的内容读入,并且把自己本身代换成这些读入的内容, 引入不存文件时导致一个致命性错误且脚本停止执行
3、include_once() 和 require_once() 的特性随上面,但是如果文件被包含一次(查询一遍已加载的文件列表, 确认是否存在, 然后再加载),则不会再被包含
其他函数
highlight_file() : 对文件进行语法高亮显示
show_source是highlight_file函数的别名
file_get_contents() : 将整个文件的html源码读入一个字符串
file() : 整个文件读入一个数组中,数组的每个单元对应文件内容的每一行
相关配置#
都影响远程文件(RFI)包含,不影响本地文件(LFI)包含
allow_url_fopen :是否允许将URL(HTTP,HTTPS等)作为文件打开处理
allow_url_include : 是否允许include()和require()函数包含URL(HTTP,HTTPS)作为文件处理 (php5.2后的版本默认为off )
常见伪协议#
一、php://input#
访问各种输入 流,可以直接读取到POST上没有经过解析的原始数据,将post请求的数据当作php代码执行,当设置enctype="multipart/form-data"则无法使用。
FORM元素的enctype介绍
enctype属性决定表单数据向服务器提交时所采用的编码类型
application/x-www-form-urlencoded : 数据被编码为名称/值对。这是标准的编码格式。
multipart/form-data : 数据被编码为一条消息,页上的每个控件对应消息中的一个部分。
text/plain : 数据以纯文本形式进行编码,其中不含任何控件或格式字符
当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串添加到url后面,用?分割第一个参数,用&连接多个参数,最后加载这个新的url,
当action为post时候,浏览器把form数据封装到http body中,然后发送到server
multipart/form-data用于传输文件,PHP会预先把请求体中的文件暂存到临时文件夹,并把参数解析到变量
$_POST
和$_FILES
中,php://input
获取原始请求的功能也随之失效
<?php
if (isset($_GET['file'])) {
if ( substr($_GET["file"], 0, 6) === "php://" ) {
require($_GET['file']);
} else {
echo "stop!!";
}
} else {
highlight_file(__FILE__);
}
二、php://filter#
php://filter可以获取指定文件源码,作为一个“中间流”来处理其他流(字符过滤器、转换过滤器、压缩过滤器、加密过滤器)
用法:
1.string filter(字符过滤器)
1.1 string.rot13 (对字符串执行 ROT13 转换)
例:php://filter/string.rot13/resource=flag.php
1.2 string.toupper (转大写)
例:php://filter/string.toupper/resource=flag.php
1.3 string.tolower (转小写)
1.4 string.strip_tags (去除 HTML 和 PHP 标记,尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果)
例:php://filter/string.strip_tags/resource=flag.php2.conversion filter (转换过滤器)
2.1 convert.base64-encode & convert.base64-decode (base64加密 base64解密)
例:php://filter/convert.base64-encode/resource=flag.php
2.2 convert.quoted-printable-encode & convert.quoted-printable-decode(在字符串后加=0A,及恢复)3.compression filter(压缩过滤)
3.1 zlib.deflate & zlib.inflate(压缩 解压)
例:php://filter/zlib.deflate/resource=flag.php php://filter/zlib.inflate/resource=flag.php
3.2 bzip2.compress & bzip2.decompress(zip 压缩 解压)4.encryption filter(加密过滤器)
<?php
$file = $_GET['file'];
if(isset($file)){
include($file);
}else{
echo "nothing!";
}
三、zip://#
zip:// 可以访问压缩包里面的文件。当它与包含函数结合时,zip://流会被当作php文件执行
注意:
1.zip://中只能传入绝对路径。
2.要用#分隔压缩包和压缩包里的内容,并且#要用url编码%23
3.只需要是zip的压缩包即可,后缀名可以任意更改。
4.相同的类型的还有zlib://和bzip2://
用法:
zip://[压缩包的绝对路径]#[压缩包内文件]
zip://D:\ys%23phpinfo.txt
四、data://与phar://#
data:// 和php://input类似,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行
data://,<?php phpinfo();
phar:// 有点类似zip://同样可以导致 任意代码执行
phar://zip.jpg/phpinfo.txt
作者:NTrack
出处:https://www.cnblogs.com/ntrack/p/17690496.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!