Пример: SQL закачка приводит к 500 - PullRequest
0 голосов
/ 12 июля 2020

Фон

Я сделал простую страницу входа в систему, чтобы протестировать SQL инъекцию, но выполнение, похоже, не работает. Я создал страницу html, на которой, когда пользователь нажимает на нее, он должен иметь возможность ввести имя пользователя и нажать кнопку отправки, тем самым зарегистрировав их на сайте.

Я ожидал, что инъекция 'or 1=1 -- будет означать, что если я отправлю пользователя с проверкой имени пользователя, то запрос SQL приведет к

SELECT * FROM users WHERE userid = 'test' или 1 = 1 - AND password = '$ ha sh '

, что должно означать, что мой пользователь test аутентифицирован. Однако он выдает 500 там, где есть знаки +, где интервал в инъекции.

Я не уверен, связаны ли знаки + с ошибкой 500, поскольку это постоянный URL кодировка, но я не могу не задаться вопросом, почему я не могу войти в систему.

Мой параметр входа в запрос выглядит так:

login: "test'or+1=1+--"

Кто-нибудь знает, почему этот эксплойт не работает?

зло. html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script>
  function attack() {
    document.querySelector('#login').value += "'or 1=1 --";
  }
</script>
</head>
<body>
<form action="http://example.com/" onsubmit="attack();" method="POST">
  <input name="login" id="login" value="">
  <button>Submit</button>
</form>
</body>
</html>

логин. php

function login($username, $password) {
    $sql = "SELECT * FROM users WHERE userid='$username'";
    $result = $this->db->query($sql);
    $user = $result->next();
    if (!$user) {
        return false;
    }
    $salt = $user['salt'];
    $hash = md5($salt.$password);
    $sql = "SELECT * FROM users WHERE userid='$username' AND password='$hash'";
    $userdata = $this->db->query($sql)->next();
    if ($userdata) {
    // user is logged in
    // doStuff()
    }
}
...