本文最后更新于 38 天前,其中的信息可能已经有所发展或是发生改变。
file_put_contents($filename,”<?php exit();”.$content);
前提就是$filename和$content可控
相对简单来说就是要把<? php exit();给干掉
所以我们要利用php://filter协议可以写入文件
那么原理是什么呢?
通过伪协议把文件当作文本流、非 PHP 代码、压缩文件等其他形式解析,从而避免 PHP 正常解析 exit() 语句!
也可以这么理解,用协议的话会用过滤器进行编码,目标就是把<? php exit();解码成php不认识的字符,而我们构造的内容可以正常的解码出来
我去参考了P牛的文章
<? php exit();
实际上是一个XML标签(我的理解是它符合XML中的写法),然后就可以利用strip_tags函数去除它
再解释一下strip_tags函数
strip_tags() 是 PHP 的一个函数,用来去除字符串中的 HTML 和 PHP 标签,也可以去除XML标签,其实只要是这样的<tag>就会给去除
示例:
$string = "<b>Hello</b> <i>world</i>";
echo strip_tags($string); // 输出: Hello world
echo strip_tags($string, '<b>'); // 输出: <b>Hello</b> world
刚好php://filter就是支持这个方法的
php允许使用多个过滤器,可以先将webshell用base64编码,在调用完成strip_tags后再进行base64-encode
但是注意base64编码有个问题,就是特殊符号没办法进行编码,而且base64编码是以=作为结尾的,所以正常解码到=就会解码结束,所以会导致我们过滤器解码失败,从而报错
同时也可以使用rot13编码完成
php://filter/write=string.rot13|cuc cucvasb();|/resource=shell.php