万齐网站建设,小程序开发教程,微信订阅号关键网站,iis网站压缩php://filterphp://filter可以作为一个中间流来处理其他流#xff0c;具有四个参数:名称描述备注resource指定了你要筛选过滤的数据流必选read可以设定一个或多个过滤器名称#xff0c;以管道符(|)分隔。可选write可以设定一个或多个过滤器名称#xff0c;以管道符(|)分隔。…php://filterphp://filter可以作为一个中间流来处理其他流具有四个参数:名称描述备注resource指定了你要筛选过滤的数据流必选read可以设定一个或多个过滤器名称以管道符(|)分隔。可选write可以设定一个或多个过滤器名称以管道符(|)分隔。可选任何没有以 read 或 write 作前缀的筛选器列表会视情况应用于读或写链。巧用编码与解码$content ?php exit; ?;$content . $_POST[txt];file_put_contents($_POST[filename], $content);$content在开头增加了exit过程导致即使成功写入一句话也执行不了(这个过程在实战中十分常见通常出现在缓存、配置文件等等地方不允许用户直接访问的文件都会被加上if(!defined(xxx))exit;之类的限制)。但是这里的$_POST[filename]是可以控制协议的可以使用php://filter流的base64-decode方法将$content解码利用php base64_decode函数特性绕过。base64编码中只包含64个可打印字符而PHP在解码base64时遇到不在其中的字符时将会跳过这些字符仅将合法字符组成一个新的字符串进行解码。一个正常的base64_decode实际上可以理解为如下两个步骤$_GET[txt] preg_replace(|[^a-z0-9A-Z/]|s, , $_GET[txt]);base64_decode($_GET[txt]);所以当$content被加上了?php exit; ?以后我们可以使用 php://filter/writeconvert.base64-decode 来首先对其解码。在解码的过程中字符、空格等一共有7个字符不符合base64编码的字符范围将被忽略所以最终被解码的字符仅有“phpexit”和我们传入的其他字符。“phpexit”一共7个字符因为base64算法解码时是4个byte一组所以给他增加1个“a”一共8个字符。这样phpexita被正常解码而后面我们传入的webshell的base64内容也被正常解码。结果就是?php exit; ?没有了。pyload:txtaPD9waHAgcGhwaW5mbygpOyA/Pgfilenamephp://filter/writeconvert.base64-decode/resourceshell.php利用字符串操作方法?php exit; ?实际上是一个XML标签既然是XML标签我们就可以利用strip_tags函数去除它而php://filter刚好是支持这个方法的。编写如下测试代码即可查看 php://filter/readstring.strip_tags/resourcephp://input的效果echo readfile(php://filter/readstring.strip_tags/resourcephp://input);可见?php exit; ?被去除了。但回到上面的题目我们最终的目的是写入一个webshell而写入的webshell也是php代码如果使用strip_tags同样会被去除。万幸的是php://filter允许使用多个过滤器我们可以先将webshell用base64编码。在调用完成strip_tags后再进行base64-decode。?php exit; ?在第一步被去除而webshell在第二步被还原。最终的数据包如下pyload:txtPD9waHAgcGhwaW5mbygpOyA/Pgfilenamephp://filter/writestring.strip_tages | convert.base64-decode/resourceshell.php利用rot13操作方法原理和上面类似核心是将“死亡exit”去除。?php exit; ?在经过rot13编码后会变成?cuc rkvg; ?在PHP不开启short_open_tag时php不认识这个字符串当然也就不会执行了pyload:txt?cuc cucvasb(); ?filenamephp://filter/writestring.rot13/resourceshell.php