针对于file_put_contents的一些小技巧

最后更新 :2022.03.04

File_put_contents函数中遇见exit();的绕过技巧

1. 搭建环境代码


<?php

header("Content-type:text/html;charset=utf-8");

echo "测试站点";

$content=$_GET['cmd'];

$filename=$_GET['file'];

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

?>

源码如上所示,先进行正常的基本操作


正常请求访问之后会在本地生成一个1.php文件,但是会变成下面这样


页面正常访问这个文件是无法正常执行的,因为网页遇到exit();函数的时候就表示已经退出并且不会执行后面的函数了,所以phpinfo();是不会正常执行的


页面访问之后是没有办法正常执行的

2. 绕过方法

2.1使用php://filter伪协议

Php://filter是类似于中间流,用于处理其他的内容

Php://filter/write=convert.base64-decode/resource=文件名

Php://filter/write=convert.base64-encode/resource=php://input php的标准输入流



Base64编码是4位开始解码的,phpexit是7位所以我们需要在前补一位就是a,这样前面的才会被base64进行解码

Phpexit被解码成乱码这样php就不会执行前面的内容只会执行我们后面的内容了


2.使用rot13编码进行绕过

Php://filter/wirte=string.rot13/resource=php://input 使用rot13进行编码绕过

Phpinfo进行rot13编码

<?cuc cucvasb();?>


此方法需要未开启php.ini中的short_open_tag短标签



这样前面的内容就不会被解析,开启short_open_tag下的话<??>也会被解析为正常php代码,关闭了之后前面编码过的内容就不会被当作php代码解析执行


Iconv字符编码替换绕过

通过不同编码器的字符转换将<?php exit();转换为不认识的字符集就可以绕过了



所以修改一下代码,使用convert.iconv.UCS-2LE.UCS-2BE/resource=php://input就可以了

Php://filter/write=convert.iconv.UCS-2LE.UCS-2BE|转码过的phpinfo/resource=php://input即可


这样我们再去访问网站的文件,就会生成如下所示的内容


再去网页上访问页面即可


这样就访问成功了

还可以使用UCS-4LE和UCS-8BE的编码转换进行绕过

3. 组合拳进行绕过

Php://filter是可以指定多个过滤器的,所以我们可以指定多个过滤器进行执行绕过

Strip_tags可以去除xml标签代码,php的<??>这种格式算是xml代码,所以我们只需要构造闭合<?php exit();?>这样就可以去除掉了,后面在接上编码过的内容,编码的内容是不会被清除的

Php://filter/write=string.strip_tags|convert.base64-decode/resource=php://inupt标准输入


生成的文件执行如下所示:


生成的文件内容

- END -

看更多