Цитата:
|
Цитата:
Сорри но чем 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, время: 17:15. |