Avatar billede hav0k Nybegynder
02. oktober 2005 - 22:46 Der er 18 kommentarer og
2 løsninger

Gevinst til den som kan omgå mit login!

Jeg har lavet et login system på www.waldorfwide.com og vil gerne lige have checket det af - og hvilken løsning er bedre end at slippe alle 'ekspertene' løs? 200 point til den første som skriver det hemmelige svar her. ;)
Avatar billede ksoren Nybegynder
02. oktober 2005 - 23:07 #1
Prøv at vise os koden
Avatar billede hav0k Nybegynder
02. oktober 2005 - 23:12 #2
Så pyt:

Login.php:

<?
if(isset($_POST['login_submit'])) { //Tester om brugeren kommmer fra login form
    $postpw = md5($_POST['pw']);
       
    $query = mysql_query("SELECT * FROM users WHERE nick = '" . $_POST["nick"] . "' AND pw = '$postpw'") or die(mysql_error()); //Spørger efter ID
   
    $count = mysql_num_rows($query); //Tæller antaller af resultater
        if($count == 1) { //Hvis der kun er et resultat logged in
            while ($row = mysql_fetch_array ($query)) {
                $_SESSION["id"] = $row["id"];
                $_SESSION["nick"] = $row["nick"];
                $_SESSION["pw"] = $row["pw"];
                echo "login_number er = 1!<br> og nickname: " . $_SESSION["nick"];
            }
            echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=http://www.waldorfwide.com/?page=admin\">";
           
        }else{
            $loginstatus = "Forkert brugernavn/kodeord!";
        }
}

// Login formlen: (vises kun hvis login-sessions ikke eksisterer)

if(!$_SESSION["id"] || !$_SESSION["nick"] || !$_SESSION["pw"]){
?>
Login page:<br><br>
<form method="post" action="?page=login" name="login">
Brugernavn!<br>
<input type="text" name="nick" size="30" maxlength="30"><br>
Adgangskode!<br>
<input type="password" name="pw" size="30" maxlength="30"><br>
<input type="hidden" name="login_submit" value="1">
<input type="submit" value="Log ind" name="submit"></form>
<?php echo $loginstatus;

//logout - vises kun hvis en af login-sessions eksisterer

}elseif(isset($_SESSION["id"]) || isset($_SESSION["nick"]) || isset($_SESSION["pw"])){
    echo "Klik her for at <a href=\"?page=login&action=logout\">logge ud!</a>";

if($_GET["action"] == "logout"){
    logout();
}
}
?>

Admin.php:

<?php
login_check();

echo "Admin Page<br><br><br> Secret answer: ****";

?>

og funktionen i db.php:

function login_check(){
    $query = mysql_query("SELECT * FROM users WHERE id = '" . $_SESSION["id"] . "'") or die(mysql_error());
    $count = mysql_num_rows($query); //Tæller antaller af resultater
    while ($row = mysql_fetch_array ($query)) {
        $check = $row["pw"];
    }
    if ($_SESSION["pw"] !== $check OR !$count OR $count > 1) {
        session_destroy();
        echo "You are not logged in as user. <br>You will be redirected to main page.
        <META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=http://www.waldorfwide.com\">";
        exit;
    }
}

Give it a try..
Avatar billede ksoren Nybegynder
02. oktober 2005 - 23:17 #3
Hvad nu, hvis du afvikler scriptet på en server uden magic quotes aktiveret?
Avatar billede hav0k Nybegynder
02. oktober 2005 - 23:21 #4
Det kan godt være jeg er idiot - men hvad er magic quotes?
Avatar billede ksoren Nybegynder
02. oktober 2005 - 23:34 #5
magic quotes er en PHP ting. Når noget submittes, bliver alle apostroffer automatisk escaped med en backslash.

Dvs hvis jeg indtaster: ksoren's hest
Afleverer PHP: ksoren\'s hest

Uden magic quotes, skal du lave en addslashes() på alt input, inden du sætter det ind i din sql streng.

Læs lidt om SQL injection. Google har en million hits på dette, og der ligger vist nogle i artikelsektionen.
Avatar billede hav0k Nybegynder
02. oktober 2005 - 23:36 #6
Okay meget rart at vide :) Men kan det have relevans for sikkerheden ved scriptet?
Avatar billede ksoren Nybegynder
02. oktober 2005 - 23:58 #7
Du kan simulere magic quotes=off ved at

