travis_g Skrevet 9. desember 2006 Del Skrevet 9. desember 2006 Jeg holder på å legge ut en nettside på et nytt domene jeg har opprettet. Men includescriptet vil ikke fungere riktig. Scriptet: Klikk for å se/fjerne innholdet nedenfor <?php $ending = ".inc.php"; $incfil = "$ma/$si$ending"; $standardfil = "forsiden/hoved$ending"; $feil = "forsiden/feil$ending"; if (isset($_GET['ma']) and isset($_GET['si'])) { $_GET[ma] = stripslashes(strip_tags($_GET['ma'])); $ikke1 = ereg("\.\./", $_GET['ma']); $ikke2 = ereg("/", $_GET['ma']); $ikke3 = ereg("\.\./", $_GET['si']); $ikke4 = ereg("/", $_GET['si']); if ($ikke1 OR $ikke2 OR $ikke3 OR $ikke4) { include("$feil"); } elseif (@fopen($incfil, r)) { include ($incfil); } else { include ($feil); } } else { include ($standardfil); } ?> Det som er problemet er at scriptet ikke vil fungere på: http://www.sarpsborgrkh.no Men dersom jeg laster opp de eksakt samme filene på: http://tg-design.net/sarpsborgrkh, så fungerer det helt fint. Begge disse sidene ligger under servetheworld, så det skal ikke være noe orskjell der. Har sjekket instillingene for php i cp, men kan ikke se noe feil. Noen som har noe forslag? Lenke til kommentar
fiLLLipnet Skrevet 11. desember 2006 Del Skrevet 11. desember 2006 Vet ikke om det hjelper deg men, her er koden (laget nå) <? $dir = './filer/'; $src = $_GET['p']; $ext = '.php'; $404 = '404.php'; $home = 'home.php'; if(isset($src)){ if(file_exists($dir.$src.$ext)){ include($dir.$src.$ext); } else{ include($dir.$404); } } else{ include($dir.$home); } ?> Det skal funke, om du ikke får det til, post feilmelding her Lenke til kommentar
Ståle Skrevet 11. desember 2006 Del Skrevet 11. desember 2006 Men da blir det ikke testet om $_GET['ma'] eller $_GET['si']inneholder ../er. Lenke til kommentar
fiLLLipnet Skrevet 11. desember 2006 Del Skrevet 11. desember 2006 nei.. :/ men du kan bare åpne filer som ender på .php Lenke til kommentar
Lurifaksen Skrevet 11. desember 2006 Del Skrevet 11. desember 2006 nei.. :/men du kan bare åpne filer som ender på .php 7477307[/snapback] Som f.eks. http://mittdomene.com/slett-alle-filer.php Lenke til kommentar
Ståle Skrevet 11. desember 2006 Del Skrevet 11. desember 2006 Eller et litt mer reelt eksemplel vis_kildekode.php Lenke til kommentar
travis_g Skrevet 11. desember 2006 Forfatter Del Skrevet 11. desember 2006 Men problemet her er ikke at koden jeg allerede har ikke fungerer. Jeg kjører jo akkurat samme scriptet på 5 andre sider uten problem. Lenke til kommentar
Runar Skrevet 11. desember 2006 Del Skrevet 11. desember 2006 Ligger filene i forsiden mappa? Lenke til kommentar
jorgis Skrevet 12. desember 2006 Del Skrevet 12. desember 2006 Med fare for å gå off-topic må jeg bare rette litt opp i en ganske farlig misforståelse her: nei.. :/men du kan bare åpne filer som ender på .php 7477307[/snapback] Stemmer ikke. Ved hjelp av en liten bug som halvveis ligger i PHP, og halvveis i de underliggende systemkall, kan en åpne filer som ikke ender på PHP. Det kalles Poison NULL Byte (\0), og det skyldes at \0 tolkes som et vanlig ikke-skrivbart tegn av PHP, mens de underliggende systemkall til OSet tolker \0 som end-of-line (EOL). Resultatet blir at selve include-kallet stripper bort alt etter \0. URL-encodet versjon av \0 er %00, så en kan da gjøre slik med include-scriptet ditt: index.php?p=../../../../../../../../../../etc/passwd%00 Og få listet ut /etc/passwd-filen direkte i browseren. Lenke til kommentar
Martin A. Skrevet 12. desember 2006 Del Skrevet 12. desember 2006 Virker som en register_globals-feil. Om du ser på første delen $ending = ".inc.php"; $incfil = "$ma/$si$ending"; $standardfil = "forsiden/hoved$ending"; $feil = "forsiden/feil$ending"; Hvor kommer $ma og $si fra? Og skal du binde sammen flere variabler bør/skal du ha punktum mellom. $si.$ending feks. Du kan jo la la deg inspirere av et includescript jeg har brukt i litt over ett år $side = $_GET['side']; $mappe = "includes/"; $ink = ".inc"; if(empty($side)) { include($mappe . "main.php"); } elseif(!empty($side) AND !preg_match("#\.\./|^/#", $side) AND file_exists($mappe . $side . $ink .".php")) { include($mappe . $side . $ink . ".php"); } else { include($mappe . "404.php"); } Lenke til kommentar
jorgis Skrevet 12. desember 2006 Del Skrevet 12. desember 2006 PHP <?php $ma = $_GET['ma']; $si = $_GET['si']; $ending = ".inc.php"; $incfil = "$ma/$si$ending"; $standardfil = "forsiden/hoved$ending"; $feil = "forsiden/feil$ending"; if (isset($ma) and isset($si)) { $ma = stripslashes(strip_tags($ma)); $ikke1 = ereg("\.\./", $ma); $ikke2 = ereg("/", $ma); $ikke3 = ereg("\.\./", $ma); $ikke4 = ereg("/", $ma); if ($ikke1 || $ikke2 || $ikke3 || $ikke4) { include($feil); } elseif (file_exists($incfil)) { include ($incfil); } else { include ($feil); } } else { include ($standardfil); } ?> Sånn, nå er det tatt høyde for manglende register_globals i scriptet, og det skal fungere greit. Mtp. sikkerhet bør du fikse litt mer på det, som å gjøre samme sjekker på $si som du har gjort på $ma. Det er fort gjort å benytte ../ sammen med poison null til å inkludere filer i operativsystemet eller annet kjipt. Lenke til kommentar
travis_g Skrevet 12. desember 2006 Forfatter Del Skrevet 12. desember 2006 jorgis: Dersom du ser på orginalscriptet som jeg har skrevet, og ikke det du har skrevet av, så vil du se at jeg allerede har sikret meg med "ereg" på $si Kan godt hende det er register_global som er feil i instillingene, men det som er rart, er at jeg bruker det eksakt samme scriptet på 5 andre sider jeg har. Lenke til kommentar
jorgis Skrevet 12. desember 2006 Del Skrevet 12. desember 2006 jorgis: Dersom du ser på orginalscriptet som jeg har skrevet, og ikke det du har skrevet av, så vil du se at jeg allerede har sikret meg med "ereg" på $si Kan godt hende det er register_global som er feil i instillingene, men det som er rart, er at jeg bruker det eksakt samme scriptet på 5 andre sider jeg har. 7485227[/snapback] Ah, stemmer, så ikke helt dem. Men det er nesten helt sikkert register_globals som er skyld i problemene dine. At det funker på fem andre sider er ikke rart, da veldig mange har register_globals slått på. Det er slett programmering å regne med at register_globals er slått på, så du bør uansett legge til de første to linjene fra det jeg postet i forrige innlegg. Bruk ini_get("register_globals") til å finne ut om register_globals er slått på eller av på de forskjellige serverne du bruker. Husk også at PHP6 ikke vil ha mulighet for register_globals, samt at PHP5 har default satt register_globals til Off. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå