Avatar billede zagger Juniormester
10. august 2011 - 11:37 Der er 21 kommentarer og
2 løsninger

Skide hackere

Jeg har en hjemmeside som konstant bliver angrebet af hackere. Jeg har efterhånden fundet frem til hvordan de kommer ind.

Jeg har et php-script som jeg bruger til at administrere indholdet på siden. Det er beskyttet med password, og der skal være sat en bestemt session for at man kan bruge det. Men alligevel formår de sataner at lægge alt muligt op via scriptet.

Hvad kan jeg gøre for at sikre mig mod disse angreb?
Avatar billede heinzdmx Nybegynder
10. august 2011 - 11:55 #1
Det er sandsynligvis SQL injections.
Avatar billede ggxdg Nybegynder
10. august 2011 - 12:05 #2
Som heinz siger, tror jeg også det er SQL injections.
Sørg for at escape hvad du bruger til queries ordenligt, eller brug noget mysqli og prepared statements.
Avatar billede zagger Juniormester
10. august 2011 - 14:03 #3
Jeg bruger mysql_real_escape_string for at beskytte mod SQL injections. Er der bedre måder at beskytte sig på?

Jeg har en mistanke om at de bruger session hijacking. Min mistanke bygger på at jeg har prøvet at slette det omtalte php-script. Og når det ikke er at finde er der ro på siden. Men lige så snart jeg lægger det op igen, bliver siden hacket igen.
Avatar billede heinzdmx Nybegynder
10. august 2011 - 14:06 #4
mysql_real_escape_string burde være fint nok.

Så tror jeg at eneste mulighed er at vi får noget kode for at se hvor fejlen ligger
Avatar billede ggxdg Nybegynder
10. august 2011 - 14:28 #5
mysql_real_escape_string er vidst ret godt ja, men hvis jeg husker ret, ikke skudsikkert - ikke lige så effektivt som mysqli og prepared statements (er ikke helt stiv i det område endnu, det er bare noget jeg har læst for nogen tid siden).

Som Heinz siger - lidt kode kunne være super godt.
Avatar billede wanze Nybegynder
10. august 2011 - 15:23 #6
Er du sikker på, at det ikke bare er et gammelt "hul" de bruger? Hvis de nu for længe siden har lagt et PHP-script op, som de stadig kan tilgå, så nytter det jo intet at sikre dit eget uploadscript, men du bliver derimod nødt til at slette deres. Det er typisk den metode de bruger.
Avatar billede zagger Juniormester
10. august 2011 - 17:22 #7
session_start();

//uname- og upass-sessions bliver sat når der logges ind.

$findupass = mysql_query("SELECT * FROM user WHERE username='". $_SESSION['uname'] ."'") or die(mysql_error());
while($findupassrow = mysql_fetch_assoc($findupass))
{
    $upass=$findupassrow['password'];
}


if($_SESSION['id']==1 && $_SESSION['uname']=="useradmin" && $_SESSION['upass']==$upass)
{

$variabler = mysql_real_escape_string($_REQUEST['database_kald']);

//Her administrerer jeg så min sides indhold.
}


@wanze: Jeg synes at jeg har gennemset alt min kode for at se om der skulle have sneget sig et skummelt script ind. Men jeg er ikke stødt på noget mistænkeligt.
Avatar billede heinzdmx Nybegynder
10. august 2011 - 18:11 #8
Gemmer du password i din session?

Jeg vil gå ud fra at det er tilstrækkeligt at tjekke om password og brugernavn er rigtige og så bare sætte username i session og droppe password.

Desuden gemmer du password som cleartext? Du bør som min. lave en MD5 hash og gemme den i stedet
Avatar billede zagger Juniormester
10. august 2011 - 19:28 #9
Password er gemt i en session ja. Det er udelukkende for at kunne sammenligne det med det der er gemt i databasen, for på den måde at sikre at det kun er den rette der får adgang til sine bruger oplysninger i tilfælde af session hijacking, som jeg jo har mistanke om at hackerne benytter sig af.

