Avatar billede sungdk Nybegynder
22. april 2005 - 16:08 Der er 44 kommentarer og
2 løsninger

"Hul" i dette login?

Hej med jer!

Nogle som kan se et hacker-hul i denne login-metode?

<?php
session_start();

if (empty($_POST[brugernavn]) || empty($_POST[pass])) {
Header("Location:../index.php?action=fejl");
                exit;
} else {

    include "conn.php";
      $result = mysql_query("SELECT * From m_brugere WHERE brugernavn = '$_POST[brugernavn]'") or die(mysql_error());
      $row = mysql_fetch_array($result);
if ($row[aktiv] == 'inaktiv') {
Header("Location:../index.php?action=inaktiv");
                exit;
}
else if ($_POST['pass'] == $row['pass'] && $row['aktiv'] = "aktiv" && $_POST['gem'] == "") {
        $_SESSION['id'] = "$row[id]";
        $_SESSION['status'] = "$row[status]";
        $_SESSION['brugernavn'] = "$row[brugernavn]";
        $_SESSION['email'] = "$row[email]";
        $_SESSION['xtramm'] = "$row[xtramm]";
        $_SESSION['infoboks'] = "$row[infoboks]";
        $_SESSION['reg'] = "$row[reg]";
        setcookie("gem", "");
        setcookie("brugernavn", "");
        setcookie("pass", "");

if ($row[sidstset] == date("d/m - Y")) {
} else {
$penge = 10+$row[penge];
$erfaring = 2+$row[erfaring];
$dato = date("d/m - Y");
mysql_query("UPDATE m_brugere SET penge = '$penge', erfaring = '$erfaring', sidstset = '$dato' WHERE brugernavn = '$_POST[brugernavn]'");
}
            Header("Location:../index2.php");
                exit; }
               
else if ($_POST['pass'] == "$row[pass]" && $row['aktiv'] = "aktiv" && $_POST['gem'] == "gem") {
        $_SESSION['id'] = "$row[id]";
        $_SESSION['status'] = "$row[status]";
        $_SESSION['brugernavn'] = "$row[brugernavn]";
        $_SESSION['email'] = "$row[email]";
        $_SESSION['xtramm'] = "$row[xtramm]";
        $_SESSION['infoboks'] = "$row[infoboks]";
        $_SESSION['reg'] = "$row[reg]";
        setcookie("gem", "ja", time()+31536000);
        setcookie("brugernavn", "$row[brugernavn]", time()+31536000);
        setcookie("pass", "$row[pass]", time()+31536000);
               
if ($row[sidstset] == date("d/m - Y")) {
} else {
$penge = 10+$row[penge];
$erfaring = 2+$row[erfaring];
$dato = date("d/m - Y");
mysql_query("UPDATE m_brugere SET penge = '$penge', erfaring = '$erfaring', sidstset = '$dato' WHERE brugernavn = '$_POST[brugernavn]'");
}
            Header("Location:../index2.php");
                exit; }

else {
    Header("Location:../index.php?action=fejl");
                exit;
} }
?>

Tak!
Avatar billede busschou Praktikant
22. april 2005 - 16:10 #1
jeg kender ikke  php syntaks for det men du skal sikre dig imod sql injection
Dvs du skal sikre dig imod at en bruger kan taste ' i sit navn eller kode da dette vil opfattes som sql syntaks
Se evt her
http://activedeveloper.dk/artikler/default.asp?articleid=297
Avatar billede sungdk Nybegynder
22. april 2005 - 16:17 #2
Har lidt svært ved at tyde deres resultater da jeg absolut ikke er kender af ASP
Avatar billede busschou Praktikant
22. april 2005 - 16:20 #3
Du skal bruge phps replace funktion
http://dk.php.net/str_replace
til at erstatte enkelt plinger ' med dobbelt plinger '' inden du laver din sql query
Avatar billede Slettet bruger
22. april 2005 - 16:28 #4
$query = ereg_replace("'", "''", "SELECT * FROM m_brugere WHERE brugernavn = '". $_POST['brugernavn'] ."'");
$result = mysql_query($query) or die(mysql_error());
Avatar billede Slettet bruger
22. april 2005 - 16:29 #5
som busschou siger, er det nok bedre at bruge str_replace, da den er lidt mindre ressourcekrævende.
Avatar billede sungdk Nybegynder
22. april 2005 - 16:31 #6
Er det nødvendigt at lave sådan en replace på ALLE min SQL? også DELETE, UPDATE, osv.?

