Security issue's

Pagina's in dit topic: 1

 Index / Ideeën Bus / Security issue's
Marcade Status van deze gebruiker Gepost op Dinsdag 07 Maart 2006 om 17:15  Profiel  

Posts: 6
Onlangs is het directtopic 4.2 forum van iemand die ik ken gehacked. Account overgenomen. Hoe dat precies gebeurd is weten we niet. Al kijkende in de source code van Direct Topics 4.2 zijn er wel drie dingen die ik op wilde merken.

1. passmailer.php

Er is geen restrictie op hoe vaak een user een paswoord kan resetten. In theorie zou iemand iemand anders behoorlijk kunnen irriteren door om de 0.01 seconden een paswoord reset te doen. Oplossing zou zijn dat een bepaald IP maar eens per 24 uur een password reset mag doen.

2. inloggen.php

Hier word een session hash gedingest: $login_hash = md5( $_SERVER['REMOTE_ADDR'].$_POST['nickname'].rand(0, 9999) );

Dit verteld me dat als een hacker iemand's nickname plus IP adres weet, hij maar met brute force max 10000 keer een Session hash hoeft te proberen, voordat die eventueel een sessie kan overnemen. Oplossing; maak 't meer willekeurig; gebruik bv time() in de hash. 10000 keer lijkt veel; maar in practijk met een snelle verbinding, zou dat maar een paar uur duren.

3. inloggen.php

Met brute force kan (zeker na een paswoord reset waar een paswoord van 6 chars word gegenereerd) iemand's paswoord gekraakt worden. Eigenlijk zou 't mss. handig zijn als iemand na 3 keer een foutief paswoord in te vullen, dat IP tijdelijk gebanned word oid.  
Mark Status van deze gebruiker Gepost op Dinsdag 07 Maart 2006 om 18:22  Profiel Homepage 
Development
Posts: 1131

Avatar

Yo bedankt, hier heb ik veel aan.. :)

Quote:
Onlangs is het directtopic 4.2 forum van iemand die ik ken gehacked. Account overgenomen. Hoe dat precies gebeurd is weten we niet.


Toevallig de kritische update niet uitgevoerd.. :)?

Quote:
Oplossing zou zijn dat een bepaald IP maar eens per 24 uur een password reset mag doen.


Hmm hier zit zeker wat in, zal dit meenemen in Dt5..

Quote:
Oplossing; maak 't meer willekeurig; gebruik bv time() in de hash.


Idem :)

Quote:
Eigenlijk zou 't mss. handig zijn als iemand na 3 keer een foutief paswoord in te vullen, dat IP tijdelijk gebanned word oid.


Iets tijdelijks is geen optie. Dat zou met cronjobs moeten, wat dus natuurlijk niet kan ;) En tja, met brute force kom je overal wel doorheen.. Ik zal sowieso de 6 karakters uitbreiden naar 10.

Nogmaals bedankt ;)  
   ____________________________________________________
 Was ik maar een vliegtuig... Dan was ik tenminste niet gek!
Marcade Status van deze gebruiker Gepost op Dinsdag 07 Maart 2006 om 20:31  Profiel  

Posts: 6
Cronjobs inderdaad; ik kan idd. begrijpen dat je dat wil vermijden om de simpliciteit te behouden. Je zou eventueel een eigen soortvan cronjob system kunnen maken.

brute force kom je idd. overal doorheen uiteindelijk; maar als d'r een tijdsmarge in pogingen komt te zitten, is 't eigenlijk niet meer aantrekkelijk voor een hacker om brute force te gebruiken. Scheelt ook veel bandbreedte.

btw. ik bedenk me ook net, passmailer.php beeindigt eventuele lopende sessies van de gebruiker niet. Misschien is dat ook handig om te doen; dat na een password change/reset/wijziging de user opnieuw moet inloggen.  
speedy Status van deze gebruiker Gepost op Dinsdag 07 Maart 2006 om 22:16  Profiel Skype Homepage 

Posts: 62

Avatar

Quote:
Mark schreef op 07-03-2006 om 18:22

[..]
Iets tijdelijks is geen optie. Dat zou met cronjobs moeten, wat dus natuurlijk niet kan ;) En tja, met brute force kom je overal wel doorheen.. Ik zal sowieso de 6 karakters uitbreiden naar 10.

Nogmaals bedankt ;)



