Gå til innhold

Problemer med php include


Anbefalte innlegg

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
Videoannonse
Annonse

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

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

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

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

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: 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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...