У меня есть следующий код, восприимчивый к 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;
Просто добавив идентификатор пользователя, к которому вы хотите получить доступ, и точку с запятой, вы получите доступ, если вы только введете идентификатор пользователя(без точки с запятой) вы получаете сообщение «У вас нет разрешения видеть этого пользователя».
Я хотел бы знать, почемув коде действует так.Я имею в виду:
Метод is_numeric
просто игнорирует точку с запятой и возвращает истину, потому что $id
начинается с числа?
Послеis_numeric($id) &&
как вызов $id
не нарушает код, если он возвращает точку с запятой непосредственно перед оператором !=
?Я не получаю функцию точки с запятой в этой части кода
Как точка с запятой пропускает сравнение !=
, так что мы получаем сведения о пользователе, о которых мы просимдБ?
Есть ли лучший способ выполнить SQL-инъекцию на этом этапе?