Форумы портала PHP.SU » » Работа с СУБД » sql injection - возможен ли DROP

Страниц (1): [1]
 

1. iv888 - 12 Марта, 2019 - 16:42:22 - перейти к сообщению
Hello freiends!
Возможен ли DROP TABLE в таком кейсе? Другие случаи инъекций не интересуют.

PHP:
скопировать код в буфер обмена
  1.    $stmt = $this->connection->prepare("INSERT INTO ".$this->my_canal." (login, text) values (?, ?)") or exit(' :( ');


Спасибо заранее .
2. andrewkard - 12 Марта, 2019 - 16:53:35 - перейти к сообщению
iv888 пишет:
Hello freiends!
Возможен ли DROP TABLE в таком кейсе? Другие случаи инъекций не интересуют.

PHP:
скопировать код в буфер обмена
  1.    $stmt = $this->connection->prepare("INSERT INTO ".$this->my_canal." (login, text) values (?, ?)") or exit(' :( ');


Спасибо заранее .


нет
3. Мелкий - 12 Марта, 2019 - 17:02:30 - перейти к сообщению
Зависит от того, что такое $this->my_canal и где меняется, а так же от самого $this->connection - вы не написали что это.
4. iv888 - 12 Марта, 2019 - 17:12:46 - перейти к сообщению
andrewkard, благодарю

Мелкий, благодарю
$this->my_canal это protected алиас для переменной $canal, а $canal - это $_GET['canal'], которая устанавливается пользователем. Попадет в класс через метод и там выполняется вышеуказанный код.
Если такого канала нет, то устанавливается $this->my_canal = 'first_canal'

Могу показать весь листинг.

Суть в том, что пользователь может ввести любые значения в input canal
(Вывод и внедрение данных в данном случае не страшно) ... Главное DROP
5. Мелкий - 12 Марта, 2019 - 17:28:30 - перейти к сообщению
Теоретически ничто не мешает.
Например для pdo_pgsql проверил - можно и drop table сделать, были бы права у пользователя.

Это в целом плохая мысль использовать пользовательские данные в качестве имени таблицы.
6. iv888 - 12 Марта, 2019 - 17:53:41 - перейти к сообщению
Там суть в том, что кроме каналов нет ничего в БД.
userlogin - только имя отправленное пользователем - произвольное.

Да, проверил просто DROP из php, похоже, можно DROP.

Мдя, тогда придется на хостинге закрыть DROP


P.S.
Благодарю! Вопрос решен!
7. andrewkard - 12 Марта, 2019 - 17:54:53 - перейти к сообщению
Мелкий пишет:
pdo_pgsql проверил - можно и drop table

с подготовленным запросом можно выполнить drop table ? Вернее втыкнуть инъекцию?
8. iv888 - 12 Марта, 2019 - 18:08:55 - перейти к сообщению
andrewkard пишет:
Мелкий пишет:
pdo_pgsql проверил - можно и drop table

с подготовленным запросом можно выполнить drop table ? Вернее втыкнуть инъекцию?


У меня prepared statement только на данные, но переменная для выбора таблицы не вписывается в модель prepared statement.

Это динамический выбор таблицы
9. andrewkard - 12 Марта, 2019 - 18:13:40 - перейти к сообщению
Проверить по белому списку
10. Мелкий - 12 Марта, 2019 - 18:28:53 - перейти к сообщению
andrewkard пишет:
с подготовленным запросом можно выполнить drop table ? Вернее втыкнуть инъекцию?

А что вас собственно удивляет?
Если продолжать конкатенировать запрос с данными - то ничего не изменится. prepared statement не серебряная пуля, а лишь транспорт.

Я отдельно уточнил где проверял, потому что на сколько помню в pdo_mysql намеренно отломаны мультизапросы. При том именно из-за безалаберного отношения авторов кода (не могу назвать разработчиками) к sql инъекциям. А про другие драйвера вовсе ничего сказать не могу.

iv888 пишет:
но переменная для выбора таблицы не вписывается в модель prepared statement.

Этот мой комментарий относился именно к вашей модели данных.
Использовать пользовательский ввод в качестве имени объекта - идея плохая и так быть не должно.
11. iv888 - 12 Марта, 2019 - 18:41:27 - перейти к сообщению
andrewkard пишет:
Проверить по белому списку

Это есть, но для снижения нагрузки хотелось бы отключить эту опцию
(Добавление)
iv888 пишет:
andrewkard пишет:
Проверить по белому списку

Это есть, но для снижения нагрузки хотелось бы отключить эту опцию



Цитата:
Этот мой комментарий относился именно к вашей модели данных.
Использовать пользовательский ввод в качестве имени объекта - идея плохая и так быть не должно.

Делать отдельную таблицу сопоставления?
Дело в том, что сейчас так удобно создавать новые каналы ...

Вообще тогда исходя из сказанного Мелким, получается на выбор таблицы надо делать
switch
12. Мелкий - 12 Марта, 2019 - 20:38:22 - перейти к сообщению
Гипотеза: у вас некоторое число таблиц идентичной структуры.
Почему я так подумал: если бы структуры были различны - у вас бы не стояло вопроса как проверять имя таблицы, а выбор был бы детерминирован.
Вывод: это должна быть одна таблица. Имя искусственного водного пути (хотя при чём тут водные пути? Но canal это именно оно) - такой же параметр запроса, а не имя таблицы.
В итоге вы ищите проблему там где её нет, просто соорудив странную схему базы.
13. iv888 - 12 Марта, 2019 - 20:43:30 - перейти к сообщению
Цитата:
Гипотеза: у вас некоторое число таблиц идентичной структуры.

Да.

PHP:
скопировать код в буфер обмена
  1. Вывод: это должна быть одна таблица.

Т.е. все сообщения писать в одну таблицу, добавив в таблицу столбец имя чата (канала)?


Мне показалось, так удобней оперировать каналами.
(Добавление)
update
Да, в принципе да, все так.
Наверное так и переделаю.

Единственное удобство оперирования немного снижается.
(Добавление)
Не , не снижается...
Спасибо все решил

 

Powered by ExBB FM 1.0 RC1