网站黑客的用户名,附加信息和密码更改的问题


Site hacked username, additional info and password changed question?

我想知道是什么允许一个用户入侵我的网站,他们改变了我的用户名,个人信息和密码。有人能给我一些建议吗?我使用PHP MySQL和HTMLPURIFIER。

这是登录脚本。

<?php
if (isset($_POST['submitted'])) { // start of submit conditional.
    require_once (MYSQL);
    // Validate the username or email address:
    if (!empty($_POST['login']) && strlen($_POST['login']) <= 255) {
        $e = mysqli_real_escape_string($dbc, $purifier->purify(strip_tags($_POST['login'])));
    } else if(!empty($_POST['login']) && strlen($_POST['login']) >= 256) {
        $e = FALSE;
        echo '<p>Your username or email address cannot exceed 255 characters!</p>';
    } else {    
        $e = FALSE;
        echo '<p>You forgot to enter your username or email address!</p>';
    }
    // Validate the password:
    if (!empty($_POST['pass']) && strlen($_POST['pass']) <= 255) {
        $p = mysqli_real_escape_string($dbc, $_POST['pass']);
    } else if(!empty($_POST['pass']) && strlen($_POST['pass']) >= 256) {
        $p = FALSE;
        echo '<p>Your password cannot exceed 255 characters!</p>';
    } else {
        $p = FALSE;
        echo '<p>You forgot to enter your password!</p>';
    }
    if(($e != FALSE) && ($p != FALSE)) { // check pass
        $pass_salt = "SELECT users.password, users.salt FROM users JOIN contact_info ON contact_info.user_id = users.user_id WHERE (contact_info.email = '" . $e . "' OR users.username = '" . $e . "') AND users.active IS NULL";
        $ph = mysqli_query($dbc, $pass_salt) or trigger_error("Query: $pass_salt'n<br />MySQL Error: " . mysqli_error($dbc));
        while($row = mysqli_fetch_array($ph)){ 
            $password = $row['password'];
            $salt = $row['salt'];
        }
        if(!empty($salt)) {
            $sha512 = hash('sha512', $p . $salt);
        }
        if(!empty($password) == !empty($sha512)){
            $user_pass = TRUE;
        } else {
            $user_pass = FALSE;
        }
    }

    if(isset($user_pass) && ($user_pass == TRUE) && !empty($salt)) { // If everything's OK.
        // Query the database:
        $q = "SELECT users.user_id, users.first_name, users.user_level FROM users JOIN contact_info ON contact_info.user_id = users.user_id WHERE (contact_info.email = '" . $e . "' OR users.username = '" . $e . "') AND users.password = '" . $sha512 . "' AND users.active IS NULL";        
        $r = mysqli_query ($dbc, $q) or trigger_error("Query: $q'n<br />MySQL Error: " . mysqli_error($dbc));

        if (@mysqli_num_rows($r) == 1) { // A match was made.
            // Register the values & redirect:
            $_SESSION = mysqli_fetch_array ($r, MYSQLI_ASSOC); 
            // check if user is logged in then update the old login date
            $u = "UPDATE users JOIN contact_info ON contact_info.user_id = users.user_id SET users.last_login = NOW(), users.deletion = 0, users.deletion_date = NULL WHERE (contact_info.email = '" . $e . "' OR users.username = '" . $e . "') AND users.password = '" . $sha512 . "' AND users.active IS NULL"; 
            // save the info to the database
            $r = mysqli_query ($dbc, $u);
            mysqli_free_result($r);
            mysqli_close($dbc);
            $url = BASE_URL . 'home/index.php'; // Define the URL:
            header("Location: $url");
            exit(); // Quit the script.
        } else { // No match was made.
            echo '<p>Either your username, email address or password entered do not match those on file or you have not yet activated your account.</p>';
        }
    } else { // If everything wasn't OK.
        echo '<p>Please try again.</p>';
    }
    mysqli_close($dbc);
} // end of submit conditional.
?>

您应该了解SQL注入。这是我首先想到的(注意到MySql的使用)。为了防止这种情况,您必须通过使用mysql_real_escape_string()(不同的mysql_escape_string()被认为是不推荐的)来消毒用户输入。尽管有这种解决方案,我还是建议您使用PDO或mysql(我通常不鼓励使用这种方法),以便通过使用准备好的语句来修复SQL注入问题。

那么你应该意识到XSS(跨站点脚本)可能已经在你的代码中"注入"了某种恶意的Javascript脚本。你可以用htmlspecialchars()解决这个问题,使HTML标签(如<script>)不被认为是HTML标签。

还可以看看PHP的漏洞列表。

注:

为了使您的代码更具可读性和"正确",我建议您将strlen($_POST['login']) >= 256更改为strlen($_POST['login']) > 255,这是相同的,但使读者立即理解真正的限制不是256,而是255

首先,确保它们不能执行SQL注入。这可能就是他们所做的。这通常是由执行的输入字段引起的。这样做的人只需要输入一个SQL命令。

你可以在这里看到详细信息。

哦,欢迎来到StackOverflow.com!我希望你喜欢这个网站!

除了数据库的答案,请检查您是否有强密码连接到您的数据库。

我很确定这不会发生在最初的海报上,但众所周知,欺骗性的公司会向拥有网站的公司发送"账单"。"账单"中的小字将域名从该公司转移到欺诈公司。

这里有一个例子:美国域名注册骗局

如果您允许用户上传图像,那么您可能已经成为GIF漏洞的受害者。如果您的服务器设置不安全,查看包含PHP代码的GIF将执行该代码。检查是否可以在系统中找到任何.gif.php(或.php.gif)文件,如果黑客忘记自己清理,它们可能仍然在那里。

如果HTMLPURIFIER对所有面向数据库的输入正确实现,那么您应该评估如何传输您的登录。你是否在客户端提交之前预哈希?

我认为原因是表单上有一个未过滤的输入,它让一些SQL注入的代码通过。