Цитата:
|
Цитата:
Сорри но чем createElement или .appendChild от toString отличается ? что мешает подменить и их ? <html> <head> </head> <body> <!-- здесь прячется зловред --> <script> //тело зловреда спрячем полностью в замыкании; (function(){ // метод crack общий для window и всех фреймов, // даже если frame создаст фрейм, это непоможет function crack(target){ var realCreateElement=target.document.createElement; target.Function.prototype.toString=function(){ return 'trololo'; } target.Object.prototype.toString=function(){ return 'trololo'; } target.document.createElement=function(param){ var result=realCreateElement.apply(target.document,arguments); if (param== 'iframe'){ target.document.documentElement.appendChild( result ); crack(result.contentWindow); } return result; }; } crack(window); })(); </script> <!-- А здесь мы обманули всех при помощи фрейма --> <script> // 1. создаём фрейм. var frame = document.createElement("iframe"); document.documentElement.appendChild( frame ); // 2. тырим из него toString var Func_toString = frame.contentWindow.Function.prototype.toString; // для проверки функций var Obj_toString = frame.contentWindow.Object.prototype.toString; // для проверки объектов alert (Func_toString.apply("isu98") ); alert (Obj_toString.apply("isu98") ); </script> </body> </html> |
Цитата:
var bad = function () { return "LOL"; }; // so sarcastic // все они не помечены как readonly, но некоторые из них FF их менять не хочет. // в хроме всё взламывается :) document.createElement = Document.prototype.createElement = bad; HTMLElement.prototype.insertAdjacentHTML = bad; alert(document.createElement); // :(( // начинаем мстить. // 1. получаем ГО - обычный window может прокатить : var win = window; // window.document -> readonly! // 2. получаем document. var doc = win.document; // в doc - тёплый и мягкий экземпляр Document. // document.body -> readonly! // 3. получаем наконец-то элемент var body = doc.body; // 4. меняем innerHTML (надо бы менять не body'евский, а чей-нибудь другой) // и прокалываем фрейму ухо, чтобы можно было его опознать. var id = "secret_" + (Math.random()*1e6|0); body.innerHTML += '<iframe id="' + id + '"></iframe>'; // document.body.children -> readonly! // 5. проходимся по детям и находим наш фрейм. var myFrame; for (var i = 0; i < body.children.length; i++) { if (body.children[i].id === id) { myFrame = body.children[i]; break; } } // 6. PROFIT!!! var normalWindow = myFrame.contentWindow; var normalDocument = normalWindow.document; alert( normalDocument.createElement ); |
Цитата:
var frame = document.createElement("iframe"); document.documentElement.appendChild( frame ); alert( frame.parentNode ); var frame = document.createElement("iframe"); // если он тут есть, значит метод createElement подменили // тут можно смело останавливать программу и слать всех лесом. alert( frame.parentNode ); |
Цитата:
поэтому и написал что appendChild можно подменить тоже. В этом случае кряку применять appendChild самому нет никакой надобности. Достаточно дождаться пока жертва воспользуется нашей обёрткой думая что это appendChild, и подсунуть свои методы в фрейм. А вот melkiy в ответ на критику алгоритм улучшил серьёзно. Появилось новое поле для размышлений. |
Цитата:
Object.freeze( Object.prototype ); Object.prototype.toString = function() { return false; }; alert( {} ); |
Часовой пояс GMT +3, время: 23:07. |