Jira ICT wint MKB Beste Choice Award - Magento Workshops 2010
Dec
23

Joomla! 1.5 wachtwoorden

Binnen Joomla! 1.5 kan een gebruiker zich aanmelden op zowel de frontend als de backend met de juiste gebruikersnaam en wachtwoord combinatie. De login gegevens worden vervolgens door Joomla! vergeleken met geldige logins in de database tabel "jos_users".

MD5 encryptie

Het wachtwoord wordt versleuteld opgeslagen in de database tabel "jos_users". Voorheen werd hiervoor altijd MD5 voor gebruikt - een algoritme dat het oorspronkelijke wachtwoord versleuteld ("hashed") naar een 128-bit waarde die meestal wordt weergegeven met 32 hexadecimale getallen. Het algoritme heeft afgelopen jaren een aantal gebreken gekend, maar staat nog steeds te boek als veilig: Om een versleuteld wachtwoord te ontcijferen is belachelijk veel computerkracht nodig.

Er zit echter één nadeel aan vast: Het is weliswaar erg moeilijk om het MD5 algoritme te kraken, maar er is altijd een één-op-één match tussen het wachtwoord en de uiteindelijke MD5 waarde. Met het wachtwoord "password" zal bijvoorbeeld de MD5 waarde altijd de volgende string zijn:

5f4dcc3b5aa765d61d8327deb882cf99
In plaats van de wachtwoorden te kraken is het ook mogelijk net zolang MD5 strings uit te proberen tot er een match is gevonden.

Joomla! en SQL injection exploits

In het verleden zijn Joomla! websites geteisterd met verschillende exploits, waarmee een hacker zichzelf toegang tot de Joomla! website kon verschaffen. Deze exploits konden bijvoorbeeld de globale variabelen "mosConfig_absolute_path" overschrijven, waardoor een hacker via een zogenaamde PHP Shell volledige toegang kreeg tot alle bestanden van Joomla!. Andere exploits maakten gebruik van SQL injection: Door variabelen via de URL aan een bepaald derde partij component mee te geven, werd een onschuldige database query veranderd in een andere gevaarlijke query.

Veelal werden deze SQL injection aanvallen gebruikt om alle gebruikersdata uit te lezen via de webpagina: Op het scherm werden dan bijvoorbeeld de MD5 waarden van wachtwoorden van alle Super Administrators getoond.

Nadat een hacker de MD5 waarden in handen had gekregen, was de volgende stap om deze wachtwoorden te kraken. Zoals gezegd is het kraken van deze wachtwoorden erg moeilijk, maar het vergelijken van de MD5 waarde met andere MD5 waarden niet. De hacker maakt hierbij typisch gebruik van zogenaamde Rainbow Tables - een database met wachtwoorden en MD5 strings. De MD5 waarde van het Super Administrator wachtwoord wordt vergeleken met entries in deze Rainbow Table en mits de Rainbow Table bestaat uit genoeg mogelijke wachtwoord/MD5-combinaties is een match gauw genoeg gevonden.

Het aanmaken van een Rainbow Table voor bijvoorbeeld wachtwoorden met willekeurige karakters tot een lengte van 8 karakters kost flink veel tijd, maar zodra deze database is aangemaakt is het opzoeken van een wachtwoord een kwestie van een paar uur. Voor een goede Rainbow Table is ook veel schijfruimte nodig. Voor de "brute force" van wachtwoorden tot 12 karakters moet men al gauw rekenen op een database van enkele honderden gigabytes.

Om het kraken van wachtwoorden via Rainbow Tables moeilijker te maken is het iedergeval aan te raden om wachtwoorden te gebruiken met minstens 8 karakters bestaande uit niet alleen letters en getallen maar ook andere karakters zoals !, & of $.

Joomla! 1.5 en het zout

