如何绕过我的登录脚本?

时间:2017-01-13 03:29:59

标签: php security sql-injection

为了更多地了解网络安全,我创建了一个故意不安全的脚本。

session_start();

if($_SESSION['userSession']) {
    header("location: home.php");
}


if($_POST) {
    $username = $_POST['username'];
    $password = $_POST['password'];

    $con = mysqli_connect("localhost", "myUsername", "myPassword", "myDatabase");
    if(!$con) {
        die("Error: " . mysqli_connect_error());
    }

    $query = "SELECT * FROM users WHERE username = '$username' && password='$password'";
    $result = mysqli_query($con, $query);
    $numResults = mysqli_num_rows($result);

    if($numResults == 1) {
        $row = mysqli_fetch_array($result, MYSQLI_ASSOC);
        $_SESSION['userSession'] = $row['id'];
        header("location: home.php");
    } else {
        echo "Error Logging In";
    }
    mysqli_close($con);
}

如您所见,我没有转义用户输入并且密码未经过哈希处理。 因此,我认为这应该是一个容易破解的登录。但是,我试图在用户名和密码字段中使用以下输入,但总是得到输出“Error Logging In”。

password' OR '1' = '1'";

我如何尝试绕过/破解我的登录脚本?

2 个答案:

答案 0 :(得分:1)

如果我们直接使用sql语句来获取用户名和密码字段,那么它可以绕过' OR '1' = '1模式,因为当你将' OR '1' = '1放在用户名和密码字段中时,值继承到sql语句和在该声明中,' or '1' = '1对于所有情况都是 true ,这是登录可以绕过的原因。

答案 1 :(得分:-1)

1.为避免sql注入问题,请使用PDO或prepared语句执行查询。 2.对存储在数据库中的密码添加加密

请参阅以下链接以获取准备好的声明:

http://php.net/manual/en/mysqli.prepare.php