Eller kun dem hvor den henter fra en form?
Avatar billede Slettet bruger
22. april 2005 - 16:32 #7
men det vil _ikke_ være skadeligt for dit system, hvis en bruger forsøger at "hacke" sig ind vha. den metode der er beskrevet i busschous artikel, da din mysql_fetch_array vil melde fejl, hvis der er flere end én række der matcher din forespørgsel
Avatar billede busschou Praktikant
22. april 2005 - 16:33 #8
Det normale ville være at gemme det indtastede brugernavn og kodeord i en variable.
Lave replace på de variable og så benytte dem i resten af siderne
Avatar billede busschou Praktikant
22. april 2005 - 16:34 #9
wicez >> fetch_array fanger vel rækkerne...så er du sikker på den giver fejl om der så er en, to, ti eller 100 rækker?
Avatar billede sungdk Nybegynder
22. april 2005 - 16:36 #10
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'sung''' at line 1

Har brugt denne:

$udtraek = str_replace("'", "''", "SELECT * FROM m_brugere WHERE brugernavn = '". $_POST['brugernavn'] ."'");
    $result = mysql_query($udtraek) or die(mysql_error());
      $row = mysql_fetch_array($result);
Avatar billede sungdk Nybegynder
22. april 2005 - 16:47 #11
Har opdaget en parantes for meget ved mysql... Men stadigvæk fejl i udtræk
Avatar billede Slettet bruger
22. april 2005 - 16:49 #12
ja jeg er sikker busschou, hvis du vil have resultatet fra flere rækker, skal du bruge en løkke da resultatet ellers vil komme ud i et array.

$udtraek = "SELECT * FROM m_brugere WHERE brugernavn = '". str_replace("'", "''", $_POST['brugernavn']) ."'";
Avatar billede sungdk Nybegynder
22. april 2005 - 16:50 #13
Nice nu virker det...

Skulle det så i teorien være nok til at holde "hackeren" ude?

Lav lige svar på forhånd begge to :D
Avatar billede Slettet bruger
22. april 2005 - 16:59 #14
Ja det skulle det. Du behøver ikke din str_replace, men der er ikke noget galt i at have den alligevel
Avatar billede Slettet bruger
22. april 2005 - 17:07 #15
Det er i ligeså høj grad unødvendigt at bruge mysql_fetch_array i denne situation. Det ville være langt mere hensigtsmæssigt at bruge mysql_fetch_assoc, da du kun bruger dennes egenskaber.

http://dk.php.net/mysql_fetch_array
definerer både et indexeret array: $row['0'] og et associativt array: $row['kolonne']

http://dk.php.net/mysql_fetch_assoc
definerer kun et associativt array: $row['kolonne']
Avatar billede Slettet bruger
22. april 2005 - 17:10 #16
og så lige til dig busschou:

mysql_fetch_assoc (ligeledes mysql_fetch_array)
Returnerer et associativt array, der nedstammer fra den resulterede række, eller FALSE hvis der er 0 eller flere rækker.
Avatar billede sungdk Nybegynder
22. april 2005 - 17:13 #17
Kan forskellen gøre at siden bliver mere usikker? Og hvornår bruger man hvad?

I min database har jeg en unik kode til hver bruger lavet med md5. Som i kan se i koden ovenfor, så opreter jeg en session med denne kode.
På undersiderne, har jeg så tjekket for at session[id] er sat og session[reg] stemmer overens med koden i databasen for denne bruger. Hvordan kan hackeren komme uden om denne "sikkerheds" foranstaltning?

Tak :D
Avatar billede kourinsu Nybegynder
22. april 2005 - 17:17 #18
På php-servere, der er bare forholdsvis opdaterede, vil funktionen der hedder magic_quotes være slået til. Det betyder at ' helt automatisk bliver erstattet af \'. Hvis man vil være helt sikker, vil jeg anbefale man bruger addslashes funktionen.
http://dk.php.net/manual/en/function.addslashes.php
Avatar billede ranglen Nybegynder
22. april 2005 - 17:18 #19
Måske ovenstående løsning lige skulle overvejes.

