Понимание SQL-инъекций URL - PullRequest
       24

Понимание SQL-инъекций URL

0 голосов
/ 27 декабря 2018

У меня есть следующий код, восприимчивый к SQL-инъекциям:

$r = $db->query(sanitizeSQL("SELECT a.* FROM asistentes a WHERE a.id = $id"));
f ($row = $r->fetchArray()) { 
    $scope['asistente'] = $row; 
    if (is_numeric($id) && $id != $_SESSION['auth']) { 
        $error = 'You don't have permission to see this user'; 
    } 
}else { 
    $error = 'Wrong assistant'; 
}

Насколько я понял, код слаб для атаки SQL-инъекцией, потому что, хотя вы очищаете оператор запроса db-> с помощью фильтраsanitizeSQL (я думаю, что это закрытый метод, который они закодировали вместо собственного фильтра PHP), когда вы решаете, будет ли клиент иметь доступ к пользовательской информации, вы используете значение $id, введенное клиентом без очистки или очистки.так или иначе, отфильтровав его, поэтому возможный злоумышленник может ввести там любую команду SQL.

URL-адрес, который вы получите при успешном входе в систему:

10.14.79.2/?action=details&id=1

Я пробовал несколько способов получить доступ кпользователь, которого вы хотите, и способ, который работает следующим образом:

10.14.79.2/?action=details&id=3;

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

Я хотел бы знать, почемув коде действует так.Я имею в виду:

  1. Метод is_numeric просто игнорирует точку с запятой и возвращает истину, потому что $id начинается с числа?

  2. Послеis_numeric($id) && как вызов $id не нарушает код, если он возвращает точку с запятой непосредственно перед оператором !=?Я не получаю функцию точки с запятой в этой части кода

  3. Как точка с запятой пропускает сравнение !=, так что мы получаем сведения о пользователе, о которых мы просимдБ?

  4. Есть ли лучший способ выполнить SQL-инъекцию на этом этапе?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Вам лучше проверить допустимость переменной, прежде чем передавать ее в запрос.Это устранит риск внедрения SQL-кода, а также обеспечит более чистую логику, позволяющую отличить недопустимый идентификатор от пользователя с недостаточными разрешениями.

if (! is_numeric($id) ) {
    $error = 'You did not provide a valid id'; 
}
else {
    $r = $db->query(sanitizeSQL("SELECT a.* FROM asistentes a WHERE a.id = $id"));
    if ($row = $r->fetchArray()) { 
        $scope['asistente'] = $row;
        if ($id != $_SESSION['auth']) { 
            $error = 'You don't have permission to see this user'; 
        }
    }
}
0 голосов
/ 27 декабря 2018

Метод is_numeric просто игнорирует точку с запятой и возвращает true, потому что $ id начинается с цифры?

Нет.Когда вы передаете номер, номер проверяется, чтобы убедиться, что это правильный номер.Если это не число, то вторая проверка никогда не выполняется.Таким образом, выполняются следующие операции:

  • Если это номер, а НЕ правильный, вы видите сообщение «У вас нет прав доступа к этому пользователю».
  • Если это номер и правильный номер, вы НЕ увидите сообщение «У вас нет прав доступа к этому пользователю»
  • Если это НЕ номер,Вы НЕ видите сообщение «У вас нет прав на просмотр этого пользователя»

3; не число.Это означает, что применяется последний случай, входные данные никогда не проверяются, чтобы узнать, разрешено ли это или нет

После «is_numeric ($ id) &&» как вызов $ id не нарушает код, еслион возвращает точку с запятой перед оператором! =?Я не получаю функцию точки с запятой в этой части кода

Если $ id равен 3;, это означает, что это строка.Если бы он сравнивался с $_SESSION['auth'], он сравнивался бы как строка.Это не нарушает код.Этот пункт не важен, хотя, поскольку мы уже определили, что передача чего-либо, не являющегося числом, означает, что оно никогда не проверяется на правильность

Как точка с запятой пропускает сравнение! =, Так что мы получаемдетали пользователя, которые мы запрашиваем в БД?

Сравнение! = никогда не выполняется, если is_numeric () возвращает false.3; это не число.Итак, is_numeric () возвращает false

Есть ли лучший способ выполнить SQL-инъекцию на этом этапе?

Поставьте немного SQL после точки с запятой, если вы хотите ввестион

...