Passwords er krypteret med sha256 + salt, og det er de 2 hashværdier der bliver holdt op mod hinanden.
Avatar billede heinzdmx Nybegynder
10. august 2011 - 19:47 #10
Ahhh, okay. Så længe at der er hash værdier på gør det nok ikke det store
Avatar billede wanze Nybegynder
10. august 2011 - 20:10 #11
Hvor bliver sessionerne oprettet? Ved du, at filerne bliver uploadet igennem dit script? Du kan evt. prøve at logge, hvilke filer der bliver uploadet, så du kan se, hvor det sker.
Avatar billede webweaver Praktikant
10. august 2011 - 21:45 #12
Du bør benytte dig af prepared statements.

<?php

$findupass = mysql_query("SELECT * FROM user WHERE username='". $_SESSION['uname'] ."'") or die(mysql_error());
while($findupassrow = mysql_fetch_assoc($findupass))
{
$upass=$findupassrow['password'];
}

?>

skiftes ud med

<?php

$mysqli = new mysqli("host", "user", "pass", "db");

if (mysqli_connect_errno()) {
           
printf("Connect failed: %s\n", mysqli_connect_error());
exit();

}


if ($stmt = $mysqli->prepare("SELECT password FROM user WHERE username = ?")) {   
                                                                           
$stmt->bind_param('s', $username);
                               
$username = $_SESSION["uname"];
                       
$stmt->execute();

$stmt->bind_result($upass);

$stmt->fetch();

$stmt->close();

} else {

printf("Prepared Statement Error: %s\n", $mysqli->error);

}

?>


$upass indeholder nu kodeordet ...

Hvis du har salted hash, er det i hvert fald udemærket.
Går ud fra salt er random, så det ikke er ens hver gang?

Det er en dårlig idé at gemme password i en SESSION generelt.
Burde heller ikke være nødvendigt?
Avatar billede ggxdg Nybegynder
10. august 2011 - 21:47 #13
Bliver indputtet escapet før det bliver smidt over i session?
Ellers:

session_start();

//uname- og upass-sessions bliver sat når der logges ind.


$findupass = mysql_query("SELECT * FROM user WHERE username='". $_SESSION['uname'] ."'") or die(mysql_error());
// $findupass = mysql_query("SELECT * FROM user WHERE username='useradmin' OR 1=1") or die(mysql_error());
while($findupassrow = mysql_fetch_assoc($findupass))
{
    $upass=$findupassrow['password'];
}


