SQL-инъекция с password_verify () - PullRequest
0 голосов
/ 08 июня 2018

Я создаю веб-сайт и хочу предотвратить внедрение SQL-кода.У меня есть код, который принимает данные POST, делает запрос MYSQL, чтобы проверить это.Затем он запускает функцию mysqli_num_rows (), а затем выполняет password_verify ().

Вот мой код:

<?php
$Username = $_POST['Username'];
$Password = $_POST['Password'];
$Connect = mysqli_connect('localhost', 'user', 'pass', 'DB');
$sql = "SELECT * FROM table WHERE Username = '$Username'";
$output = mysqli_query($Connect, $sql);
if (mysqli_num_rows($output) > 0) {
    while($row = mysqli_fetch_assoc($output)) {
        if (password_verify($Password, $row['Password'])) {
            $_SESSION = $row;
            header('Location: Account.php');
        } else {
            echo 'Invalid Username or Password';
        }
    }
} else {
    echo 'Invalid Username or Password';
}

?>

Мне было интересно, есть ли способ обойти password_verify () функция с SQL-инъекцией?

Спасибо

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Ваш код несколько подозрительный.Почему вы позволите дублировать имена пользователей?Это может показаться комментарием, но это довольно важно для вопроса, который вы задали.Код, который вы показали нам, уязвим для инъекций.и только исправление проблемы, если вы знаете, что она может быть использована, не является правильным подходом.

В дополнение к грубому принуждению проверки каждого пароля, хранящегося в вашей базе данных, путем отправки anything' OR 'A'='A злоумышленник может отправитьимя пользователя и выбранный хешированный пароль в UNION - учтите:

 SELECT * FROM table 
 WHERE Username = 'xxx'
 UNION SELECT 'root' AS username, 
 '$6$ErsDojKr$7wXeObXJSXeSRzCWFi0ANfqTPndUGlEp0y1NkhzVl5lWaLibhkEucBklU6j43/JeUPEtLlpRFsFcSOqtEfqRe0' 
 AS Password'

При правильном экранировании данных, либо с помощью mysqli_real_escape_string (), либо с помощью привязки параметров устраняются обе проблемы, вы все равно должны убедиться, что ваши имена пользователей уникальны и только проверяютмаксимум по одной строке для каждой попытки аутентификации.

0 голосов
/ 11 июня 2018

Мне было интересно, есть ли способ обойти функцию password_verify() с помощью SQL-инъекции?

Да, по моде.Можно встроить специально созданные данные в результаты запроса, используя ввод в виде строк:

$Username = "' UNION SELECT 1, 'username', 'fake password hash', …, '";

, что приводит к запросу

SELECT * FROM table WHERE username = ''
UNION SELECT 1, 'username', 'fake password hash', …, ''

Это можно использовать для вводаПоддельная строка, содержащая результаты с хешем пароля, пароль которого известен злоумышленнику.

password_verify() не защищает вас от внедрения SQL.Используйте готовые заявления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...