php filter协议使用方法
偶尔躲躲乌云334 人气:0<?php highlight_file(__FILE__); error_reporting(0); $content = $_POST['content']; file_put_contents($_GET['filename'], "<?php exit; ?>".$content); ?>
base64加密
看文章的时候看到这样的一个代码,发现我们往文件中写入的时候,肯定会执行<?php exit;?>,可是这样就直接退出了就不能执行我们后面的命令,所以我们要想办法去绕过,或者说不执行这个exit
这道题,可控点有两个 filename 和 content,先直接给出payload ,然后解析
GET:?filename=php://filter/convert.base64-decode/resource=shell.php
POST:content=PD9waHAgcGhwaW5mbygpOz8+
上面的POST段为<?php phpinfo();?>加密段
看完大佬的文章理解:
base64只对64个字符解密,那如果不是64个字符中的,会直接忽略不计
并且base64中的字符,是要求是4个字节的倍数,如果实在不行则=补齐
随便输入一个都是4字节的倍数
<?php exit; ?>这个数据是固定的,而< > ; ?是64以外的字符,解码时会忽略,我们需要考虑的就是phpexit(空格不需要考虑),因为是4的倍数,如果在最后面系统自动加上=号的话,就改变了我们期望的值,所以需要我们手动进行修改,这时候我们可以在前面随便添加一个数据,让它与phpexit组合起来,成为一个乱码,不会影响后面的执行。
还有一道就是最近遇到的一道题目,和上面的思路差不多
eval("#".$_GET['flag]);
这个#影响了我后面get传参,不能进行命令执行
所以我的思路也是想如何绕过#,或者删除了它
可是,当时想了很久都没有想出来,还是大佬的提醒点了我一下
这既然是php里面的命令,我们完全可以把前面的闭合掉,然后自己再插入一句话木马
cmd=?><?php eval($_POST['shell']);
shell=system('ls /');进行这样的操作获得flag等等,当时脑袋瓦特了想不起来
rot13编码绕过
rot13编码的本质就是将字母左移13位。
如:<?php phpinfo();>
经过rot13编码后这样:<?cuc cucvasb();?>
用在php://filter
中的话格式大概为这样
php://filter/string.rot13/resource=文件名
这样的话上面的题目,用rot13绕过前面的 exit就会转成别的东西,而我们输入的则最后还是那串执行代码,这样也就可以绕过了
结果非常清楚,前面exit被认为是加密解密成这样,后面我们事先加了密,所以抵消,还是原来的
加强绕过exit
<?php highlight_file(__FILE__); error_reporting(0); $content = $_GET['content']; file_put_contents($content, "<?php exit();".$content);
代码换成了这样,好比上面让你叠飞机下面让你造飞机(-0-)
显而易见,只有content这一个传参点了
这种就是加了一个write直接写入文件,然后红色部分/可以换成别的管道符,只要和rot13隔开就行
convert.iconv.
1.usc-2
这个编码就是2个为一组交换字符的位置(空格也会交换)
为什么我们可以把filter直接写入,因为写入以后只有我们输入的一句话木马会被执行,别的就相当于乱码一样
2.usc-4
就是换成了4个字符一组交换
总结:我们的思路其实都是相同的,通过某一个手段把exit绕过,然后执行我们的命令,其实就是用一些编码的特性,base64 rot13 usc-2 usc-4,都会把exit变成别的乱码一般。
加载全部内容