这个主要是因为一道反序列化题出现这个函数的相关知识才去搜索了一下.
file_put_content和die(任意结束或者闭合php语言)结合,分为三种方式

1
2
3
4
5
file_put_contents($filename,"<?php exit();".$content);

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

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

对于第一种情况

文件名可控,文件内容可控

1.base64编码绕过

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

1
2
$filename='php://filter/convert.base64-decode/resource=s1mple.php';
$content = 'aPD9waHAgcGhwaW5mbygpOz8+';

content内base64为什么会前面多加一个小写a呢,因为base64在解码的时候是将4个字节转化为3个字节,方便他转化,不然就全是乱码了(乱码的只有die就可以了OVO),一个a不行就两个。

2.rot13编码绕过

和base64绕过的原理一样,但是这个编码方法并不会转化<?,因此会导致后方我们写入的代码失去作用。

3.。htaccess的预包含利用

利用 .htaccess的预包含文件的功能来进行攻破;自定义包含我们的flag文件。

1
2
3
$filename=php://filter/write=string.strip_tags/resource=.htaccess

$content=?>php_value%20auto_prepend_file%20G:\s1mple.php

同时传入如上的代码,首先来解释$filename的代码,这里引用了string.strip_tags过滤器,可以过滤.htaccess内容的html标签,自然也就消除了死亡代码;$content即闭合死亡代码使其完全消除,并且写入自定义包含文件
但是使用这个方法我们必须知道flag文件地址在哪里,还有string.strip_tags过滤器只是可以在php5的环境下顺利的使用,如果题目环境是在php7.3.0以上的环境下,则会发生段错误。导致写不进去;根本来说是php7.3.0中废弃了string.strip_tags这个过滤器

总结

暂时只遇到这第一种情况,参考博客https://xz.aliyun.com/t/8163#top-c
以后遇到其他情况也会逐渐补充