Avatar billede moddi100 Seniormester
17. april 2008 - 22:48 Der er 36 kommentarer og
1 løsning

Ønsker hackertest af php login-system

Hejsa Eksperter

Jeg har et login-system på min hjemmeside, hvor sikkerheden skal testes. Faktisk 2 systemer. De ligger lige nu på min server på adresserne:
http://www.moddi.dk/Testsite/
http://www.moddi.dk/Testsite2/

Er der nogle af jer eksperter, der kunne teste dem? Mangler i nogle oplysninger kan jeg selvfølgelig supplere med dem.

På forhånd tak.
Morten
Avatar billede moddi100 Seniormester
17. april 2008 - 22:51 #1
Det første link skal være http://www.moddi.dk/bannersite/
Avatar billede nielle Nybegynder
18. april 2008 - 07:35 #2
Nu er det lidt problematisk at stille den slags spørgsmål her på E - for hvordan ved vi at det rent faktisk er din side vi skal prøve at hacke?

Desuden er det så som så med kvaliteten af sådan en test, da man jo må skyde i blinde, og derfor måske ikke lige rammer hullet som kunne være der.

I stedet bør du poste din kode her, sådan at folk kan analysere den for dig. Dette giver meget større sikkerhed for at et eventuelt hul findes.
Avatar billede moddi100 Seniormester
18. april 2008 - 12:01 #3
kan bevise det ved at ændre filerne, og dermed hjemmesiden. :D

Men måden jeg tjekker på, er at jeg laver et database-opkald, hvor jeg vælger den række hvor $_SESSION['jgegbrugernavn'], er, jeg har ved login oprettet flere sessions med nogle af brugerens data. F.eks email, status (altså om han er admin osv), jeg tjekker så alle dem op mod dataene fra databasen, stemmer de ikke overens, får brugeren en logind fejl.

Koden ser sådan ud:

