2009-09-03 2 views
0

это часть прослушивание безопасности, поэтому нет возможности «изменить» запрос.Выберите таблицы после инструкции FROM?

В общем, что я нашел изъян, который позволяет манипулировать заявление, так что в основном он идет, как:

$query = "DELETE FROM `products` WHERE `products`.`whatever` = $variable"; 

Это PHP, так что, насколько я знаю, нет никакого способа, чтобы выполнить несколько запросов. Используя эту SQL-инъекцию, я смог «очистить» эту таблицу, выполнив «0 ​​OR 1 = 1 #».

Это работает нормально, но это не позволяет мне выбирать больше таблиц для удаления.

Это, в псевдокоде, что я хочу сделать:

DELETE FROM `products` WHERE `products`.`whatever` = **0 OR 1=1, FROM `othertable` WHERE `othertable`.`othercolumn` = 0 OR 1=1** 

Является ли это правдоподобным, так или иначе?

Если это ненадежное устройство, есть ли способ передвижения?

+0

Вы спрашиваете, как SQL-инъекция или как ее предотвратить? – Corey

+0

Как построить запрос SQL-Injection – 2009-09-03 00:36:46

ответ

2

У вас не может быть нескольких предложений FROM для одного и того же оператора DELETE, поэтому вы не можете использовать его точно так, как вам хотелось бы. Если БД MySQL был «разрешить несколько запросов на заявление» включены, вы могли бы попытаться расторгнуть один УДАЛИТЬ запрос, а затем лавировать на другом до конца, так что бы выглядеть следующим образом:

DELETE FROM `products` WHERE `products`.`whatever` = **0 OR 1=1; DELETE FROM `othertable` WHERE `othertable`.`othercolumn` = 0 OR 1=1** 

Но вот и все.

+0

Да, спасибо. Так что это невозможно? Я могу опубликовать ошибку MySQL. xD – 2009-09-03 00:38:30

+0

@Jose: Это не проблема MySQL. Модуль драйвера PHP просто не поддерживает его. – zombat

+0

Фактически вы удаляете из нескольких таблиц в одном запросе, но они должны быть указаны в предложении FROM (после того, как WHERE будет слишком поздно). PHP * настроен * не разрешать несколько запросов в одном вызове, другие языки могут быть более разрешительными. –

2

Возможно, я не совсем понимаю вопрос, но то, что я убираю, заключается в том, что вы создаете команду SQL как строку и запускаете эту строку непосредственно в базе данных MySQL.

Вы можете отделить несколько команд с помощью разделителя команд (обычно ';'), так что вы можете выполнить практически любую команду, которую хотите, как показано на рисунке this comic.

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

+0

LOL, это смешно xD. Но вернемся к нашему бизнесу, точка с запятой не работает в MySQL API (который использует PHP), поэтому нет возможности запустить команду «более чем одной». – 2009-09-03 00:37:42

+0

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

+0

Ну, на самом деле он ПОДДЕРЖИВАЕТ его, если он включен. – 2009-09-03 00:43:44

1

Как вы заявили, несколько запросов не поддерживаются обычным модулем драйвера MySQL. Из the manual for mysql_query:

mysql_query() посылает уникальный запрос (несколько запросов, которые не поддерживаются) в настоящее время активной базы данных на сервере, связанный с указанной link_identifier.

К сожалению, за ваши усилия впрыска, DELETE синтаксис поддерживает только многоуровневые таблицы удаляются, указав их в пункте FROM. Ваша введенная переменная является частью WHERE, поэтому наибольший урон, который вы можете сделать, - это одна указанная таблица.

Вопреки распространенному мнению, вы можете фактически запускать несколько операторов MySQL из PHP, вам просто нужно использовать другой модуль драйвера базы данных, такой как MySQLi. См. MySQLi::multi_query().

+0

Да, спасибо, хотя на самом деле это не повредит, это часть прослушивания безопасности, как я уже говорил: P – 2009-09-03 00:39:45

Смежные вопросы