WTF: Publik sida med multipla klient hashningar?!?

Följde en tryckt länk som givet sammanhanget verkade vara en publik sida (varför annars skriva ut den på tidningarna man delar ut till alla?)

Till min förvåning så kom jag till någon konstig sida där det stod att jag behövde slå på JavaScript för att kunna redigera sidan. Tänkte till min förvåning att det måste vara inkompabilitet med min browser, men gissa min förvåning när jag fick se java-källkoden!
<form name=”login” action=”?id=203″ method=”post” onSubmit=”return doChallengeResponse()”>
<input autocomplete=”off” type=”text” name=”username”/>
<input autocomplete=”off” type=”password” name=”password”/>
<input type=”hidden” name=”challenge” value=”269e19032e9bb379f358903b6f383ba6″ />
<input type=”hidden” name=”response”  value=”” />
</form>
<form name=”logintrue” action=”….” method=post>
<input type=”hidden” name=”username” value=””>
<input type=”hidden” name=”challenge” value=”269e19032e9bb379f358903b6f383ba6″>
<input type=”hidden” name=”response”  value=””>
<input type=”hidden” name=”red”  value=””>
</form>
function doChallengeResponse() {
if(document.login.username.value == document.login.password.value){
document.login.password.value =document.login.username.value;
document.login.username.value = ‘block_me’;
document.login.submit();
return false;
}
str = document.login.username.value + ”:” +
MD5(MD5(document.login.password.value) + ”:” + document.login.username.value) + ”:” +
document.login.challenge.value;
document.login.response.value = MD5(str);
document.login.password.value = ””;
document.logintrue.username.value = document.login.username.value;
document.logintrue.response.value = MD5(str);
document.logintrue.submit();
return false;
}
<form name=”login” action=”….” method=”post” onSubmit=”return doChallengeResponse()”>
<input autocomplete=”off” type=”text” name=”username”/>
<input autocomplete=”off” type=”password” name=”password”/>
<input type=”hidden” name=”challenge” value=”269e19032e9bb379f358903b6f383ba6″ />
<input type=”hidden” name=”response”  value=”” />
</form>
<form name=”logintrue” action=”….” method=post>
<input type=”hidden” name=”username” value=””>
<input type=”hidden” name=”challenge” value=”269e19032e9bb379f358903b6f383ba6″>
<input type=”hidden” name=”response”  value=””>
<input type=”hidden” name=”red”  value=””>
</form>
function doChallengeResponse() {
if(document.login.username.value == document.login.password.value){
document.login.password.value =document.login.username.value;
document.login.username.value = ‘block_me’;
document.login.submit();
return false;
}
str = document.login.username.value + ”:” +
MD5(MD5(document.login.password.value) + ”:” + document.login.username.value) + ”:” +
document.login.challenge.value;
document.login.response.value = MD5(str);
document.login.password.value = ””;
document.logintrue.username.value = document.login.username.value;
document.logintrue.response.value = MD5(str);
document.logintrue.submit();
return false;
}
…så man kan sluta sig till att man försökt bygga fort knox runt en publik URL.
Noteringar:
  • Algoritmen gör trippel hashning av lösenordet; H1=MD5(password)
  • Algoritmen gör dubbel hashning av username; H2=MD5(H1,username)
  • Algoritmen gör enkel hashning med salt; H3=MD5(username,H2,challenge)
  • Algoritmen verkar inte tillåta saltad lagring; endast challenge som inte är user-specifik ingår i H3.
  • Algoritmen verkar låsa mot username flerfaldigt (först internt nere i H2 blir H3-hashen user-specifik, sen även explicit ute i H3).
  • Har någon gått beserk här; varför vill man nyckla en hash mot username flerfaldigt?
  • Implementationen kör MD5 en gång mer än vad algoritmen kräver (H3 räknas ut två gånger)
  • Någon verkar ha byggt en rätt extrem grunka här, med otydliga designmål. Själv så anser jag att serverside hashning är viktigare nätverkskryptering (…det kan ju lösas med enkel SSL), så i min smak har man lagt krutet på att lösa fel problem.
  • Varför nycklar man med avseende på username, och varför flerfaldigt? Det verkar lite flummigt. Dock så tror jag det kan vara en fuling – man använder egentligen username som ett salt.
  • På det hela taget: inte min kopp av te, inte helt snyggt, och lite väl mycket CPU-cykler. Men det lär vara tämligen säkert, eftersom denna lök av hashning-på-hashning-på-hashning både blir username-specifik och challenge-specifik.
  • Bästa kryptografiska attacken, borde vara dictonary attack eller bruteforce. Inte ens om man vill angripa ettspecifik username är det värt att bygga en rainbow table för H3 = MD5(username,H2,””)  = MD5(username, MD5( MD5( password ), username ) ).
  • Är det inte uppenbart att en praktiskt attack förmodligen är så mycket enklare att detta är en overkill? En man-in-the-middle attack som byter ut javascriptet torde vara det enklaste, eller att lura på användarna en keylogger.
  • Seriöst… VARFÖR skickar ni ut den här länken till era läsare? Teknisk fuck-up eller försöker ni psyka tekniker/blodsugare?

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut /  Ändra )

Google-foto

Du kommenterar med ditt Google-konto. Logga ut /  Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut /  Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut /  Ändra )

Ansluter till %s