$nick = stripslashes($_POST["nick"]);

$query = mysql_query("SELECT * FROM users WHERE nick = '" . $nick . "' AND pw = '$postpw'") or die(mysql_error()); //Spørger efter ID


og prøv at indtaste dette som nick i formen (burde virke, hvis jeg har holdt tungen lige i munden):
' union select '\' union select \'id\',\'nick\',\'password\'#','nick','password'#

bliver du logget ind, og som hvem?
Avatar billede ksoren Nybegynder
02. oktober 2005 - 23:59 #8
jeg antager at din users tabel kun har de 3 kolonner
Avatar billede hav0k Nybegynder
03. oktober 2005 - 19:06 #9
Hmm... det virker ikke .. Skal jeg bruge password eller ej? (virkede dog hverken med intet, forkert eller rigtigt password).
Avatar billede hav0k Nybegynder
03. oktober 2005 - 19:14 #10
Nu har jeg prøvet at sætte det der magic quotes=off ved dit eks. med stripslashes, og nu kom jeg videre fra loginformlen - men blev afvist ved admin delen som checker efter om login er gyldigt (se ovenstående). Tror det er fordi den ikke opretter nogen sessions med dit eksempel - som jo er krævet ved hver login_check()
Avatar billede ksoren Nybegynder
03. oktober 2005 - 19:22 #11
Så prøv med en simpel. Sæt nick=

' union select * from users#
Avatar billede ksoren Nybegynder
03. oktober 2005 - 19:22 #12
Secret answer: laks
Avatar billede jakobdo Ekspert
03. oktober 2005 - 20:37 #13
Du kan f.eks. bruge denne løsning:

if (!get_magic_quotes_gpc())
{
  $lastname = addslashes($_POST['lastname']);
}
else
{
  $lastname = $_POST['lastname'];
}
Avatar billede hav0k Nybegynder
04. oktober 2005 - 22:39 #14
Deprimerende at se sit login system omgået :S

Jeg forstår bare ikke helt: hvis jeg nu bare udelukker:
$nick = stripslashes($_POST["nick"]);

så kan man ikke snyde loginformlen, og der burde ikke være noget problem?
Avatar billede hav0k Nybegynder
04. oktober 2005 - 22:51 #15
Der bliver vist ikke sat slashes på automatisk på serveren så, kan jeg regne ud?
Avatar billede jakobdo Ekspert
05. oktober 2005 - 07:53 #16
Du kan rette din linie:
$query = mysql_query("SELECT * FROM users WHERE nick = '" . $_POST["nick"] . "' AND pw = '$postpw'") or die(mysql_error()); //Spørger efter ID

til:

function customAddslashes($str)
{
    if (!get_magic_quotes_gpc())
    {
      $str = addslashes($str);
    }
    return $str;
}

$nick = customAddslashes($_POST['nick']);
$query = mysql_query("SELECT * FROM users WHERE nick = '" . $nick . "' AND pw = '$postpw'") or die(mysql_error()); //Spørger efter ID
Avatar billede hav0k Nybegynder
05. oktober 2005 - 20:29 #17
Okay mange tak for hjælpen..

ksoren -> læg et svar, du har været til stor hjælp.

jakobdo -> læg også et svar - du fortjener også et par point for dine svar.

I må meget gerne prøve om I kan bypasse mit login nu :)

/Regards Elias
Avatar billede jakobdo Ekspert
05. oktober 2005 - 21:55 #18
Et svar! (synes dog hovedparten af pointene er ksoren's)
Avatar billede ksoren Nybegynder
05. oktober 2005 - 22:26 #19
ok. At den første version ikke virkede, kan skyldes du har magic_quotes_runtime = On
det kan kontrollers med phpinfo();

Den option tilføjer automatisk backslash ved udtræk fra databasen

Fik du styr på, hvorfor den union select loggede dig ind?
Avatar billede hav0k Nybegynder
07. oktober 2005 - 22:06 #20
Well jeg fik styr på princippet bag det, men måske ikke det helt praktiske, hvad unions select gør og hvordan den "snyder" systemet.

Men tak for svarene! :)
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