File_put_contents函数中遇见exit();的绕过技巧 1. 搭建环境代码 class="ztext-empty-paragraph">
<?php header("Content-type:text/html;charset=utf-8"); echo "测试站点"; $content=$_GET['cmd']; $filename=$_GET['file']; file_put_contents($filename,'<?php exit();'.$content); ?> 源码如上所示,先进行正常的基本操作 class="ztext-empty-paragraph">
正常请求访问之后会在本地生成一个1.php文件,但是会变成下面这样 class="ztext-empty-paragraph">
页面正常访问这个文件是无法正常执行的,因为网页遇到exit();函数的时候就表示已经退出并且不会执行后面的函数了,所以phpinfo();是不会正常执行的 class="ztext-empty-paragraph">
页面访问之后是没有办法正常执行的 2. 绕过方法 2.1使用php://filter伪协议 Php://filter是类似于中间流,用于处理其他的内容 Php://filter/write=convert.base64-decode/resource=文件名 Php://filter/write=convert.base64-encode/resource=php://input php的标准输入流 class="ztext-empty-paragraph">
class="ztext-empty-paragraph">
Base64编码是4位开始解码的,phpexit是7位所以我们需要在前补一位就是a,这样前面的才会被base64进行解码 Phpexit被解码成乱码这样php就不会执行前面的内容只会执行我们后面的内容了 class="ztext-empty-paragraph">
2.使用rot13编码进行绕过 Php://filter/wirte=string.rot13/resource=php://input 使用rot13进行编码绕过 Phpinfo进行rot13编码 <?cuc cucvasb();?> class="ztext-empty-paragraph">
此方法需要未开启php.ini中的short_open_tag短标签 class="ztext-empty-paragraph">
class="ztext-empty-paragraph">
这样前面的内容就不会被解析,开启short_open_tag下的话<??>也会被解析为正常php代码,关闭了之后前面编码过的内容就不会被当作php代码解析执行 class="ztext-empty-paragraph">
Iconv字符编码替换绕过 通过不同编码器的字符转换将<?php exit();转换为不认识的字符集就可以绕过了 class="ztext-empty-paragraph">
class="ztext-empty-paragraph">
所以修改一下代码,使用convert.iconv.UCS-2LE.UCS-2BE/resource=php://input就可以了 Php://filter/write=convert.iconv.UCS-2LE.UCS-2BE|转码过的phpinfo/resource=php://input即可 class="ztext-empty-paragraph">
这样我们再去访问网站的文件,就会生成如下所示的内容 class="ztext-empty-paragraph">
再去网页上访问页面即可 class="ztext-empty-paragraph">
这样就访问成功了 还可以使用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标准输入 class="ztext-empty-paragraph">
生成的文件执行如下所示: class="ztext-empty-paragraph">
生成的文件内容
|