Как продемонстрировать SQL-инъекцию в этом коде PHP и MySQL? - PullRequest
5 голосов
/ 02 октября 2009

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

Мне нужно разработать пару примеров того, как инъекция MySQL может быть построена на основе следующего кода. Это базовая система входа в систему, где я принимаю имя пользователя и пароль без экранирования

$user = (!empty($_POST['user'])) ? $_POST['user'] : '';
$pass = (!empty($_POST['pass'])) ? $_POST['pass'] : '';

Затем запрос MySQL пытается найти введенные имя пользователя и пароль в моей таблице, называемые пользователями, следующим образом:

$res = mysql_query("SELECT * from users where user='{$user}' AND pass='{$pass}'");

Это не экранированный ввод, и я пытаюсь придумать инъекции MySQL:

  1. обойти пароль, зная имя пользователя законного пользователя (один пользователь в моей таблице пользователей - тестер), и
  2. инъекция, которая полностью удалит таблицу users .

Я попробовал пару примеров внедрения MySQL из Википедии , но я предполагаю, что {} в моем запросе предотвращает внедрение, поэтому я был бы признателен за помощь от тех, кто уверен с этим, и спасибо всем.

Ответы [ 6 ]

5 голосов
/ 02 октября 2009

Примерно так должно поступить:

  1. Чтобы войти в систему как пользователь "foo", установите для имени пользователя значение "foo" - "

Это сделает ваш запрос похожим на

$res = mysql_query("SELECT * from users where user='foo' -- ' AND pass=''");

"-" означает, что остальная часть строки закомментирована

  1. Не уверен, что это будет работать, но попробуйте установить имя пользователя в "foo" ИЛИ (DROP TABLE users) - "

Это сделает ваш запрос похожим на:

$res = mysql_query("SELECT * from users where user='foo' OR (DROP TABLE users) -- ' AND pass=''");

может не принять это, хотя - я думаю, что подзапросы могут только SELECT.

Функция mysql_query будет выполнять только один запрос - другие позволят вам сделать это:

$res = mysql_query("SELECT * from users where user='foo'; DROP TABLE users -- ' AND pass=''"); 
3 голосов
/ 02 октября 2009

Вы не сможете DROP таблицы, потому что с помощью mysql_query вы не можете отправлять несколько запросов.

1 голос
/ 09 апреля 2011
$user = (!empty($_POST['user'])) ? $_POST['user'] : '';
$pass = (!empty($_POST['pass'])) ? $_POST['pass'] : '';

$user = mysql_real_escape_string($user);
$pass = msyql_real_escape_string($pass);

$res = mysql_query("SELECT * from users where user='{$user}' AND pass='{$pass}'");

Это защитит код для вас. Никто не сможет DROP за столом.

1 голос
/ 02 октября 2009

Вот длинный список.

http://ha.ckers.org/sqlinjection/

Ваш код, очевидно, не пройдет почти весь тест, поскольку он полностью незащищен.

0 голосов
/ 02 октября 2009

Попробуйте это и посмотрите, выводит ли он всю таблицу:

For both username and password, I enter:

' OR 1=1 AND '}' '= 

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

Я действительно не уверен, как MySQL обрабатывает смешанную логику подобным образом, поскольку она не заключена в скобки, поэтому дайте мне знать, если она работает!

0 голосов
/ 02 октября 2009

{} не причина. Возможно, Магические кавычки от php (сейчас не рекомендуется) защищают вас от довольно упрощенных атак.

Однако вы можете отключить их и затем протестировать снова.

...