Injection d’objets arbitraires en PHP

Arbitrary object injection in PHP

Description du laboratoire

Ce laboratoire utilise un mécanisme de session basé sur la sérialisation PHP et est vulnérable à une injection d’objets arbitraires. L’objectif est de fabriquer et injecter un objet sérialisé malveillant afin de supprimer le fichier morale.txt situé dans le répertoire personnel de Carlos.

Identifiants fournis :

  • Utilisateur : wiener

  • Mot de passe : peter

Connexion et observation de la session

Après connexion avec les identifiants fournis, une cookie de session est définie. Son contenu est un objet PHP sérialisé de type User, par exemple :

Cela confirme que l’application désérialise directement des objets PHP contrôlables par l’utilisateur.

Accès au code source

Dans le code HTML de l’application, un commentaire attire l’attention :

L’accès direct au fichier /libs/CustomTemplate.php ne retourne rien.

Cependant, en utilisant une sauvegarde d’éditeur (suffixe ~) :

on obtient le code source PHP.

Analyse de la classe vulnérable

La classe CustomTemplate contient notamment :

  • Deux attributs privés :

    • $template_file_path

    • $lock_file_path

  • Une méthode magique __destruct() qui exécute :

Cela signifie que lors de la destruction de l’objet, n’importe quel fichier dont le chemin est stocké dans lock_file_path peut être supprimé

Exploitation via désérialisation

Comme l’application désérialise des objets PHP issus de la session, il est possible de :

  1. Créer manuellement un objet CustomTemplate

  2. Contrôler directement la valeur de lock_file_path

  3. Forcer la suppression du fichier ciblé lors de l’appel automatique à __destruct()

Objet sérialisé malveillant :

Encodage Base64

Pour l’injecter dans la cookie de session, l’objet est encodé en Base64 :

Mis à jour