RDot

RDot (https://rdot.org/forum/index.php)
-   Web-среда/Web-applications (https://rdot.org/forum/forumdisplay.php?f=9)
-   -   Защита от SQL-инъекций в postgresql (https://rdot.org/forum/showthread.php?t=3786)

Tr3v0r 20.09.2016 15:34

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

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

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

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

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

HeartLESS 20.09.2016 19:47

Цитата:

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

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

Tr3v0r 21.09.2016 17:40

Цитата:

Сообщение от HeartLESS (Сообщение 40431)
Или в постгресе иначе экранируется? Так или иначе, не изобретай велосипед, всегда есть prepared statement

Я понимаю, что нужно использовать плейсхолдеры или нормальное экранирование. Однако интересна именно эта ситуация.

Цитата:

Сообщение от HeartLESS (Сообщение 40431)
username=\&password= or 1=1 -- -

В pgadmin'е пробую:
SELECT 'foo''bar' -> "foo'bar"
SELECT 'foo\''bar' -> "foo\'bar"
SELECT 'foo\\''bar' -> "foo\\'bar"
Не удается заэкранировать


Часовой пояс GMT +3, время: 23:57.

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