Avatar billede bente_fiber Nybegynder
21. august 2005 - 16:20 Der er 32 kommentarer og
2 løsninger

Sikkerhedshul, men kan ikke finde det - hjælp!

Hej xperter..

Jeg har lavet et login-script med tilhørende Nyheds-poster, forum osv. Har kikket på koden, men kan ikke finde nogle problemer, selvom det lader til at jeg har et sikkerhedshul - et stort et - som jeg ikke kan finde.

Der er nemlig en person, som bliver ved med at ændre på brugernes data, og skrive fra andre brugeres profil.
Se f.eks her: http://www.enetonline.dk/login/traad.php?id=11

Håber i kan hjælpe mig, det vil gøre mig evig taknemmelig :)

Med venlig hilsen
Simon
Avatar billede arne_v Ekspert
21. august 2005 - 16:43 #1
nu er det jo sværtr at sige uden at have set login scriptet

men en oplagt mulighed var jo noget SQL injection
Avatar billede ksoren Nybegynder
21. august 2005 - 16:45 #2
Mht at skrive i andres navne:

<input type="hidden" value="navn på bruger" name="brugernavn">

Hvis identiteten af en bruger afhænger af dette hidden-form-input, så er det faktisk ret nemt. Du bør nok bruge det id du gemmer i brugerens session ved login.
Avatar billede bente_fiber Nybegynder
21. august 2005 - 16:50 #3
#k_soren..

Det er ikke det, det hul har jeg nemlig rettet, således at det kun virker, når man kommer fra ENET's forum-område. På den måde kan man jo ikke ændre det, så det burde være udelukket.

Han fortæller at sitet står pivåbent. Og at han kan ændre alle folks data.
Forstår ikke hvordan, kan det have noget at gøre med cookien?

/SkipperBent
Avatar billede bente_fiber Nybegynder
21. august 2005 - 16:52 #4
Personen ændrer også på signaturen i selve "profilen". Hvilket man ikke kan gøre med de hidden values..
Avatar billede bente_fiber Nybegynder
21. august 2005 - 16:54 #5
Men har fjernet det, så brugernavnet er det samme, som det der er gemt i cookien..
Avatar billede ksoren Nybegynder
21. august 2005 - 16:54 #6
1) Du kan ikke stole på HTTP_REFERER. Den nemmeste måde at omgå den på, er via java-script-injection

2) Ja din cookie er også dit problem. Du har "auth=fork!brugernavn". Den kan jeg så ændre til som jeg har lyst
Avatar billede thesurfer Nybegynder
21. august 2005 - 16:55 #7
Brug ikke cookies til brugernavne.. cookies kan redigeres..

Jeg tror at arne_v har ret, i det han skrive i 21/08-2005 16:43:25.

Hvis du ikke forstår hvad han mener, spørg.

/theSurfer
Avatar billede ksoren Nybegynder
21. august 2005 - 16:59 #8
Så skrot de der cookies, og brug session i stedet for
Avatar billede bente_fiber Nybegynder
21. august 2005 - 17:00 #9
Hey, er rrigtig glade for jeres input. Men er på begynderstadiet i php, så har brug for mere information.

Hvad kan jeg gøre for at forhindre det? Bruge noget helt andet end cookie?
Avatar billede bente_fiber Nybegynder
21. august 2005 - 17:01 #10
#Ksoren :
Hvordan går jeg igang med at bruge session... det er helt ukendt område.
Avatar billede bente_fiber Nybegynder
21. august 2005 - 17:12 #11
evt. nogen der har en guide ller lignened?
Avatar billede antikat Nybegynder
21. august 2005 - 17:21 #12
Hej

prøv at skrive:

'or''='

som både brugernavn og passsword og se hvad der sker!
Avatar billede bente_fiber Nybegynder
21. august 2005 - 17:23 #13
#antikat,

hvad mener du?
Hvor skal jeg skrive det henne, og hvad gør det?
Avatar billede antikat Nybegynder
21. august 2005 - 17:25 #14
i dit login felt...

du skal have lave sådan at man ikke kan skrive special tegn som "< > ' / \ " i dit login script
Avatar billede bente_fiber Nybegynder
21. august 2005 - 17:27 #15
Vil det gøre, at man ikke kan snyde?

Og hvor ville du skrive det her?


<?php

$stylesheet = '<link href="http://www.enetonline.dk/style.css" rel="stylesheet" type="text/css">';


session_start();