if ($_SESSION['dfgh_logget_ind'] == 'vbpja' && isset($_SESSION['dfgh_brugernavn']) && isset($_SESSION['dfgh_brugerstatus']) && isset($_SESSION['dfgh_brugeremail']) && $_SESSION['dfgh_brugernavn'] != "" && $_SESSION['dfgh_brugerstatus'] != "" && $_SESSION['dfgh_brugeremail'] != "")
{
aabn_mysql_forbindelse();
$mysql = @mysql_query("SELECT * FROM Brugere WHERE Brugernavn='" . $_SESSION['dfgh_brugernavn'] . "'");
luk_mysql_forbindelse();
       
$dgjjg_bruger = @mysql_result($mysql, 0, 'DatBrugernavn');
$dgjjg_status = @mysql_result($mysql, 0, 'DatStatus');
$dgjjg_email = @mysql_result($mysql, 0, 'DatEmail');
       
if ($_SESSION['dfgh_brugernavn'] != $dgjjg_bruger or $_SESSION['dfgh_brugeremail'] != $dgjjg_email or $_SESSION['dfgh_brugerstatus'] != $dgjjg_status)
{
    ikke_logget_ind();
}
Avatar billede nielle Nybegynder
18. april 2008 - 18:47 #4
Der mangler selve login funktionen. Hvordan kommer der data i din session til at starte med?
Avatar billede moddi100 Seniormester
18. april 2008 - 18:59 #5
Her er login funktionen. Et par enkle check er taget fra, da de bare er sat til at fortælle om brugeren er aktiveret,aktiv,osv.

$mysql = mysql_query("SELECT * FROM Brugere WHERE Brugernavn='" . $_POST['brugernavn'] . "'");
   
$bruger = mysql_result($mysql, 0, 'Brugernavn');
$password = mysql_result($mysql, 0, 'Password');
$password_krypt = md5($_POST['login_password']);
$status = mysql_result($mysql, 0, 'Status');
$email = mysql_result($mysql, 0, 'Email');
$status_arr = array('bruger', 'superbruger', 'coadmin', 'admin');
       
if ($bruger == $_POST['brugernavn'] && $_POST['brugernavn'] != "" && $email != "" && $password == $password_krypt && in_array($status, $status_arr))
{
    $_SESSION['dfgh_brugernavn'] = $bruger;
    $_SESSION['dfgh_status'] = $status;
    $_SESSION['dfgh_email'] = $email;
    $_SESSION['dfgh_login'] = 'vpbja';
               
    unset($bruger, $password, $status, $email, $password_krypt);
    header('Location: index.php?id=forside');
}
Avatar billede nielle Nybegynder
18. april 2008 - 21:13 #6
Der er i hvert fald den første sikkerhedssprække lige her:

$mysql = mysql_query("SELECT * FROM Brugere WHERE Brugernavn='" . $_POST['brugernavn'] . "'");

Brug hellere noget i stil med:

$brugernavn = $_POST['brugernavn'];
$brugernavn = mysql_real_escape_string($brugernavn);
$mysql = mysql_query("SELECT * FROM Brugere WHERE Brugernavn='$brugernavn'");
Avatar billede moddi100 Seniormester
19. april 2008 - 11:25 #7
Slog lige 'mysql_real_escape_string' op på php.net, og kan godt se hvor du/de vil hen!

Det er nu rettet.

Kan denne kode bruges eller vil det være sikre at bruge en .htacces fil? Hvis det bare er til en enkelt person?
Avatar billede moddi100 Seniormester
19. april 2008 - 12:13 #8
Men jeg må indrømme, at jeg ikke kan skrive noget i inputfelterne så jeg ville kunne komme ind uden korrekt brugernavn/password. Men det er i hvert fald ændret.
Avatar billede nielle Nybegynder
20. april 2008 - 09:48 #9
Pas på med at antage at fordi du ikke kan se et hul - at hackerene så heller ikke kan.

Din loginkode ser sikker nok ud, men den kan dog kortes ned til:

$brugernavn = $_POST['brugernavn'];
$brugernavn = mysql_real_escape_string($brugernavn);
$mysql = mysql_query("SELECT * FROM Brugere WHERE Brugernavn='$brugernavn'");

$password_krypt = md5($_POST['login_password']);
$password = mysql_result($mysql, 0, 'Password');

if ($password == $password_krypt) {
    $_SESSION['dfgh_brugernavn'] = $brugernavn;
    $_SESSION['dfgh_status'] = mysql_result($mysql, 0, 'Status');
    $_SESSION['dfgh_email'] = mysql_result($mysql, 0, 'Email');;
    $_SESSION['dfgh_login'] = 'vpbja';

    header('Location: index.php?id=forside');
}


Imidlertid er det ikke nok at sikre loginkoden. ALLE steder hvor der kommer bruger input ind i systemet skal det sikres. Det gælder f.eks. også der hvor at nye brugere opretter sig.
Avatar billede erikjacobsen Ekspert
20. april 2008 - 10:03 #10
Og fx er denne kode

$mysql = @mysql_query("SELECT * FROM Brugere WHERE Brugernavn='" . $_SESSION['dfgh_brugernavn'] . "'");

problematisk, for du her en mulig SQL-injection, når du putter en værdi ind i en SQL-sætning uden at gøre noget ved den. Den kan fx indeholde '-tegn, og så kan man snyde dig.

PHP har fra gammel tid, i et meget misforstået forsøg på at være venlig, lavet en automatisk "addslashes" på input fra brugere. Det er hul i hovedet, for det er ikke i GUI-delen, den slags skal ske, men i SQL-delen. PHP5s nye mysqli-funktioner hjælper lidt på det, og egentlig er det dem, der skal bruges (rigtigt!!) nu om dage.
Avatar billede moddi100 Seniormester
20. april 2008 - 11:29 #11
Som jeg skrev den 19/04-2008 12:13:00 så kan jeg ikke finde ud af at 'snyde' koden, men jeg har _alligevel_ ændret koden.

> Imidlertid er det ikke nok at sikre loginkoden. ALLE steder hvor der kommer bruger input ind i systemet skal det sikres. Det gælder f.eks. også der hvor at nye brugere opretter sig.

Havde jeg gættet, men det bliver ikke lige nu, men skal det gøres et sted, skal det for det meste gøres alle steder. :D

Erikjacobsen: Du vil vel også bruge mysql_rael_escape_string?

Jeg har ændret denne linje:

$mysql = @mysql_query("SELECT * FROM Brugere WHERE Brugernavn='" . $_SESSION['dfgh_brugernavn'] . "'");

Til dette:

$query = sprintf("SELECT * FROM Brugere WHERE Brugernavn='%s'", mysql_real_escape_string($_POST['login_bruger'])) or die();
$mysql = mysql_query($query);
Avatar billede erikjacobsen Ekspert
20. april 2008 - 12:26 #12
"Erikjacobsen: Du vil vel også bruge mysql_rael_escape_string?" - nej, jeg vil bruge mysqli i PHP5.
Avatar billede moddi100 Seniormester
20. april 2008 - 13:42 #13
kender den ikke :D kan du give et link til den? (Gerne php.net)
Avatar billede olebole Juniormester
20. april 2008 - 13:50 #14
<ole>

Hvis du kender php.net, er det vel bare at skrive 'mysqli' i søgeboksen  ;o)

