Старый 20.09.2016, 16:34   #1
Tr3v0r
 
Регистрация: 20.09.2016
Сообщений: 2
Репутация: 0
По умолчанию Защита от SQL-инъекций в postgresql

Всем привет! Есть следующий код на питоне/постгресе:

return do_sql_query(""" SELECT user, pass FROM users WHERE user = '{0}', pass = '{1}' """.format(username.replace("'", "''"), password.replace("'", "''"))

Параметры username и password контролирует удаленный пользователь.

Подскажите, пожалуйста, достаточно ли такого реплэйса для предотвращения инъекции?

Где-то видел статью, описывающую эксплуатацию такой (подобной) ситуации, но сейчас не могу найти ее. Там в качестве пайлоада передавали также обратную косую для экранирования первой кавычки, однако мне не удается повторить это. Запрос не ломается если в него попадают две одинарные кавычки, они расцениваются как символ строки.
Tr3v0r вне форума   Ответить с цитированием
Старый 20.09.2016, 20:47   #2
HeartLESS
 
Регистрация: 25.04.2012
Сообщений: 101
Репутация: 31
По умолчанию

Цитата:
Сообщение от Tr3v0r Посмотреть сообщение
Всем привет! Есть следующий код на питоне/постгресе:

return do_sql_query(""" SELECT user, pass FROM users WHERE user = '{0}', pass = '{1}' """.format(username.replace("'", "''"), password.replace("'", "''"))

Параметры username и password контролирует удаленный пользователь.

Подскажите, пожалуйста, достаточно ли такого реплэйса для предотвращения инъекции?

Где-то видел статью, описывающую эксплуатацию такой (подобной) ситуации, но сейчас не могу найти ее. Там в качестве пайлоада передавали также обратную косую для экранирования первой кавычки, однако мне не удается повторить это. Запрос не ломается если в него попадают две одинарные кавычки, они расцениваются как символ строки.
username=\&password= or 1=1 -- -

Или в постгресе иначе экранируется? Так или иначе, не изобретай велосипед, всегда есть prepared statement
__________________
Jokester: Ок, с тобой проще согласиться чем переубедить. :)
HeartLESS вне форума   Ответить с цитированием
Старый 21.09.2016, 18:40   #3
Tr3v0r
 
Регистрация: 20.09.2016
Сообщений: 2
Репутация: 0
По умолчанию

Цитата:
Сообщение от HeartLESS Посмотреть сообщение
Или в постгресе иначе экранируется? Так или иначе, не изобретай велосипед, всегда есть prepared statement
Я понимаю, что нужно использовать плейсхолдеры или нормальное экранирование. Однако интересна именно эта ситуация.

Цитата:
Сообщение от HeartLESS Посмотреть сообщение
username=\&password= or 1=1 -- -
В pgadmin'е пробую:
SELECT 'foo''bar' -> "foo'bar"
SELECT 'foo\''bar' -> "foo\'bar"
SELECT 'foo\\''bar' -> "foo\\'bar"
Не удается заэкранировать
Tr3v0r вне форума   Ответить с цитированием
Ответ

Метки
injection, postgresql, sql injection

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot