Как сделать мою страницу входа уязвимой для SQL-инъекций? - PullRequest
0 голосов
/ 21 марта 2019

Здравствуйте, я работаю над проектом, и мне нужно сделать эту страницу входа в php уязвимой sqli .. Я старался изо всех сил, чтобы удалить функции, которые экранируют специальные символы Но когда я пытаюсь ввести

' or '1' = '1' 

ничего не случилось ... login.php:

 include ("config.php"); 

  $username = $_POST['username']; 
  $password = $_POST['password']; 

  $sql = "SELECT id FROM users WHERE username = '$username' and password = '$password'"; 
  $result = mysqli_query($db,$sql);
 $count = mysqli_num_rows($result);

  // If result matched $username and $password, table row must be 1 row

  if($count == 1) {  
     session_register("username");
     $_SESSION['login_user'] = $username;

     header("location: welcome.php"); //set a http header
  }else {
      header("location: failed.php");
  }

Ответы [ 3 ]

2 голосов
/ 21 марта 2019

Но когда я пытаюсь ввести ' or '1' = '1'

Попробуйте это

 $_POST['username'] = "' OR 1 LIMIT 1 --";

Вы можете даже использовать / добавить OFFSET, чтобы выбрать пользователя, которого вы хотите(по строке).

SELECT id FROM users WHERE username = '' OR 1 LIMIT 1 --' and password = '$password'

Тогда (из-за LIMIT 1)

 if($count == 1) {

Верно.-- - это начало встроенного комментария в SQL, поэтому остальная часть запроса игнорируется.Который имеет очевидные преимущества, поскольку мы можем сократить или просто запрос.Чем меньше условий, тем лучше, и мы хотим получить доступ к концу запроса для Предела и Смещения.

Это также иллюстрирует глупость поиска пароля.Если это было проверено в коде, это не будет входить в систему. Но потому что это не так, это будет, время атаки и тому подобное.

1 голос
/ 21 марта 2019

Если вы вводите такой SQL в поле пароля, ваш запрос не будет выполнен.

С ' or '1' = '1'

Ваш запрос станет:

SELECT id FROM users WHERE username = '$username' and password = '' or '1' = '1''
--     Syntax error a single quote is in excess --------------------------------^

Вы можете удалить последнюю одинарную кавычку вашей инъекции: ' or '1' = '1

1 голос
/ 21 марта 2019

Это может не работать , потому что, если у вас много пользовательских записей, $count будет больше, чем 1, но вы проверяете, будет ли выходить только одна запись:

if ($count == 1) {

Может быть попытаться изменить условие на что-то вроде:

if ($count != 0) {

Тогда указанное выше условие отфильтрует только несуществующих пользователей и не проверит, будет ли возвращен только один пользователь.

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