echo $stylesheet;
include 'config.php';

$connection = @mysql_connect($hostname, $user, $pass)
or die(mysql_error());
$dbs = @mysql_select_db($database, $connection) or
die(mysql_error());

$sql = "SELECT * FROM $userstable WHERE username = '$_POST[username]' AND password = '$_POST[password]'";
$result = @mysql_query($sql,$connection) or die(mysql_error());
$num = @mysql_num_rows($result);

if($_GET['bruger'] == logaf) {
session_destroy();
header ("Location: http://www.enetonline.dk/login/index.php?action=signout");
}




if ($num != 0) {
$cookie_name = "auth";
$cookie_value = "fook!$_POST[username]";
$cookie_expire = "0";
$cookie_domain = $domain;

setcookie($cookie_name, $cookie_value, $cookie_expire, "/", $cookie_domain, 0);
$_SESSION['online'] = TRUE;




}

ob_start();
if(isset($_SESSION['online']))
{
$stylesheet = "<style>
.knap
{
font-face: tahoma;
font-size: 8pt;
display: block;
height: 15px;
color: black;
border-style: solid;
border-color: black;
border-width: 0;
}
.knap:hover
{
font-family: tahoma;
font-size: 11px;
text-decoration: none;
color: #FFFFFF;
height: 13px;
border-width: 1px;
background-position: 50%;
background-image: url('http://www.enetonline.dk/index.phptemplates/news_bg.gif');
}
</style>";
echo $stylesheet;

echo "<body bgcolor=\"#F2F2F2\"><table cellpadding=\"0\" cellspacing=\"0\" height=\"20\" width=\"100%\" align=\"left\">
    <tr>
        <td height=\"30\" width=\"16%\" class=\"knap\">
        <a class=\"knap\" target=_top href=http://www.enetonline.dk/login/nyheds_poster.php?side=opret>Opret nyhed</a></td><tr>
        <td height=\"30\" width=\"16%\" class=\"knap\">
        <a class=\"knap\" target=_top href=http://www.enetonline.dk/login/nyheds_poster.php?side=alle>Se nyhederne</a></td><tr>
        <td height=\"30\" width=\"16%\" class=\"knap\">
        <a class=\"knap\" target=_top href=http://www.enetonline.dk/login/community.php>Community</a></td><tr>
        <td height=\"30\" width=\"16%\" class=\"knap\">
        <a class=\"knap\" target=_top href=http://www.enetonline.dk/login/members.php>Se alle medlemmer</a></td><tr>
        <td height=\"30\" width=\"16%\" class=\"knap\">
        <a class=\"knap\" target=_top href=http://www.enetonline.dk/login/profile.php>Ændre din profil</a></td><tr>
        <td><br><br></td><tr>
        <td height=\"30\" width=\"16%\" class=\"knap\">
        <a class=\"knap\" target=_top href=http://www.enetonline.dk/login/login_hojremenu.php?bruger=logaf>Log ud</a> </td><tr>
    </tr>
</table>";
die;
ob_end();

}
else
{
echo "<form action=\"http://www.enetonline.dk/login/login_hojremenu.php\" method=\"POST\">";
echo "&nbsp;&nbsp;Brugernavn: <br>&nbsp;&nbsp;<input type=\"text\" name=\"username\" size=\"20\" style=\"font-size: 8pt; font-family: Tahoma\"><br>";
echo "&nbsp;&nbsp;Password:  <br>&nbsp;&nbsp;<input type=\"password\" name=\"password\" size=\"20\" style=\"font-size: 8pt; font-family: Tahoma\"><br>";
echo "<br>&nbsp;&nbsp;<input type=\"submit\" value=\"Login!\" style=\"font-size: 8pt; font-family: Tahoma\">";
echo "</form>";
echo "• <a target=_top href=\"http://www.enetonline.dk/login/register.php\">Opret konto</a>";
echo "<br> • <a target=_top href=\"http://www.enetonline.dk/login/reset.php\">Glemt bruger & password</a>";
echo "<br> • <a target=_top href=\"http://www.enetonline.dk/login/passwordreset.php?step=1\">Nulstil dit password!</a></font><br><br>";
}



?><body bgcolor="#F2F2F2">
Avatar billede thesurfer Nybegynder
21. august 2005 - 17:32 #16
Du må aldrig bruge kode som:

username = '$_POST[username]' AND password = '$_POST[password]'"

!!!

