PHP 5.4.33 Released

Issue lors de l'utilisation des octets nuls

Comme PHP utilise des fonctions C pour les opérations sous-jacentes, notamment au niveau du système de fichiers, il peut gérer les octets nuls d'une façon inattendue. Sachant que les octets nuls dénotent la fin d'une chaîne de caractères en C, certaines fonctions vont donc considérer ces chaînes jusqu'à la première occurrence d'un octet nul. L'exemple suivant présente un code vulnérable qui montre ce problème :

Exemple #1 Script vulnérable aux octets nuls

<?php
$file 
$_GET['file']; // "../../etc/passwd\0"
if (file_exists('/home/wwwrun/'.$file.'.php')) {
   
// file_exists retournera true sachant que le fichier /home/wwwrun/../../etc/passwd existe
   
include '/home/wwwrun/'.$file.'.php';
   
// le fichier /etc/passwd sera inclu
}
?>

Ainsi, toute chaîne utilisée dans des opérations sur le système de fichiers doit toujours être validée proprement. Voici une meilleure solution de l'exemple précédent :

Exemple #2 Validation correcte de l'entrée

<?php
$file 
$_GET['file'];

// Whitelisting possible values
switch ($file) {
   case 
'main':
   case 
'foo':
   case 
'bar':
   include 
'/home/wwwrun/include/'.$file.'.php';
   break;
   default:
   include 
'/home/wwwrun/include/main.php';
}
?>
add a note add a note

User Contributed Notes 2 notes

up
0
Anonymous
4 months ago
Looks like this issue was fixed in PHP 5.3 https://bugs.php.net/bug.php?id=39863
up
-10
kpobococ at gmail dot com
5 years ago
Since problems with null bytes do not stretch to regular string functions, this should be enough to ensure no GET parameter contains them any more:

<?php
function getVar($name)
{
   
$value = isset($_GET[$name]) ? $_GET[$name] : null;
   
    if (
is_string($value)) {
       
$value = str_replace("\0", '', $value);
    }
}
?>

Modifying this to work with other superglobals should not be a problem, so I will leave it up to you.
To Top