/mvh
</bole>
Avatar billede moddi100 Seniormester
20. april 2008 - 13:51 #15
Nix, prøv så kan du se hvad jeg mener
Avatar billede erikjacobsen Ekspert
20. april 2008 - 13:58 #16
Avatar billede moddi100 Seniormester
20. april 2008 - 14:10 #17
og hvilken en af dem vil du så bruge?
Avatar billede erikjacobsen Ekspert
20. april 2008 - 14:59 #18
"hvilken en"?  Jeg tror ikke lige du har forstået: det er en anden måde at gøre det på. Start i menuen ude til venstre med "Introduction", og arbejd dig nedefter. Der kommer eksempler osv.

Der er intet vundet ved mysqli, hvis man ikke gør det rigtigt. http://php.net/ fortæller meget, og ellers har du sikkert en ved i Google ;)
Avatar billede erikjacobsen Ekspert
20. april 2008 - 14:59 #19
"en ven" har jeg nok ment!
Avatar billede moddi100 Seniormester
20. april 2008 - 15:03 #20
okay det må jeg prøve at kigge lidt på, men er det ikke godt nok med mysql_real_escape_string() ??
Avatar billede moddi100 Seniormester
20. april 2008 - 15:13 #21
mysqli er det ikke bare mysql med nogle udvidelser og en lidt anden måde at skrive det på?

Den siger da f.eks. at:
"mysqli::real_escape_string"
er det samme som:
"mysqli_real_escape_string"

http://dk.php.net/manual/en/mysqli.real-escape-string.php
Avatar billede moddi100 Seniormester
20. april 2008 - 15:34 #22
ups havde ikke set at det begge var mysql_i_.
Men hvad er forskellen på
"mysqli_real_escape_string"
og
"mysql_real_escape_string"
??
Avatar billede olebole Juniormester
20. april 2008 - 15:40 #23
"Nix, prøv så kan du se hvad jeg mener" >> Nej, jeg kan ikke se, hvad du mener. Jeg bliver sendt til mysqli's hovedside, når jeg søger  =)

