Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Безопасность клиентского кода. (https://javascript.ru/forum/misc/32739-bezopasnost-klientskogo-koda.html)

trikadin 29.10.2012 08:51

Цитата:

Сообщение от iMaxmaxmaximus
Тред не читал - все методы можно перезаписать так, что другой скрипт не определит их нативность.

Тролль в треде. Будешь нести фигню - получишь добробан на пару дней.

DjDiablo 29.10.2012 12:36

Цитата:

Сообщение от devote
ну вот, хоть один разумный вариант)))

не говори ГОП пока не перепрыгнешь :)

Сорри но чем 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>

melky 29.10.2012 15:59

Цитата:

Сообщение от DjDiablo
Сорри но чем createElement или .appendChild от toString отличается ? что мешает подменить и их ?

мешает сеттер на innerHTML у элементов
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 );

devote 29.10.2012 16:35

Цитата:

Сообщение от DjDiablo
не говори ГОП пока не перепрыгнешь

а ты в курсе что у вставленного элемента появляется свойство parentNode?
var frame = document.createElement("iframe");
document.documentElement.appendChild( frame );
alert( frame.parentNode );

var frame = document.createElement("iframe");

// если он тут есть, значит метод createElement подменили
// тут можно смело останавливать программу и слать всех лесом.
alert( frame.parentNode );

DjDiablo 29.10.2012 17:01

Цитата:

Сообщение от devote
а ты в курсе

Да в курсе.
поэтому и написал что appendChild можно подменить тоже. В этом случае кряку применять appendChild самому нет никакой надобности. Достаточно дождаться пока жертва воспользуется нашей обёрткой думая что это appendChild, и подсунуть свои методы в фрейм.

А вот melkiy в ответ на критику алгоритм улучшил серьёзно. Появилось новое поле для размышлений.

nerv_ 29.10.2012 17:20

Цитата:

Сообщение от BallsShaped
Причем сначала выполняется код расширений, а затем код страницы, так?

кстати, так и не выяснили. А то можно было бы сделать какой-нибудь финт ушами :)
Object.freeze( Object.prototype );

Object.prototype.toString = function() {
	return false;
};

alert( {} );


Часовой пояс GMT +3, время: 23:07.