magic quotes er enabled i php.ini (http://dk.php.net/get_magic_quotes_gpc). Det ved jeg, fordi jeg allerede har testet om login var sårbar overfor denne type angreb :)

Dvs hvis jeg i username indtaster: ranglen's svar

Vil php aflevere dette som: ranglen\'s svar

Ovenstående script laver dette om til: ranglen\''s svar

Dvs msql vil se strengen slutte lige foran s

Dvs med denne løsning åbner man faktisk op for sql injektion
Avatar billede sungdk Nybegynder
22. april 2005 - 17:21 #20
ranglen > Har Str. replace så også en farefaktor? Skal jeg fjerne det?
Avatar billede Slettet bruger
22. april 2005 - 17:28 #21
Ja det skal du. Udover at den ikke er nødvendig, viser det sig nu at den egentlig er til fare for dit system.
Avatar billede sungdk Nybegynder
22. april 2005 - 17:37 #22
Ok!

Men nu er jeg på VIRKELIG bar bund! Hvordan har han så båret sig ad? :(
Avatar billede kourinsu Nybegynder
22. april 2005 - 17:44 #23
Hvis du har haft uvelkommen besøg, behøves fejlen ikke ligge i dit login script. Hvad med login-valideringen på de underlæggende sider?

Jeg bruger egentlig altid selv sessions, så jeg ved ikke så meget om cookies, så måske jeg tager helt fejl. Det ser ud som om, du gemmer brugerens brugernavn og password i en cookie. Måske en person har fået en kopi af en cookie, eller sniffet sig frem til det over et netværk(?).
Avatar billede sungdk Nybegynder
22. april 2005 - 17:51 #24
<? session_start();
include "conn.php";
$result = mysql_query("SELECT id,reg From m_brugere WHERE id = '$_SESSION[id]'") or die(mysql_error());
$row = mysql_fetch_array($result);
mysql_close($conn);

if ($_SESSION["id"] == '' || $_SESSION[reg] <> $row[reg]) {
Header("Location:../?action=session");
exit;
} else { ?>

Sådan ser validereing ud på login-siderne.

COOKIES bruger jeg kun til hvis brugeren siger gemlogin. Den validere slet ikke på de andre sider om dette er sat.

Jeg tror ikke at han har sniffet sig frem til det over netværk. FOrdi jeg kan se at han kan ændre sessions osv.
Avatar billede kourinsu Nybegynder
22. april 2005 - 17:56 #25
Hvordan mener du ""ændre sessions"? Jeg mener, at sessions bliver gemt på serveren, så hvis man skal ændre i en igangværende session, skal man mindst have adgang til selve webserveren...
Avatar billede Slettet bruger
22. april 2005 - 18:07 #26
Hvis du har haft en "hacker" inde på dit site, har han højst sandsynlig (Helt sikkert) fundet frem til dit/et brugernavn og en dertilpassende adgangskode. Med dit script er det ikke muligt at "hacke" sig ind.
Avatar billede kourinsu Nybegynder
22. april 2005 - 18:13 #27
wicez >> nu skal man aldrig sige aldrig, men du har højest sandsynlig ret. Er du sikker på, labisama, at du aldrig har logget ind via en offentlig computer, eller et andet sted, hvor nogen har kunnet overvåge nettet? Måske en af dine buddys driver gæk med dig, efter du har logget ind via hans computer og måske ved en fejl gemt login/pass i en cookie.
Avatar billede sungdk Nybegynder
22. april 2005 - 18:21 #28
Jeg troede heller ikke at siden var hackbar. Men jeg er blevet MEGET klogere.

Hvis han havde mit brugernavn og pass, så ville jeg kunne se hvis brugerens normale ip pludselig blev en andens ip. Men jeg har ikke noget udslag. Og heller ikke i resten af admins stablen :(
Avatar billede Slettet bruger
22. april 2005 - 18:23 #29
Hvad fik dig til at tro at din hjemmeside var blevet hacked "firstplace" ?
Avatar billede sungdk Nybegynder
22. april 2005 - 18:25 #30
At pludselig her forleden dag da jeg kom hjem, så havde jeg 50 mails fra brugerne på siden, om hvorfor helvede at vi havde slettet deres brugere.

På chatten kunne man senere se at der var en uden brugernavn, som sagde at siden var for nem at hacke... Og spammede!

Dvs. det var vidst nok til at fastslå det
Avatar billede Slettet bruger
22. april 2005 - 18:28 #31
Jep. Du skal måske logge _al_ handling på dit site, da der enten er en person der har hacket sig ind, eller én af dine "betroede" admins har fået et flip. Det kan naturligvis også være en af disse der er blevet "hacket".
Avatar billede kourinsu Nybegynder
22. april 2005 - 18:28 #32
Jaaaa, det må man vist sige.
Har han ellers lavet noget? Forklaringen kunne jo være, at han har adgang til jeres database. Så kan han nemt slette sine spor...
Avatar billede Slettet bruger
22. april 2005 - 18:30 #33
Du kan naturligvis også være kommet til at give dit databasebrugernavn og -kodeord til en person / i et offentligt forum, hvorefter en person har logget sig derind.
Avatar billede sungdk Nybegynder
22. april 2005 - 18:31 #34
kour > Ang databasen.... så nej. Fordi jeg kan se at han bruger slette funktionen hos brugerne. Den sletter nemlig noget andet i nogle andre tabeller samtidigt.

wicez > Alle admins er taget fra deres rettigheder da jeg opdagede angrebet. Og alligevel fortsatte han lidt senere.
Avatar billede kourinsu Nybegynder
22. april 2005 - 18:36 #35
Hmmm...hvis alle admins er frataget deres rettigheder, så hjælper det jo ikke, hvis han har en af deres bruger/passwords. Så kan han jo ikke gøre noget alligevel. Derfor tror jeg bestemt heller ikke, login-scriptet er hvor fejlen er. Der er vel ikke mulighed for, at han har adgang til databasen, så han giver sig selv admin-rettigheder, laver sit lort og ændre sig til alm bruger igen?
Avatar billede Slettet bruger
22. april 2005 - 18:36 #36
okay, så kan jeg ikke se andet alternativ, end mit forslag 18:30:59
Avatar billede Slettet bruger
22. april 2005 - 18:54 #37
Men du har vel taget backup af din database?
Avatar billede sungdk Nybegynder
22. april 2005 - 19:01 #38
Hans ip er: 82.179.198.98

Og nej ville selvfølgelig først have taget backup om aftenen, og det skete om dagen :(
Avatar billede Slettet bruger
22. april 2005 - 19:07 #39
Den IP du skriver der, er IP'en til hjemmesiden: www.wsh.ru - altså en russisk webhost :/
Avatar billede kourinsu Nybegynder
22. april 2005 - 19:09 #40
Hvis han skrev noget på dansk, kunne det tænkes at han bruger en proxy.
Avatar billede Slettet bruger
22. april 2005 - 20:10 #41
Idet han ikke har skrevet noget, men kun slettet brugerne, er dette højst sandsynligt umuligt at finde ud af.
Avatar billede kourinsu Nybegynder
22. april 2005 - 20:14 #42
"På chatten kunne man senere se at der var en uden brugernavn, som sagde at siden var for nem at hacke... Og spammede!"

Så han er jo åbenbart dansk...
Avatar billede Slettet bruger
22. april 2005 - 20:17 #43
Jeg forstod det som, at der var en bruger der havde fået slettet sit brugernavn, hvorfor han var blevet sur.
Jeg må dog tilstå, at du nok har ret :o)
Avatar billede arne_v Ekspert
22. april 2005 - 20:25 #44
Med hensyn til beskyttelse mod SQL injection vil jeg lige henlede opmærksomheden på:
  http://www.php.net/manual/en/function.mysqli-prepare.php
som nok må være den rigtige måde hvis man er på PHP 5 og MySQL 4.1
Avatar billede sungdk Nybegynder
23. april 2005 - 20:49 #45
Deler lige point op... Håber det ok
Avatar billede Slettet bruger
23. april 2005 - 21:19 #46
Helt iorden :o) tak for point
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