"Men hvad er forskellen på ..." >> Forskellen er, at du ikke behøver at bruge "mysqli_real_escape_string" for at sikre dig mod SQL-injection. Det vil du finde ud af, hvis du læser om mysqli  ;o)
Avatar billede erikjacobsen Ekspert
20. april 2008 - 15:41 #24
Kig på http://dk.php.net/manual/en/mysqli-stmt.prepare.php  - man bruger slet ikke selv at escape en streng. Det er det, der er den "rigtige måde" at bruge det på.
Avatar billede erikjacobsen Ekspert
20. april 2008 - 15:42 #25
(men det tager lidt mere end 5 sekunder at forklare - derfor må du læse dig til det selv, hehe)
Avatar billede moddi100 Seniormester
20. april 2008 - 15:53 #26
> (men det tager lidt mere end 5 sekunder at forklare - derfor må du læse dig til det selv, hehe)

Ja der er temlig meget at gå i krig med!

Mysqli er altså meget mere sikkert (kan også se at man kan lave en ssl krypteret forbindelse) end mysql. Men da der er så pokkers meget at læse, tror jeg bare jeg vil nøjes med at bruge mysql_real_escape_string, hvis det altså er nogenlunde lige så sikkert.
Avatar billede olebole Juniormester
20. april 2008 - 15:58 #27
"hvis det altså er nogenlunde lige så sikkert." >> Det er det ikke.

I betragtning af, hvormeget du burde have læst for at nå til at lave sikre serverløsninger, er den smule læsning for intet at regne. Webkodning er et fag  ;o)
Avatar billede moddi100 Seniormester
20. april 2008 - 16:03 #28
> Webkodning er et fag 
ved det, et meget stort fag :D

Men er det så ikk bedre at jeg bare bruger en .htaccess fil?
Avatar billede erikjacobsen Ekspert
20. april 2008 - 16:48 #29
Det er der ingen, der kan fortælle dig. Sikkerhed er ikke en absolut størrelse, men afhænger af en masse parametre.

Men jeg kan fortælle dig, hvad der er rimligt sikkert. Læg hele din website på en CD, og på put den i en bankboks. Alt andet du foretager giver nok en større anvendelighed, men også en mindre sikkerhed. Spørgsmålet er kun hvad du vil have.
Avatar billede moddi100 Seniormester
20. april 2008 - 17:01 #30
Er ved at lave et administrations-modul, kunden vil så gerne have en høj sikkerhed, derfor disse herlige spørgsmål. :D

Men spørgsmålet er: Vil det forhindre eller i hvert fald opholde en potentiel hacker at komme udenom mit sikkerhedssytem?
Avatar billede erikjacobsen Ekspert
20. april 2008 - 17:08 #31
Det vil ikke forhindre noget. Hvis du sørger for at SQL-injection ikke kan forekomme, så har du lukket et af et pænt antal "huller", som en "hacker" kan komme ind af. Sikkerhed er mere end det. Men mon der er nogen, der gider angribe dit system? ;)
Avatar billede moddi100 Seniormester
20. april 2008 - 17:12 #32
det ved jeg ikke, da det jo sådan set er noget jeg laver til en kunde, men man kan vel altid antage at det er der.
Avatar billede moddi100 Seniormester
26. april 2008 - 14:00 #33
smider du et svar erikjacobsen?
Og også gerne dig nielle, der kom med forbedringer til selve koden.
Avatar billede erikjacobsen Ekspert
26. april 2008 - 14:43 #34
Jeg samler slet, slet ikke på point, tak.
Avatar billede olebole Juniormester
26. april 2008 - 14:46 #35
Kan man bygge biler til salg, hvis man ikke ved, hvordan man holder dem sikkert på vejen? Kan man skrive websites til kunder, hvis man ikke kender til alm. sikkerhedsregler for webapplikationer? Der er så meget, ældre mænd ikke forstår  ;o)
Avatar billede moddi100 Seniormester
26. april 2008 - 17:37 #36
Så får nielle dem bare.

> Der er så meget, ældre mænd ikke forstår
ja det er der ;D
Avatar billede nielle Nybegynder
26. april 2008 - 22:45 #37
Svar :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester