「作者主页」:士别三日wyx
「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者
「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》
php://filter
php:// 用来访问输入和输出流(I/O streams)。
输入/输出流也就是「数据流」,数据流可以是某个文件(
xx.php
)或某个url(
http://www.baidu.com
)。
php://filter 可以在访问数据流之前进行「过滤」,并指定过滤方式。
php://filter 有4个可用参数:
名称描述
resource=<要过滤的数据流>
这个参数是必须的。它指定了你要筛选过滤的数据流。
read=<读链的筛选列表>
该参数可选。可以设定一个或多个过滤器名称
write=<写链的筛选列表>
该参数可选。可以设定一个或多个过滤器名称
<;两个链的筛选列表>
任何没有以
read=
或
write=
作前缀 的筛选器列表会视情况应用于读或写链。
提示:read/write参数不是必须的,可以直接使用过滤器,比如
php://filter/convert.base64-encode/resource=hello.php
一、访问数据流
直接「读取」数据源的内容,resource 参数必须位于 php://filter 的末尾,并指定需要过滤筛选的数据流。
1)读取「url形式」的数据流。
<?php# 指定源文件,实际上没有应用过滤,会直接输出 http://www.baidu.com网页的内容# 等同于readfile('http://www.baidu.com');readfile('php://filter/resource=http://www.baidu.com');
因为没指定过滤条件弹了几条告警,不影响执行结果,不用管。
2)读取「文件形式」的数据流。
<?php# 指定源文件,实际上没有应用过滤,会直接输出 hello.php文件的内容# 等同于 include('hello.php');include('php://filter/resource=hello.php');
同样因为没指定过滤条件弹了几条告警,不影响执行结果,不用管。
二、过滤数据流
读取数据源之前,添加「过滤条件」。
1)以「大写字母」读取
http://www.baidu.com
页面的全部内容
<?phpreadfile("php://filter/read=string.toupper/resource=http://www.baidu.com");
2)以「小写字母」读取
hello.php
文件的全部内容
<?phpinclude("php://filter/read=string.tolower/resource=hello.php");
- 将
hello.php
文件的内容「base64加密」后读取出来。 include()包含的文件,默认会执行文件中的代码,但加密后的内容不会被执行,而是直接输出在页面中,复制后解密就能拿到被包含文件的内容。
<?phpinclude("php://filter/read=convert.base64-encode/resource=hello.php");
三、多个过滤条件
同时使用「多个过滤条件」时,使用管道符 | 分隔。
1)base64加密并且转换为大写
<?php
include('php://filter/read=convert.base64-encode|string.toupper/resource=hello.php');
按照「从左到右」的顺序过滤,过滤条件的顺序可能会影响过滤的结果,比如:先转换大写再过滤的话,输出的结果就会变成小写的base64编码。
四、过滤并写入数据流
write 参数,过滤指定字符,并将过滤后的结果「输出」到指定文件中。
1)过滤字符,并输出到 result.txt文件中。
<?phpfile_put_contents('php://filter/write=string.tolower/resource=result.txt','hello text');
五、过滤器
1、string.rot13
string.rot13 ,PHP4.3.0及以后版本,对数据流的内容进行「rot13编码」,等于用str_rot13() 函数编码。
ROT13(otate by 13 places)也叫回转13位,是一种替换式密码。
ROT13会把每一个字母替换成13位之后的字母,也就是把a换成n,b换成o,以此类推;如果超过了26个字母的范围,就会从开头重新开始。
ROT13转换对照表ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzNOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm
常用方式:rot13编码读取文件内容后,复制页面输出的编码后的内容,手动用str_rot13()函数解码。
# rot13编码后读取 hello.php文件的内容include('php://filter/read=string.rot13/resource=hello.php');# 手动复制编码后的结果,输出rot13解码后的内容。printstr_rot13("<?cuc
rpub 'uryyb.cuc文件的内容:uryyb grfg';");
2、string.toupper
string.toupper,PHP5.0.0及以后版本,将数据流转换成「大写」,类似于 strupper() 函数。
需要注意的是,string.tuupper不是直接将文件内容变成大写,而是先执行文件内容,再将执行后的结果转换成大写。
# string.touper过滤器将 hello.php文件内容转换成大写include('php://filter/read=string.toupper/resource=hello.php');echo"\n";# 手动复制 hello.php文件内容,并使用strtoupper()转换成大写echostrtoupper("<?php
echo 'hello.php文件的内容:hello test';");
3、string.tolower
string.tolower,PHP5.0.0及以后版本,将数据流转换成「小写」,类似 strtolower()函数。
和 string.toupper,也是先执行文件的内容,再将执行后的结果转换成小写。
4、convert.base64-encode
1)convert.base64-encode,对数据流的内容进行「base64编码」,相当于 base64_encode()函数。
hello.php文件
<?phpecho'hello.php文件的内容:hello test';
filter.php文件
<?phpinclude('php://filter/read=convert.base64-encode/resource=hello.php');
对 hello.php文件内容进行base64编码
2)编码后的内容可以使用 base64_decode()函数解码
printbase64_decode('PD9waHANCmVjaG8gJ2hlbGxvLnBocOaWh+S7tueahOWGheWuue+8mmhlbGxvIHRlc3QnOw0KDQoNCg0KDQo=');
5、convert.iconv.*
convert.iconv.*,将数据流的内容按照「指定字符编码」来转换,使用格式有两种:
格式一:
.
分隔
convert.iconv.<input-encoding>.<output-encoding>
格式二:
/
分隔
convert.iconv.<input-encoding>/<output-encoding>
比如,convert.iconv.utf-8*.utf-16* 的意思就是把文件的字符编码从 utf-8* 转换为 utf-16*
支持的字符编码有:
UCS-4*UCS-4BE
UCS-4LE*UCS-2UCS-2BE
UCS-2LE
UTF-32*UTF-32BE*UTF-32LE*UTF-16*UTF-16BE*UTF-16LE*UTF-7UTF7-IMAPUTF-8*ASCII*EUC-JP*SJIS*
eucJP-win*SJIS-win*ISO-2022-JPISO-2022-JP-MSCP932CP51932SJIS-mac(alias: MacJapanese)SJIS-Mobile#DOCOMO (alias: SJIS-DOCOMO)SJIS-Mobile#KDDI (alias: SJIS-KDDI)SJIS-Mobile#SOFTBANK (alias: SJIS-SOFTBANK)UTF-8-Mobile#DOCOMO (alias: UTF-8-DOCOMO)UTF-8-Mobile#KDDI-AUTF-8-Mobile#KDDI-B (alias: UTF-8-KDDI)UTF-8-Mobile#SOFTBANK (alias: UTF-8-SOFTBANK)ISO-2022-JP-MOBILE#KDDI (alias: ISO-2022-JP-KDDI)JISJIS-ms
CP50220
CP50220raw
CP50221CP50222ISO-8859-1*ISO-8859-2*ISO-8859-3*ISO-8859-4*ISO-8859-5*ISO-8859-6*ISO-8859-7*ISO-8859-8*ISO-8859-9*ISO-8859-10*ISO-8859-13*ISO-8859-14*ISO-8859-15*ISO-8859-16*
byte2be
byte2le
byte4be
byte4le
BASE64HTML-ENTITIES(alias:HTML)7bit
8bit
EUC-CN*CP936GB18030HZEUC-TW*CP950BIG-5*EUC-KR*UHC(alias:CP949)ISO-2022-KR
Windows-1251(alias:CP1251)
Windows-1252(alias:CP1252)CP866(alias:IBM866)KOI8-R*KOI8-U*
ArmSCII-8(alias: ArmSCII8)
版权归原作者 士别三日wyx 所有, 如有侵权,请联系我们删除。