记一次web做题笔记:写shell

打开靶机查看源码
点击查看代码
<?php
/*
PolarD&N CTF
*/
highlight_file(__FILE__);
file_put_contents($_GET['filename'],"<?php exit();".$_POST['content']);
?>
解题方式
通过GET传参filename和POST传参content绕过file_put_contents()和exit()
.号用于拼接字符串
这里贴一下file_put_contents()函数的详解

也就是说,file_put_contents()会在我们要执行的代码段插入<?php exit();阻断代码执行
一开始我是想通过常规伪协议php://input去做的,但是因为exit()阻断,只能放弃。
之后查看其他师傅的wp发现了一些方法
在file_put_contents()中exit()的绕过技巧
(使用php://filter伪协议)
1.base64加密
利用base64解码,将exit()代码解码成乱码,使得php引擎无法识别

但同时因为base64在解码的时候是将4个字节转化为3个字节,又因为死亡代码只有phpexit()参与了解码,所以补上一位才可以完全转化

(上图除去a的base64加密前代码)
之后连接蚁剑getshell成功,拿到flag(看到其他师傅说也可以直接访问shell.php)
2.利用filter伪协议的多种过滤器过滤exit()
(第一次听这种过滤器,长知识了)
Strip_tags可以去除xml标签代码,php的这种格式算是xml代码,所以我们只需要构造闭合exit(),这样就可以去除掉了,后面接上编码过的内容,编码的内容不会被清除


浙公网安备 33010602011771号