Que fait désérialisation-non-sécurisée ?
Playbook de désérialisation non sécurisée. À utiliser lorsque des applications Java, PHP ou Python désérialisent des données non fiables via ObjectInputStream, unserialize, pickle ou des mécanismes similaires pouvant conduire à une exécution de code à distance (RCE), un accès aux fichiers ou une escalade de privilèges.
Objectifs
Ce playbook vous guide pour :
- Identifier les points d'entrée de désérialisation non sécurisée
- Générer des charges utiles (payloads) adaptées à chaque langage
- Tester l'exploitation des vulnérabilités
- Proposer des remédiations
Langages cibles
| Langage | Mécanisme de désérialisation | Outils associés |
|---|---|---|
| Java | ObjectInputStream, readObject() | ysoserial |
| PHP | unserialize() | PHPGGC |
| Python | pickle.loads(), yaml.load() | Scripts personnalisés |
Utilisation
- Identifier les points de désérialisation : Recherchez les appels aux fonctions critiques dans le code source (par exemple
ObjectInputStream.readObject()en Java,unserialize()en PHP,pickle.load()en Python). - Vérifier les données non fiables : Assurez-vous que les données passées à ces fonctions proviennent d'une source non fiable (entrée utilisateur, requêtes réseau, fichiers téléchargés).
- Générer une charge utile : Utilisez les outils listés ci-dessus pour créer une charge utile correspondant au type d'attaque visé (RCE, accès fichier, etc.).
- Tester l'exploitation : Envoyez la charge utile à l'application via le vecteur identifié.
- Analyser le résultat : Observez la réponse de l'application pour déterminer si la vulnérabilité est exploitable.
Exemples de commandes
Java avec ysoserial
java -jar ysoserial.jar CommonsCollections1 'id' | base64
PHP avec PHPGGC
php phpggc Laravel/RCE1 system 'id'
Python (pickle malveillant)
import pickle
import os
class Exploit(object):
def __reduce__(self):
return (os.system, ('id',))
payload = pickle.dumps(Exploit())
Remédiation
- Ne jamais désérialiser des données non fiables : Utilisez des formats alternatifs comme JSON ou des API sécurisées.
- Valider et assainir les entrées : Si la désérialisation est inévitable, appliquez une validation stricte.
- Utiliser des bibliothèques sécurisées : Par exemple, en Java, utilisez
ValidatingObjectInputStreamou des mécanismes de liste blanche de classes. - Limiter les privilèges : Exécutez l'application avec le moins de privilèges possible.
Avertissement
Ce playbook est destiné à des fins éducatives et de test de sécurité autorisé uniquement. L'exploitation non autorisée de vulnérabilités est illégale.