luq techblog

o tworzeniu słów kilka…

Ajax md5() 28 marca 2010

Filed under: Ajax,JS,Security,Web — Łukasz @ 11:19
Tags: , , , , ,

Dziś coś na temat bezpieczeństwa. Pomysł na ten wpis zrodził się dziś rano, gdy wchodząc na forum.php.pl zobaczyłem temat w którym, ktoś potrzebował użyć PHP`owej funkcji pack() po stronie klienta. W odpowiedzi rzucono mu linka http://phpjs.org/functions/pack:880. Szczerze powiedziawszy spotkałem się z tą stroną pierwszy raz i się miło zaskoczyłem. Strona phpjs.org to próba przeportowania funkcji występujących w PHP na język JS. Aktualnie progres tego zadania liczony jest na 81.7% czyli sporo… Dobra ale ja nie o tym chciałem, może kiedy indziej napiszę coś o phpjs… Jakiś czas temu widziałem także, na czyimś blogu, pomysł na liczenie md5 po stronie klienta (szkoda, że nie mam linka a jednak znalazłem http://necro.nomicon.pl/2009/01/24/making-of-javascript-botnet). Ogólnie chodzi o to, aby potencjalny user czytając wpis na blogu, liczył hashe md5() z kolejnych niewyliczonych stringów, następnie wynik zapisywał z powrotem do bazy,wszystko działało oczywiście w oparciu o technologie Ajax, bez świadomości czytającego co jego komputer właśnie robi. W ten sposób obciążamy liczeniem maszyny osób serfujących po internacie, natomiast nam pozostaje jedynie magazynowanie wyników tych operacji. Ten wpis jest próbą skonstruowania czegoś podobnego. Czy się udało? Co z tego wyszło? Czytaj dalej :)

 

Najpierw zaczniemy od strony serwera po której to będą:

 

po pierwsze: pobierane stringi do obliczenie z nich md5
po drugie: zapisywanie hasha

 

U nas stringi do liczenia są wpisane statycznie w kod a wyniki liczenia są zapisywane do pliku. Oczywiście normalnie powinno to działać na bazie danych, ale w celu ułatwienia analizy tego kodu z takiego rozwiązania zrezygnowałem, zresztą z prosty sposób można to zmienić.

get_words.php

<?php
	$md5Arr = array(
		'luq',
		'luqowski',
		'ala',
		'ma',
		'kota'	
	);
	// normalnie to to powino iść z bazy, 2 tabelki:
	// 
	// WORD: word_id | word
	// MD5:  md5_id  | word_id | md5
	// 
	// user pobiera np. 5 słów gdzie jeszcze nie policzono sumy md5
	
	echo json_encode( $md5Arr );
?>

Czyli zbieramy skądś stringi do obliczenia (u nas są wpisane na sztywno) i printujemy ja na ekranie w postaci JSON`a.

set_md5.php

<?php
	$text = $_GET['word'].':'.$_GET['md5']."\n";
	
	// oczywiście w tym miejscu też powinno być dopisanie do bazy danych
	// jeśli w /get_words.php użyliśmy bazy...
	
	$f = fopen( './md5_database.txt', 'a' );
	fwrite( $f, $text );
	fclose( $f );
?>

Czyli na postawie zmiennych podanych metodą GET dane te są dopisane do pliku.

Czas na client-site.
index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>Ajax md5</title>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
   
    <script type="text/javascript" src="./js/utf8_encode.js"></script>
    <script type="text/javascript" src="./js/md5.js"></script>
  	<script type="text/javascript" src="./js/jquery/jquery-1.3.2.min.js"></script>
  	<script type="text/javascript">
		$(document).ready(function(){
        	$.getJSON( './php/get_words.php', function( data ){
        	    var cnt = data.length;
        	    
        		for( var i = 0; i < cnt; i++  ){
					$.get( './php/set_md5.php?word=' + data[ i ] + '&md5=' + md5( data[ i ] ) );	
        		}
   			});
        });
	</script>
  </head>
  <body>
      Jakiś tekst/artukuł który czytasz a w tle, na swoim komuperze liczysz MD5 ;)
  </body>
</html>

Dołączamy 3 pliki z kodem JS.
utf8_encode.js (funkcja md5 korzysta z utf8_encode)
md5.js
jquery-1.3.2.min.js to oczywiście jQuery Framework.

Całość jest banalnie prosta:

  • kierujemy obiektem XHR zapytanie do get_words.php dane odbieramy jako JSON
  • dla każdego słowa osobno:
    • kierujemy obiektem XHR zapytanie do set_md5.php z danymi przekazanymi metodą GET (np. set_md5.php?word=luq&md5=94bce5751038404f1b1ec8094a1e19a2)

Po otwarciu index.html widzimy tylko tekst

Jakiś tekst/artukuł który czytasz a w tle, na swoim komuperze liczysz MD5 ;)

ale otwierając plik md5_database.txt widzimy:

ala:e88e6128e26eeff4daf1f5db07372784
luq:94bce5751038404f1b1ec8094a1e19a2
luqowski:e7a18c240a71498f34f0143097b9b5f4
ma:b74df323e3939b563635a2cba7a7afba
kota:31d9bb37999652d494ba78feb642a73f

Hm… atak ten, bo imho jest to atak, w końcu ktoś korzysta z mocy obliczeniowej naszego komputera bez naszej zgody jak i wiedzy, jest całkiem ciekawy i zastanawiam się nad innym zastosowaniem Ajax`a do robienia czegoś podobnego za plecami usera, jeśli ktoś ma pomysł to piszcie w komentarzach.

Reklamy
 

2 Responses to “Ajax md5()”

  1. Fifi209 Says:

    Ale Twój pomysł do hashowania jest bardzo dobry, możemy stworzyć ogromne tęczowe tablice bez obciążenia dla serwera. :)


Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s