if($_SESSION['id']==1 && $_SESSION['uname']=="useradmin" && $_SESSION['upass']==$upass)
{

$variabler = mysql_real_escape_string($_REQUEST['database_kald']);

//Her administrerer jeg så min sides indhold.


Med ovenstående, burde man kunne oprette en bruger med f.eks
User: zzzzzzzzz
Pass: iRule

og logge ind med:
User: useradmin' OR 1=1 ORDER BY user ASC
Pass: iRule


Det er måske ikke lige den mest elegante injection og kan sikkert gøres bedre, men du tillader mere end et resultat, så hvis man kan sikre sig at det pass man bruger, er det sidste i listen vil det med OR 1=1 accepteres af det efterfølgende password check, altså vil man kunne bruge passwordet for ens egen bruger, hvis bare man kan sikre sig at ens bruger er sidste resultat.
Avatar billede ggxdg Nybegynder
10. august 2011 - 21:48 #14
bah... prøver lige igen... sorry for spam:

Bliver indputtet escapet før det bliver smidt over i session?
Ellers:

session_start();

//uname- og upass-sessions bliver sat når der logges ind.


$findupass = mysql_query("SELECT * FROM user WHERE username='". $_SESSION['uname'] ."'") or die(mysql_error());
// $findupass = mysql_query("SELECT * FROM user WHERE username='useradmin' OR 1=1") or die(mysql_error());
while($findupassrow = mysql_fetch_assoc($findupass))
{
    $upass=$findupassrow['password'];
}


if($_SESSION['id']==1 && $_SESSION['uname']=="useradmin" && $_SESSION['upass']==$upass)
{

$variabler = mysql_real_escape_string($_REQUEST['database_kald']);

//Her administrerer jeg så min sides indhold.


Med ovenstående, burde man kunne oprette en bruger med f.eks
User: zzzzzzzzz
Pass: iRule

og logge ind med:
User: useradmin' OR 1=1 ORDER BY user ASC
Pass: iRule


Det er måske ikke lige den mest elegante injection og kan sikkert gøres bedre, men du tillader mere end et resultat, så hvis man kan sikre sig at det pass man bruger, er det sidste i listen vil det med OR 1=1 accepteres af det efterfølgende password check, altså vil man kunne bruge passwordet for ens egen bruger, hvis bare man kan sikre sig at ens bruger er sidste resultat.
Avatar billede ggxdg Nybegynder
10. august 2011 - 21:51 #15
Det er noget sludder jeg sidder og siger...
Med OR 1=1, vil ens username også være det sidste i listen og så har man ikke adgang alligevel!
Avatar billede ggxdg Nybegynder
10. august 2011 - 21:54 #16
og så viller session variablen heller ikke klare if'en længere nede, jeg undskylder for mine lidt for hurtige udtalelser.
Avatar billede zagger Juniormester
11. august 2011 - 11:00 #17
wanze: Sessionerne bliver sat når brugeren logger ind. Og jeg er så godt som 100% sikker på at det er mit eget script de bruger, da de ikke hacker min side når jeg sletter scriptet, og de derfor ikke kan finde det nogen steder.
Jeg har prøvet at slette scriptet i 14 dage, og kun lagt det op når jeg skulle bruge det for derefter at slette det igen med det samme. Resultat: ingen hacking. Så prøvede jeg at lægge det op igen, og allerede én dag efter begyndte de igen. Så det kan kun være den vej de kommer ind.

webweaver: Jeg vil prøve dit trick. :) Jeg ved godt at det er en dårlig idé at gemme passwords i sessions, og jeg vil også helst undgå det. Det var simpelthen i ren desperation for at prøve at sætte en stopper for hackeriet. Hvilket det jo så ikke gjorde alligevel.
Ja der bruges random salt.
Avatar billede webweaver Praktikant
11. august 2011 - 11:14 #18
Hvor har du egentlig $_SESSION["uname"] fra, siden du har denne session allerede før du sammenligner password med det indtastede og altså før selve login'et iværksætes?

Du burde vel bare have en $_POST værdi fra et felt i en form eller sådan noget, som du kan benytte, istedet for at oprette sessions allerede før man er logget ind.
Avatar billede zagger Juniormester
11. august 2011 - 11:23 #19
$_POST værdien fra login bliver gemt i $_SESSION["uname"]. Den kode jeg har lagt op er ikke login-scriptet. Det er en kontrol som bliver udført hver gang jeg vil lægge noget op på siden efter jeg er logget ind.
Avatar billede webweaver Praktikant
11. august 2011 - 11:54 #20
Jeps okay selvfølgelig. Så hænger det bedre sammen. Så er det selvfølgelig fint at benytte dig af sessionen der.
Avatar billede zagger Juniormester
12. august 2011 - 15:28 #21
Nå, det endte med at jeg lavede en "lås" hvor jeg skal ind og taste en kode for at låse den op. Den sætter så en session med låsekoden i. Denne session bliver så holdt op mod en if() for at give adgang til administrator-rettigheder.

Håber det virker. :)

Men tak for hjælpen. Læg svar jer der vil have point.
Avatar billede webweaver Praktikant
12. august 2011 - 20:11 #22
Det må tiden så vise :-) Ellers kan du jo altid vende tilbage og så må vi se på det igen.
Avatar billede heinzdmx Nybegynder
13. august 2011 - 13:53 #23
Svar her.
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