伪协议

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_get_contents函数介绍

file() : 整个文件读入一个数组中,数组的每个单元对应文件内容的每一行

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__);
}

image-20230821100527617

image-20230821100605720

二、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.php

2.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://filter

<?php
    $file = $_GET['file'];
    if(isset($file)){
        include($file);
    }else{
        echo "nothing!";
    }

image-20230821111534392

三、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();

data://介绍

phar:// 有点类似zip://同样可以导致 任意代码执行

phar://zip.jpg/phpinfo.txt

phar://介绍

posted @ 2023-09-10 00:16  ntrack  阅读(22)  评论(0编辑  收藏  举报