这种情况和上面第一种便有点不同了,因为是一个变量,但还是可以利用php伪协议进行嵌套过滤器来消除死亡代码的,看了s1mple师傅的方法,还是可以利用.htaccess进行预包含,然后读取flag。
0x01:.htaccess预包含绕过
payload:
?content=php://filter/string.strip_tags/?>php_value auto_prepend_file D:lag.php%0a%23/resource=.htaccess
可以直接自定义预包含文件,这里直接包含了.htaccess导致了所有文件都包含flag.php文件
0x02:base64编码绕过
既然变成了一个变量,那么首先想到的payload便是:
php://filter/convert.base64-decode/PD9waHAgcGhwaW5mbygpOz8+/resource=Sn0w.php但是有一个问题,可以创建文件,但是无法写入内容,查看了cyc1e师傅的博客,发现问题是出在=号上,因为默认情况下base64编码是以=作为结尾的,在正常解码的时候到了 =就解码结束了,在最后获取文件名的时候因为resource=中含有等号,所以以为解码是结束了,导致过滤器解码失败,从而报错,内容由于解码过程出错了,所以就都丢弃了。
所以现在问题就转变为了只要能去掉这个等号,就可以将内容写进去,可以看下这种方法:
php://filter/<?|string.strip_tags|convert.base64-decode/resource=?>PD9waHAgcGhwaW5mbygpOz8%2B.php如果按照之前的思路是先闭合死亡代码,然后再使用过滤器去除html标签,最后再进行解码,但仔细观察这个payload并非是那种解法,而是直接在内容时,就将我们base64遇到的等号这个问题直接写在<? ?>中进行过滤掉,然后base64-decode再对原本内容的<?php exit();进行转码,从而达到分解死亡代码的目的。
除此之外还可以使用之前的思路来做,既然base64编码写在里面不行,那么就直接放在外面,然后搭配一下过滤器
php://filter/string.strip.tags|convert.base64-decode/resource=?>PD9waHAgcGhwaW5mbygpOz8%2B.php先闭合死亡代码,然后进行解码,这样便可以写入到文件中去,但访问的话会出现问题,查看s1mple师傅的方法,发现可以通过使用伪目录的方法,从而绕过去
php://filter/write=string.strip_tags|convert.base64-decode/resource=?>PD9waHAgcGhwaW5mbygpOz8%2B/../Sn0w.php将前面的一串base64字符和闭合的符号整体看作一个目录,虽然没有,但是后面重新撤回了原目录,生成Sn0w.php文件;从而就可以生成正常的文件名,上面的那种方法也可以使用这种伪目录的方法解决访问问题。
0x02:rot13编码绕过
rot13则无需考虑=号问题
?content=php://filter/string.rot13/<?cuc cucvasb();?>/resource=1.php
0x03:iconv字符编码绕过
在php中iconv函数库能够完成各种字符集间的转换
在该函数库下有一个convert.iconv.这样的过滤器,这个过滤器需要 php 支持 iconv,而 iconv 是默认编译的。使用convert.iconv.*过滤器等同于用iconv()函数处理所有的流数据。
iconv ( string $in_charset , string $out_charset , string $str ) : string
将字符串 str 从 in_charset 转换编码到 out_charset。
那接下来的思路就很明显了,就是借用此过滤器,从而进行编码的转换,转换掉死亡代码,写入自己的shell,首先先要了解一下UCS的两种编码格式
UCS有两种格式 UCS-2和UCS-4 UCS-2就是用两个字节编码 UCS-4就是用四个字节编码先来看一下利用这个函数即不同的格式转换后的结果
第二个之所以要加上两个字符,是因为UCS-4对目标字符串是4位一反转,所以要注意这里的恶意代码要是4的倍数,所以这里需要补上两个字符
那接下来就用过滤器将这些编码后的结果再转回去不就形成了我们想要写入的内容
UCS-2
对目标字符串进行2位一反转
payload:
php://filter//convert.iconv.UCS-2LE.UCS-2BE|?<hp phpipfn(o;)>?/resource=2.php