Pourquoi désérialiser un objet en PHP est-il une mauvaise idée ?

WBOY
Libérer: 2024-07-20 05:06:29
original
746 Les gens l'ont consulté

Why is unserializing an object in PHP a bad idea?

La sérialisation en PHP est un moyen de convertir un objet PHP en chaîne. Cette chaîne peut être utilisée de différentes manières, par exemple en la stockant dans une base de données ou en la transmettant à une autre fonction. La documentation PHP indique que cela est pratique pour transmettre des valeurs PHP sans perdre leur type et leur structure. Mais je n'ai jamais eu ce problème auparavant. Peut-être que je ne le vois pas.

<?php
$test = new User();
$test->name = "Denzyl";
echo serialize($test);
/// Output: O:4:"User":1:{s:4:"name";s:6:"Denzyl";}
Copier après la connexion

Alors, digérons la chaîne. Le o signifie Objet et le nombre suivant est la longueur du nom de l'objet. Les deux lettres s représentent la chaîne et la longueur du nom de la chaîne.

Lorsque vous devez reconvertir la chaîne en PHP, appelez la fonction de désérialisation et transmettez la chaîne en paramètre.

Lors de la sérialisation d'un objet, deux méthodes sont automatiquement appelées. __serialize() et __sleep(). Cela permettra à l'auteur de la classe de faire quelque chose avant de convertir l'objet en chaîne.
Cela va droit au but. Mais pour l’instant, concentrons-nous sur la désérialisation de la chaîne. Cela signifie convertir la chaîne en un véritable objet PHP qui peut être utilisé ultérieurement lors de l'exécution dans votre code PHP.

<?php

$string = 'O:8:"User":1:{s:4:"name";s:6:"Denzyl";}';
echo unserialize($string)->name;
/// Output: Denzyl
Copier après la connexion

Les mêmes fonctionnalités s'appliquent également à la désérialisation. Mais cette fois, les deux méthodes sont __unserialize() et __wakeup().

Mais pourquoi est-ce une mauvaise idée ?

Utiliser unserialize sans le savoir peut conduire à l'exécution de code à distance. C'est pourquoi ils disent de ne jamais faire confiance aux commentaires.
Disons que vous êtes paresseux et que vous faites confiance à une entrée aléatoire, et que vous concatènez à l'objet sérialisé pour pouvoir
changer une valeur à l’intérieur de l’objet. BOOM, vous pouvez être piraté.

<?php
$username = $_GET['username'];
$serialized = 'O:8:"User":1:{s:4:"name";s:6:"' . $username . '";}';
Copier après la connexion

Je n'expliquerai pas comment écrire un exploit pour quelque chose comme ça. Certains outils peuvent générer automatiquement une charge utile pour vous, et vous pouvez vous appeler un enfant de script (nous commençons tous quelque part). Celui que je connais est PHPGGC.

Pour comprendre l'exploit, vous pouvez lire l'article OWASP.
Si vous ne le saviez pas auparavant, lisez également le reste des articles de l'OWASP sur les vulnérabilités

Je sais que je n'ai pas expliqué comment écrire un exploit. Je ne pense pas pouvoir faire un meilleur travail que les articles sur Internet. Mais maintenant vous le savez et vous pouvez faire vos recherches.

Comment éviter d’être exploité ?

Pourquoi voudriez-vous utiliser cela ? Je ne sais pas; Je ne programme pas depuis assez longtemps (~ 15 ans) pour avoir l'opportunité de résoudre un problème en utilisant la sérialisation/désérialisation.
Ma solution est trop radicale. La réponse simple est. Ne l'utilisez dans mes projets PHP.

Cet article fait partie d'une série d'articles sur mon parcours d'écriture d'un outil d'analyse statique pour PHP capable d'analyser des projets volumineux en quelques minutes/secondes. Et cherchez les règles
que les développeurs souhaitent avoir dans leurs projets. Au moment d'écrire cet article, je travaille sur une règle pour arrêter
les gens d'utiliser unserialize, et il devrait être prêt pour la prochaine version. Suivez le projet pour être averti quand
J'ai décidé d'écrire encore plus de règles.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!