如何使用html表单元素而不是命令行调用php脚本?

时间:2011-06-30 15:12:36

标签: php

我管理了几个刚刚受到此处概述的黑客攻击的网站:http://frazierit.com/blog/?p=103

我需要清理已注入所有php文件的代码。

用户Crystaldawn在这里提供了一个清理脚本http://crystaldawn.net/fix_hack,但它需要通过我不熟悉的命令行运行。

问题:是否可以使用html表单提交按钮或类似方法执行此脚本(如下)?如果是这样,怎么样?

在此先感谢,非常感谢任何帮助,我需要清理8个网站,这可以节省我(和其他人)许多小时。

<?php
//Create back files?
define('CREATE_BACKUPS', FALSE);

if (!is_dir($argv[1]))
{
   echo "You must enter a valid path such as /home/infected_dir or infected_dir for this script to function.\n";
   exit;
}

//Search the path for all php files, opening each one, and checking to see if it's infected

//First, get an array list of all valid .php files.


$files = listdir($argv[1]);
foreach ($files as $filename)
{
   //We only need to check php files, so we add that here
   if (file_extension($filename) == 'php')
   {
      //This is a php file so lets check it to see if it's infected.
      $contents = file_get_contents($filename);
      $backup = $contents;

      //There will always be 2 opening tags in an infected file and since the hack is always at the top, it's easiest to test for this right away.
      $test = between('<?php', '<?php', $contents);

      //This particular hack likes to use toolbarqueries so we test to see if our chunk is an infected chunk.  If your website uses this url somehow, then add extra if statements as necessary.
      if (after('toolbarqueries', $test))
      {
         //This chunk is infected.  So lets replace it and resave the file.
         $contents = str_replace('<?php'.$test.'<?php', '<?php', $contents);

         //Now save it! Woohoo!
         file_put_contents($filename, $contents);
         if (CREATE_BACKUPS)
         {
            file_put_contents($filename.'.orig', $backup);
         }

         echo "$filename has been cleaned.\n";
      }
   }
}

function after ($this, $inthat)
    {
        if (!is_bool(strpos($inthat, $this)))
        return substr($inthat, strpos($inthat,$this)+strlen($this));
    };

    function after_last ($this, $inthat)
    {
        if (!is_bool(strrevpos($inthat, $this)))
        return substr($inthat, strrevpos($inthat, $this)+strlen($this));
    };

    function before ($this, $inthat)
    {
        return substr($inthat, 0, strpos($inthat, $this));
    };

    function before_last ($this, $inthat)
    {
        return substr($inthat, 0, strrevpos($inthat, $this));
    };

    function between ($this, $that, $inthat)
    {
     return before($that, after($this, $inthat));
    };

    function between_last ($this, $that, $inthat)
    {
     return after_last($this, before_last($that, $inthat));
    };

    // USES
    function strrevpos($instr, $needle)
    {
        $rev_pos = strpos (strrev($instr), strrev($needle));
        if ($rev_pos===false) return false;
        else return strlen($instr) - $rev_pos - strlen($needle);
    };

    function listdir($dir='.') {
    if (!is_dir($dir)) {
        return false;
    }

    $files = array();
    listdiraux($dir, $files);

    return $files;
}

function listdiraux($dir, &$files) {
    $handle = opendir($dir);
    while (($file = readdir($handle)) !== false) {
        if ($file == '.' || $file == '..') {
            continue;
        }
        $filepath = $dir == '.' ? $file : $dir . '/' . $file;
        if (is_link($filepath))
            continue;
        if (is_file($filepath))
            $files[] = $filepath;
        else if (is_dir($filepath))
            listdiraux($filepath, $files);
    }
    closedir($handle);
}

function file_extension($filename)
{
   $info = pathinfo($filename);
   return $info['extension'];
}
?>

3 个答案:

答案 0 :(得分:1)

这只是一个脚本。将它作为“cleanupscript.php”填充到您的文档根目录中,然后将浏览器指向它:

http://yoursite.com/cleanupscript.php

无需表单或命令行访问。

只需将$argv[1] = '/path/to/your/site/document/root';放在脚本的开头,因此它不依赖于命令行参数。

答案 1 :(得分:0)

您可以在$_POST中找到表单数据。因此,如果您制作表单并将其action设置为您的脚本,则可以在$_POST中找到所有字段。

从那里,你应该能够修改你的脚本。

答案 2 :(得分:0)

在目前的形式中,此脚本无法通过Web服务器有效运行。有两个原因:

  1. 脚本使用$ argv,它是对命令行参数的引用。如果您通过Web服务器(作为HTML页面)运行脚本,则不会填充该变量。

  2. 该脚本修改文件。您的Web服务器用户可能有也可能没有编辑这些文件的权限。

  3. 要从命令行执行此脚本,请打开shell并执行

    php <script_name> <path_to_direcotry>
    

    其中<script_name>是Crystaldawn脚本的名称,<path_to_directory>是您要清理的目录。

    如果无法通过命令行运行此命令,则需要将对$ argv的引用更改为:

    $_GET['directory'];
    

    并像这样调用脚本:

    http://yourwebsite/script_name.php?directory=/home/www/
    

    如果您使用此方法,则需要添加验证和转义,以确保某人无法为directory.输入无效或危险的值

    其次,您需要检查文件权限,以确保Web服务器用户可以编辑您指定的目录中的文件。