Permalänk
Medlem

Koroth

Hej.

Den 27 december 2008 laddade jag upp den officiella hemsidan för min server, Koroth. För några timmar sedan fick jag veta från en viss medlem där att han kunde på något vis komma in på mitt konto utan att ens ange ett lösenord. Varken jag eller han fattar absolut ingenting om varför.

Säkerhets-tester
Vi söker därmed personer som verkligen kan sin sak när det gäller att hitta säkerhets-hål på hemsidor.

Söker medarbetare
Kan du Ubuntu och/eller PHP o SQL riktigt bra och vill dra nytta av dina erfarenheter? Tveka inte o kontakta oss.

Vad tycker ni?
Det är alltid kul med kritik på ens hemsidor Om du har lust, får du mer än gärna lämna en kommentar om vad du tycker om hemsidan. Vi är medvetna om att bakgrunds-bilden är enorm (1680x1050 för att vara exakt) och vi ska åtgärda det på nått sätt. Vi vet bara inte hur, för bakgrunds-bilden passar verkligen in på hemsidan.

Kontakt
Du kan kontakta antingen mig eller Qzen på koroth.se.

Ber om ursäkt för eventuellt ett knasigt inlägg, men jag är väldigt trött i bollen just nu.

Tack och god natt för mig

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth & Serenum.

Permalänk

Till att börja med är sidan vidöppen för CSRF attacker. Tänk om någon skulle lura in dig på en sida med till exempel följande innehåll:

<form action="http://koroth.se/settings_private.php" method="POST"> <input type="hidden" name="user" value="edgren"> <input type="hidden" name="pass2" value="nytt_losenord"> <input type="hidden" name="email" value="erik@edgren.nu"> <input type="hidden" name="show_email" value="1"> <input type="submit" name="save" class="button" value="Spara"> </form>

Med ett javascript som automatiskt skickar iväg form:en.

För det andra så har du html injection problem till exempel så escape:ar du inte " i userfältet på http://koroth.se/settings_private.php. Jag är inte säker på om detta är exploitable men det är iallafall inte bra.

Permalänk
Medlem

Tack för ditt inlägg.

Vill du berätta hur jag kan täppa igen dessa säkerhets-hål?

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth & Serenum.

Permalänk

Det första är svårt! För att verkligen lösa det måste du skicka med en hemlig nyckel som ett hidden fält i varje form. Detta tar naturligtvis lite tid att fixa, så länge kan du helt enkelt be om det gamla lösenordet när man byter lösenord eller email.

Det andra problemet är lätt det är bara att köra namnet genom htmlspecialchars, men det har du ju gjort på andra ställen så jag antar att du vet.

Det största problemet du har är väll dock att dessa buggarna hittade jag efter ca 5 min letande. Med största sannolikhet finns det fler liknande...

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av jop_the_jopsan
Det första är svårt! För att verkligen lösa det måste du skicka med en hemlig nyckel som ett hidden fält i varje form. Detta tar naturligtvis lite tid att fixa, så länge kan du helt enkelt be om det gamla lösenordet när man byter lösenord eller email.

Hm, okey. Det enda jag behöver är alltså en gömd input som har en unik nyckel i sig på typ 32 tecken? Eller vadå?

Citat:

Ursprungligen inskrivet av jop_the_jopsan
Det andra problemet är lätt det är bara att köra namnet genom htmlspecialchars, men det har du ju gjort på andra ställen så jag antar att du vet.

Jag använder mig av följande kod i varje textfält:

mysql_real_escape_string(stripslashes($_POST['user']))

Ska jag även peta in htmlspecialchars där?

Citat:

Ursprungligen inskrivet av jop_the_jopsan
Det största problemet du har är väll dock att dessa buggarna hittade jag efter ca 5 min letande. Med största sannolikhet finns det fler liknande...

Det finns det säkerligen xD

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth & Serenum.

Permalänk
Citat:

Ursprungligen inskrivet av edgren
Hm, okey. Det enda jag behöver är alltså en gömd input som har en unik nyckel i sig på typ 32 tecken? Eller vadå?

Ja, den behöver vara unik för varje användare. Om du vill kan du ta dig en titt på fluxbb, beta 1.3. Dom genererar helt enkelt en slumpmässig sträng varje gång någon registrerar sig och sparar den i db:n. Sedan skickas den med i varje form och valideras i de skript som tar emot formdatan.

Citat:

Jag använder mig av följande kod i varje textfält:

mysql_real_escape_string(stripslashes($_POST['user']))

Ska jag även peta in htmlspecialchars där?

Det beror lite på. Jag tycker det enklaste är att köra datan genom de olika funktionerna precis då det behövs. Så mitt förslag är:
[list="1"]
[*]Varje gång du tar emot data, kolla om magic_quotes är på. Om det är det kör stripslashes på den.
[*]Precis innan du ska skicka data till databasen, kör den genom mysql_real_escape_string.
[*]Precis innan du ska skriva data till användaren (echo), kör den genom htmlspecialchars().
[/list=1]

Jag tycker det är lite fult att bara köra htmlspecialchars på allt. Tänk om någon använder till exempel '<' i sitt lösenord. Då kommer han inte längre kunna logga in om man kört htmlspecialchars på det innan man sparar det i db:n. Klart att det går att arbeta runt sånt där men det korrekta sättet att göra det på tror jag är att använda varje funktion precis då den behövs.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av jop_the_jopsan
Ja, den behöver vara unik för varje användare. Om du vill kan du ta dig en titt på fluxbb, beta 1.3. Dom genererar helt enkelt en slumpmässig sträng varje gång någon registrerar sig och sparar den i db:n. Sedan skickas den med i varje form och valideras i de skript som tar emot formdatan.

Det beror lite på. Jag tycker det enklaste är att köra datan genom de olika funktionerna precis då det behövs. Så mitt förslag är:
[list="1"]
[*]Varje gång du tar emot data, kolla om magic_quotes är på. Om det är det kör stripslashes på den.
[*]Precis innan du ska skicka data till databasen, kör den genom mysql_real_escape_string.
[*]Precis innan du ska skriva data till användaren (echo), kör den genom htmlspecialchars().
[/list=1]

Jag tycker det är lite fult att bara köra htmlspecialchars på allt. Tänk om någon använder till exempel '<' i sitt lösenord. Då kommer han inte längre kunna logga in om man kört htmlspecialchars på det innan man sparar det i db:n. Klart att det går att arbeta runt sånt där men det korrekta sättet att göra det på tror jag är att använda varje funktion precis då den behövs.

Tack!

Jag har inte mysql_real_escape_string(stripslashes()) på MD5($_POST['pass']), vilket är en självklarhet

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth & Serenum.