Een techniek om het raden van wachtwoorden via tools als Rainbow Tables een stuk moeilijker te maken is door een "salt" toe te voegen aan de MD5 encryptie. Door deze salt neemt het aantal MD5 combinaties die uitgeprobeerd moeten worden exponentieel toe. De salt is een extra string die wordt toegevoegd aan het wachtwoord. Om het uiteindelijke wachtwoord te kunnen ontcijferen moet de salt wel beschikbaar zijn voor het authenticatie mechanisme. Joomla! 1.5 doet dit door het versleutelde wachtwoord in "jos_users" op te slaan samen met de salt.
md5( PASSWORD + SALT ) + : + SALT
Alleen met de juiste salt en het juiste wachtwoord kan een MD5 string berekend worden die overeenkomt met de reeds opgeslagen encryptie in de Joomla! 1.5 database. Aangezien de salt iedere keer opnieuw wordt berekend kan de encryptie van het wachtwoord "password" er iedere keer anders uitzien:
9e0ca7eec1f9a44f4e6a8d6cba1de703:\
    6IMghS4LVP24Txj01EhBx3H00jl6uRTW
2efda34e2cc536abe0ddff82a86665ab:\
    smxR7dszGJ27mzRnIHtxJl0uHdy6wagA
32ec55f63be310c2fccd159b133c0a30:\
    RMtcsw7BMVeEWhnfONVpF7cw6MyOA3mG
e3ec84f95342b358102393ddefd98e50:\
    L91DC62RtuGUEhq4qZlNODx52QMVpkPK

Is dit dan 100% veilig? Nee. Zodra een hacker via een SQL Injection aanval de versleutelde waarde van het wachtwoord in handen heeft gekregen, heeft de hacker ook de salt in handen gekregen (het gedeelte na de dubbele punt). Maar om vervolgens met deze salt het oorspronkelijke wachtwoord te raden, moet er een geheel nieuwe Rainbow Table database met deze specifieke salt aangelegd worden. Met een wachtwoord dat sterk genoeg is, duurt het weken voordat dit wachtwoord is gekraakt.

De meeste hackers zijn op zoek naar gemakkelijke prooien, dus het gebruik van de salt voegt een enorme barriere toe. Maar het wil niet zeggen dat sommige hackers deze moeite niet nemen.

Wachtwoord reset in de Joomla! datababase tabel "jos_users"

Momenteel heeft Joomla! 1.5 nog een mogelijkheid om normale MD5 wachtwoorden te gebruiken. Als in de database tabel "jos_users" het wachtwoord van een bepaalde gebruiker de waarde "5f4dcc3b5aa765d61d8327deb882cf99" meekrijgt, dan is het bijbehorende wachtwoord "password". Zodra hierna vanuit de Joomla! Administrator het wachtwoord wordt veranderd, verandert deze oude MD5 string weer naar een nieuwe encryptie met salt. Voor het snel resetten van het wachtwoord is dit dus prima te gebruiken, mits hierna de Joomla! Administrator wordt gebruikt om het wachtwoord voor een tweede keer te resetten.

In de toekomst zulllen de oude MD5 wachtwoorden uit Joomla! verdwijnen, en ook vanuit het oogpunt van security is het beter direct te kiezen voor salted passwords. Met onderstaand PHP script is een wachtwoord met salt te genereren.

$password = 'password' ;
function makePassword( $password ) {
    $chars = "abcdefghijklmnopqrstuvwxyz" ;
    $chars .= "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
    $chars .= "0123456789";
    $len = strlen($chars);
    $salt = '';
    mt_srand(10000000 * (double) microtime());
    for ($i = 0; $i < 32; $i ++) {
        $salt .= $chars[mt_rand(0, $len -1)];
    }
    return md5( $password . $salt ) . ':' . $salt ;
}
echo makePassword( $password ) ;

Converteren van oud naar nieuw

Om alle oude MD5-wachtwoorden te converteren naar de nieuwe encryptie is er geen makkelijke manier. Het nieuwe wachtwoord kan alleen versleuteld worden met behulp van het oorspronkelijke wachtwoord, niet met de versleutelde MD5 waarde van het wachtwoord. Het toepassen van de nieuwe encryptie gebeurt dus alleen als er een nieuw wachtwoord door ofwel de gebruiker zelf ofwel de Joomla! Super Administrator wordt aangemaakt.

Conclusie

Door het gebruik van salted passwords is de veiligheid van wachtwoorden enorm toegenomen. Het kraken van een wachtwoord is nagenoeg onmogelijk als men de salt niet in handen heeft. Als de salt wel gevonden is, moet de hacker zoveel moeite nemen om bijvoorbeeld een nieuwe Rainbow Table te genereren dat hij waarschijnlijk afhaakt.

Het gebruik van sterke wachtwoorden is echter nog steeds heel belangrijk.

Home Blog Joomla! 1.5 wachtwoorden