Beste mensen, ik heb te horen ekregen dat in een source van mij een RFI bug zit.

<?PHP
$page = substr($_GET['page'],0,3);
$page1 = substr($_GET['page'],0,7);

if( ($page == "../") OR ($page == "ima") OR ($page == "inc") OR ($_GET['page'] == "./") OR ($_GET['page'] == "../") OR ($page == "../") OR ($page1 == "http://") OR ($_GET['page'] == "/etc/passwd") OR ($_GET['page'] == "style/style.css") ) {
include("errors/error.php"); // Error
} else {
if ( !empty ( $_GET['page'] ) AND isset ( $_GET['page'] ) ) {
if ( file_exists ( $_GET['page'] ) ) {
include $_GET['page']; // Page self
} else {
include("errors/error.php"); // Error
}
} else {
include("home.php"); // Index
// }
}
}
}
?>

Is de code bij mij, ik werk verder op de site met mod_rewrite.

Wat is hier fout aan?

En wat kan je tegen RFI bugs doen, en wat is het precies?
Zo kan je het doen dus alle pagina's die getoont mogen worden in een array neerzetten:


<?php
    $array = array('home.php', 'login.php', 'logout.php'); // enz...
    
    if(in_array($_GET['page'], $array)) {
    //includen
    }
?>


Moet je hier maar even mee knutselen zouw ik zeggen..

edit:

<?php

$arrayP = array('home', 'inloggen', 'uitloggen');

if(!empty($_GET['page'])) {

if(in_array($_GET['page'], $arrayP)) {

if(file_exists($_GET['page'].'.php')) {

include($_GET['page'].'.php');

} else {

include('error.php');

}

} else {

include('error.php');

}

} else {

include('home.php');

}

?>

Alsjeblieft...

[edit]Is nederlands hoor! 100%[/edit]
Mebus, dan krijg je een enorme array, niet handig te onderhouden.
mijn dank is uitermate groot!
Arjan Kapteijn schreef op 24.04.2007 18:31
Mebus, dan krijg je een enorme array, niet handig te onderhouden.


Inderdaad maar voor een paar pagina's is dit opzich niet zo een probleem maar als het er een redelijk aantal zijn dan is jouw oplossing beter:)
Sorry arjan, de site is www.crimianlsfanaat.nl (Ja ik weet dat jullie er niet blij mee zijn, maar dit is zelf gescript en geen criminals. Deze community gaat omgebouwd worden naar een Algemene PHP / MySQL community)
En als ik http://en.wikipedia.org/wiki/Remote_File_Inclusion goed lees...

Klopt het dan als ik het goed lees dat het simpel opgelost kan worden door de register_globals off te zetten?

Heeft dit nadelige effecten voor een serveR?

Ik heb het nu al volgt:

<?PHP
if( ($s_lid['strafpunten'] >= 3) OR (ban_controle($bezoeker_ip) == 2) or ($s_lid['gebruiker'] == "Terror1st") ) {
include_once("includes/error_ban.php");
} else {

$page = substr($_GET['page'],0,3);
$page1 = substr($_GET['page'],0,7);


if(!is_file($_GET['page'])) {
//$_GET['page'] = "./home.php";
echo "File bestaat niet";
} else {


if( ($page == "../") OR ($page == "ima") OR ($page == "inc") OR ($_GET['page'] == "./") OR ($_GET['page'] == "../") OR ($page == "../") OR ($page1 == "http://") OR ($_GET['page'] == "/etc/passwd") OR ($_GET['page'] == "style/style.css") ) {
include("errors/error.php"); // Error
} else {

if ( !empty ( $_GET['page'] ) and isset($_GET['page']) ) {

if ( file_exists ( $_GET['page'] ) ) {
include ("".$_GET['page'].""); // Page self
} else {
include("errors/error.php"); // Error
}

} else {

include("home.php"); // Index
}
}
}
}
?>

Dit is de hele verwerking die ervoor zorgt om alles af te vangen, is dit veilig?
Probleem is opgelost,

Als iemand met $_PAGE werkt, dan voordat je dit gaat includen eerste de volgende regels eraan vooraf laten gaan:

<?PHP
$_GET['page'] = str_replace("http://www", "", $_GET['page']); // Geen url toevoegen met www
$_GET['page'] = str_replace("http", "", $_GET['page']); // Geen url toevoegen
$_GET['page'] = str_replace("..", "", $_GET['page']); // Geen map lager
?>

Zou je dit niet gebruiken, dan is het vaak mo gelijk om shells in de site te laden met alle gevolgen van dien.

Reageren