HervéRenault.fr

Logo de PHP

Injection d'objet PHP, le danger en résumé

Extrait simplifié de la page OWASP "PHP Object Injection". C'est une vulnérabilité moins fréquente parce qu'il faut plusieurs conditions pour qu'elle se présente.

L'erreur est d'utiliser la fonction unserialize() sans valider le paramètre, par exemple $truc = unserialize($_GET['param']);
et d'avoir une classe dans laquelle on utilise des méthodes magiques telles que __toString() ou __wakeup() ou autres.

L'agresseur ("pirate" ou "mauvais hackeur") va utiliser cette faille pour passer en paramètre une valeur sérialisée bien ciblée qui sera utilisée lors de l'appel à ces fonctions.

Par exemple, si on a une classe MaClasse comme celle-ci :

<?php

class MaClasse
{
    public $fichier;

    // ...

    public function __destruct()
    {
        unlink($this->fichier); // typiquement pour effacer un fichier temporaire créé dans cette classe
    }
} 

Et si, ailleurs dans le code du site, on a $truc = unserialize($_GET['param']);

Alors, l'agresseur va passer en paramètre quelque chose comme
https://site-avec-une-faille-injection-d-objet.fr/index.php?param=O:8:"MaClasse":1:{s:7:"fichier";s:9:"index.php";}
ce qui va créer un objet instance de MaClasse dans la variable $truc, avec $truc->fichier qui contiendra la valeur "index.php".

Et à la fin, quand cet objet $truc va être détruit, la méthode __destruct() va être appelée, donc on va effacer index.php !