Eeuh cronjobs?
Bestaat er niet zoiets als cookies?

Zo doek da bij men GB ook, cookie aanmaken van x aantal secs (3600*60*60 bijv voor 24uur), je geeft een check of die cookie bestaat, zo ja dan kan je nie verder

Nadeel hiervan is dat die cookies kunnen worden gewist (idee: cookies en sessions voor alle zekerheid?)  
   ____________________________________________________
 PHP Guru || Carfreak || Newtech.nl --== Xtreme
Marcade Status van deze gebruiker Gepost op Woensdag 08 Maart 2006 om 00:45  Profiel  

Posts: 6
Quote:
speedy schreef op 07-03-2006 om 22:16
[..]

Eeuh cronjobs?
Bestaat er niet zoiets als cookies?

Zo doek da bij men GB ook, cookie aanmaken van x aantal secs (3600*60*60 bijv voor 24uur), je geeft een check of die cookie bestaat, zo ja dan kan je nie verder

Nadeel hiervan is dat die cookies kunnen worden gewist (idee: cookies en sessions voor alle zekerheid?)



Je geeft zelf idd. al de zwakke plek aan; cookies kunnen gewist worden. :-P

Je moet er vanuit gaan dat (informatie in) cookies niet veilig is en veranderd kan worden .. want dat kan ook gewoon heel makkelijk. Daarom ook dat je cookies zoveel mogelijk moet vermijden; en als je cookies gebruikt, zo min mogelijk informatie erin, en het liefst geencodeerd.  
Metalman Status van deze gebruiker Gepost op Woensdag 08 Maart 2006 om 14:46  Profiel Homepage 

Posts: 114

Avatar

Een sessie/cookie is zeker wel een optie. Een brute force script kan over het algemeen niet de cookies leeggooien, en zelfs als dat wel kan betekent dit al een vertraging in het kraken. Ook kan je bij het inloggen/de passmailer nog een sleep(2) neerzetten, zodat elke poging minimaal 2 seconden duurt. Dan duurt het al véél langer om iets brute force te kraken.

Als je dit koppelt aan een soort systeem dat het IP e.d. logt bij meer dan x pogingen na elkaar dan heb je een redelijk simpele maar toch effectieve beveiliging. Optioneel kan je het account nog tijdelijk 'locken' als er pak 'em beet 5 keer achter elkaar een fout password is ingevoerd.  
   ____________________________________________________
 Fastlog stopt ermee!
speedy Status van deze gebruiker Gepost op Woensdag 08 Maart 2006 om 16:41  Profiel Skype Homepage 

Posts: 62

Avatar

Juist, dan kan je bij 2 vakjes bijvoegen aan account row in SQL met blocked en block_time (of alleen laatste is ook voldoende)

Na x aantal pogingen zet je in blocked_time en value van time()+xx secs

Bij aanvang van de pagina kijk je dan weer bij welke row je IP hoort, en vanaf daar kijk je naar de tijd
Leeg = doorgaan
Met value: kijken of time een waarde heeft onder de time() op dit moment, zo nie een fout, zo ja doorgang

Eigenlijk weinig coding en SQL load en simpel en toch redelijk goeie beveiliging  
   ____________________________________________________
 PHP Guru || Carfreak || Newtech.nl --== Xtreme
Marcade Status van deze gebruiker Gepost op Woensdag 08 Maart 2006 om 16:47  Profiel  

Posts: 6
Voor zover ik 't begreep wilde Speedy dat als een gebruiker foutief inlogt; die gebruiker een cookie van een dag mee kreeg .. zolang die gebruiker die cookie had, zou die niet kunnen inloggen.

Dan is het een kwestie van die cookie verwijderen en je kan een volgende brute force poging doen. Cookies staan bij de gebruiker lokaal op 't systeem; er is geen probleem dat die dus verwijderd kunnen worden.

Als je bedoelt dat er geen brute force scripten bestaan die dingen met cookies doen .. dat weet ik niet .. ik kijk vanuit mijn eigen perspectief en kennis .. als ik nu een account wil hacken, zou ik binnen 2 uur een Visual Basic programmaatje kunnen maken die brute force een paswoord gaat hacken en elke vorm van cookies simpelweg negeert en ook geen cookies meestuurt met het HTTP of POST request.

Maar mss. heb ik iets verkeerd begrepen.  
Pagina's in dit topic: 1