Du kan logge ind, med f.eks.
brugernavn: skipperbent
kodeord: ' or 1 = 1 or '' = '

Så kommer der til at stå:

username = 'skipperbent' AND password = '' or 1 = 1 or '' = ''"

Hvilket jo passer..

Så man skal kun kende brugernavnet! - Det er sådan "hackeren" gør det..

/theSurfer
Avatar billede bente_fiber Nybegynder
21. august 2005 - 17:34 #17
Mange tak thesurfer, men hvad skal jeg gøre for, at han ikke bruger denne metode?

Hvor skal jeg placere "'or''='"
Avatar billede ksoren Nybegynder
21. august 2005 - 17:34 #18
Antag du skriver som brugernavn: skipperbent'#

så kommer sql-sætningen til at hedde:

SELECT * FROM $userstable WHERE username = 'skipperbent'#' AND password = 'xx'

så vil den blankt ignorere passwordet, og logge mig ind som skipperbent.
Avatar billede thesurfer Nybegynder
21. august 2005 - 17:35 #19
Du skal altid erstatte ' tegn med dobbelt ''. eller "\'"..

Der er vist noget PHP-kode der automatisk fixer det.. kender det ikke lige, da jeg ikke programmere i PHP..

/theSurfer
Avatar billede ksoren Nybegynder
21. august 2005 - 17:36 #20
# angiver en kommentar i mysql. Alt hvad der står efter bliver ignoreret.

$username = addslashes($_POST['username']);
$password = addslashes($_POST['password']);

$sql = "SELECT * FROM $userstable WHERE username = '$username' AND password = '$password'";

så er du beskyttet mod sql injection ved login. Der ligger nogle artikler i artikelsektionen  som omhandler dette problem
Avatar billede bente_fiber Nybegynder
21. august 2005 - 17:41 #21
Jeg takker mange gange..

Men hvis jeg f.eks bruger #KSOREN's forslag, så er jeg beskyttet imod SQL injection som omfatter, at han kan logge ind med f.eks min konto (skipperbent.)?
Avatar billede thesurfer Nybegynder
21. august 2005 - 17:42 #22
Ja, mon alle konti.

/theSurfer
Avatar billede thesurfer Nybegynder
21. august 2005 - 17:42 #23
mon = mod

/theSurfer
Avatar billede bente_fiber Nybegynder
21. august 2005 - 17:46 #24
Mange tak.. hvordan kan ejg give jer jeres velfortjente point???
Shit mand jeg er glad for jeres hjælp!!
Avatar billede ksoren Nybegynder
21. august 2005 - 17:47 #25
Men du er nødt til at læse op på emnet. Alle steder hvor du sammensætter en sql-sætning, med input fra brugeren, er du sårbar, hvis du ikke validerer inputtet.

Og sessions. Selv med beskyttelse mod sql injection, så er du pivåben, når du bruger cookies. Google: php sessions
giver et par artikler om emnet
Avatar billede bente_fiber Nybegynder
21. august 2005 - 17:49 #26
Så jeg burde droppe mine cookies, og bruge php-sessions?

Gælder Sql-injection også hvor jeg insætter sql ?
Avatar billede thesurfer Nybegynder
21. august 2005 - 18:22 #27
SQL injection gælder alle steder, hvor man bruger SQL..

/theSurfer
Avatar billede bente_fiber Nybegynder
21. august 2005 - 20:45 #28
Ok.. jeg takker, er der flere en antikat der vil have point?
Avatar billede arne_v Ekspert
21. august 2005 - 20:53 #29
thesurfer og ksoren burde da ihvertfald
Avatar billede enetonline_dk Nybegynder
21. august 2005 - 23:48 #30
der er ingen der beder om point?
Avatar billede arne_v Ekspert
21. august 2005 - 23:50 #31
giv dem lige lidt tid

måske sidder de og søndags hygger med familien
Avatar billede thesurfer Nybegynder
22. august 2005 - 00:57 #32
Jeg var lige inde og se "Skeleton Key" og "The Island".. "Skeleton Key" er god, og kan klart anbefales.. "The Island" er ok, men ikke helt vild god.. lidt af en tøse-film, med sfx.. faktisk lidt ligesom "Batman Begins".. :-)

- Svar :-)

/theSurfer
Avatar billede bente_fiber Nybegynder
22. august 2005 - 03:11 #33
HEHE
Avatar billede bente_fiber Nybegynder
22. august 2005 - 03:12 #34
Sådan der..  nice one the surfer :P
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