当前位置:网站首页>Que savez - vous de la sérialisation et de l'anti - séquence?
Que savez - vous de la sérialisation et de l'anti - séquence?
2022-07-07 03:35:00 【Grand refuge】
1.Sérialisation et désrialisation
Tout d'abord, comprendre les définitions de la sérialisation et de la désérialisation,Et les fonctions de base utilisées pour sérialiser la désrialisation.
Sérialisation:Le processus de conversion d'un objet en une séquence d'octets est appelé sérialisation d'un objet,L'équivalent d'une archive dans un jeu.
PHPFonctions de sérialisation dansserialize()
**serialize()**Fonction pour la sérialisationObjetOuTableau,Et renvoie une chaîne.serialize()Après la sérialisation de l'objet par la fonction,Il peut être facilement transmis à d'autres endroits qui en ont besoin,EtLe type et la structure ne changent pas.
| Syntaxe | string serialize ( mixed $value ) |
|---|---|
| Description des paramètres | $value: Objet ou tableau à sérialiser. |
| Valeur de retour | Renvoie une chaîne. |
Exemple:
<?php
highlight_file(__FILE__);
$sites=array('I', 'Like', 'PHP');
echo'<br/>';
var_dump(serialize($sites)); //Sérialiser cet objet
echo'<br/>';
classman{
public$name="xiaocui";
public$sex="man";
private$age=26;
}
$M=newman();//Créer un objet
var_dump(serialize($M)); //Sérialiser cet objet
?>
Le résultat est:
string(47) "a:3:{i:0;s:1:"I";i:1;s:4:"Like";i:2;s:3:"PHP";}"
string(79) "O:3:"man":3:{s:4:"name";s:7:"xiaocui";s:3:"sex";s:3:"man";s:8:"manage";i:26;}"
Description des paramètres:
Sérialisation du tableau :
a Représente un tableau
3 Représente qu'il y a3Éléments
i Indice représentant le tableau
0 ReprésentantI Valeur de l'indice de l'élément
s Éléments représentatifsI Le type de données pour est de type caractère
1 Éléments représentatifsILa longueur de1
Sérialisation des objets:
O Le représentant est un objet
3 Nom de la classe représentativemanLongueur
3 Représente le nombre de champs dans la classe
s Propriétés représentativesname Est de type caractère
4 Propriétés représentativesnameLongueur
//Et ainsi de suite., Sérialiser le contenu du champ dans la chaîne pour {C'est parti.,;}Fin
Désérialisation:Le processus de restauration d'une séquence d'octets en tant qu'objet est appelé désrialisation de l'objet, L'équivalent d'une lecture dans le jeu .
【Aider à l'apprentissage de la sécurité,Tous les bureaux d'accès aux ressources】
①Itinéraire d'apprentissage de la sécurité des réseaux
②20Copie du livre électronique d'essai de pénétration
③Attaque et défense de sécurité357Notes de page
④50Guide d'entrevue sur l'attaque et la défense en matière de sécurité
⑤Trousse d'infiltration de l'équipe rouge de sécurité
⑥Collecte d'informations80Syntaxe de recherche
⑦100Cas réels de vulnérabilité
⑧Ressources vidéo internes de la grande usine de sécurité
⑨Années civilesCTFAnalyse de la question du concours du drapeau
PHP Fonction de désrialisation dans unserialize()
**unserialize()** Fonction utilisée pour restaurer une chaîne sérialisée à Tableau ou objet original Processus.**unserialize()** La fonction peut rapidement restaurer la chaîne sérialisée , Pour remplir sa fonction originelle .
| Syntaxe | mixed unserialize ( string $str ) |
|---|---|
| Description des paramètres | $str: Chaîne sérialisée. |
| Valeur de retour | Renvoie la valeur convertie,Peut être integer、float、string、array Ou object. Renvoie lorsque non désérialisable FALSE, Et lancer un rappel . |
Exemple de code:
<?php
highlight_file(__FILE__);
$sites=array('I', 'Like', 'PHP');
echo'<br/>';
echo$ser=serialize($sites).'<br/>'; //Sérialiser cet objet
var_dump(unserialize($ser)); // Désrialiser les chaînes sérialisées
echo'<br/>';
classman{
public$name="xiaocui";
public$sex="man";
private$age=26;
}
$M=newman();//Créer un objet
echo$ser=serialize($M).'<br/>'; //Sérialiser cet objet
var_dump(unserialize($ser)); // Désrialiser les chaînes sérialisées
?>
Le résultat est:
a:3:{i:0;s:1:"I";i:1;s:4:"Like";i:2;s:3:"PHP";}
array(3) { [0]=>string(1) "I"[1]=>string(4) "Like"[2]=>string(3) "PHP"}
O:3:"man":3:{s:4:"name";s:7:"xiaocui";s:3:"sex";s:3:"man";s:8:"manage";i:26;}
object(man)#2 (3) { ["name"]=> string(7) "xiaocui" ["sex"]=> string(3) "man" ["age":"man":private]=> int(26) }
Vous pouvez voir le tableau ou l'objet désrialisé ci - dessus , Aucun changement par rapport aux données originales .
Le rôle de la sérialisation et de la désérialisation dans le système
① Mettre en permanence la séquence d'octets de l'objet sur le disque , Peut être appelé à tout moment si nécessaire , Économisez beaucoup d'espace disque .
② Les séquences d'octets peuvent être transférées directement pendant la transmission ,Pas l'objet., Cela peut augmenter considérablement le taux de transmission .
Dans le système d'affaires, Certains objets nécessitent un stockage sérialisé , Laissez - les sortir de la mémoire ,Stocké dans un fichier, Pour la persistance de l'enregistrement .Par exemple: Lorsque l'utilisateur s'inscrit et se connecte au système , Les informations de l'utilisateur telles que le nom de l'utilisateur ,Mot de passe,cookie Attendez que l'information soit d'abord stockée par sérialisation , Lorsque l'utilisateur se connecte à nouveau, la séquence d'octets sérialisés est utilisée en désérialisant l'objet original en mémoire , Économisez considérablement les frais généraux de mémoire .
2.Méthode magique
PHPFaites tout comme__(Deux soulignements) Les méthodes de classe au début restent magiques . Donc, en définissant la méthode de classe , En plus des méthodes magiques décrites ci - dessus , Il n'est pas recommandé de __Préfixe.
PHP Méthodes magiques courantes
__construct()
Avec __construct La classe de la fonction appelle cette méthode chaque fois qu'un nouvel objet est créé ,Convient pour effectuer un certain travail d'initialisation avant d'utiliser l'objet.
Exemple de code:
<?php
highlight_file(__FILE__);
classdemo{
public$name="xiaocui";
public$sex="man";
private$age=26;
publicfunction__construct()
{
echo"<br/>"." Appelez - moi quand la classe est instantanée !";
}
}
$D=newdemo(); //Objet instantané
?>
Résultats obtenus:
Appelez - moi quand la classe est instantanée !
__destruct()
Cette fonction s'exécute lorsque toutes les références à un objet sont supprimées ou lorsque l'objet est détruit
Exemple de code:
<?php
highlight_file(__FILE__);
class demo{
public $name="xiaocui";
public $sex="man";
private $age=26;
public function __construct()
{
echo "<br/>"." Appelez - moi quand la classe est instantanée !"."<br/>";
}
public function num($a,$b){
echo $c = $a + $b.'<br/>';
return $c;
}
public function __destruct(){
echo " Appelez - moi quand toutes les méthodes de la classe sont détruites !";
}
public function person($per){
echo "We are $per !!!".'<br/>';
}
}
$D=new demo(); //Objet instantané
$D->num(5,6); //Appeleznum()Méthodes
$D->person(man); //Appelezperson()Méthodes
?>
Résultats obtenus:
Appelez - moi quand la classe est instantanée !
11
Weareman!!!
Appelez - moi quand toutes les méthodes de la classe sont détruites !
La sortie ci - dessus donne une vue très intuitive de la séquence d'exécution du Code :__construct()=>num(5,6)=>person(nanren)=>__destruct()
Lors de l'Instanciation d'un objet, effectuez d'abord la méthode de construction __construct(), Ensuite, exécutez l'Instance dans la classe num()、person(), Quand toutes les méthodes ont été détruites , Enfin, appelez la méthode de profilage __destruct().
__wakeup()
En serviceunserialize()Heure,Vérifiez s'il y a un__wakeup()Méthode magique.Si elle existe, La méthode est appelée en premier ,Ressources nécessaires pour préparer les objets.
Exemple de code:
<?php
highlight_file(__FILE__);
classdemo{
public$name="xiaocui";
protected$sex="man";
private$age=26;
publicfunction__construct()
{
echo"<br/>"." Appelez - moi quand la classe est instantanée !"."<br/>";
}
publicfunction__destruct(){
echo"<br/>"." Appelez - moi quand toutes les méthodes de la classe sont détruites !"."<br/>";
}
publicfunction__wakeup()
{
echo"<br/>"." Appelez - moi d'abord quand la séquence est inversée !".'<br/>';
}
}
$D=newdemo(); //Objet instantané
echo$ser=serialize($D); //Objet sérialisé$D
var_dump(unserialize($ser)); //Désérialisation des chaînes$ser
?>
Résultats obtenus:
Parce que$agePropriété privée, Les caractères blancs sont ajoutés avant et après la sérialisation %00, La longueur originale des caractères est 7, L'ajout d'un caractère blanc de chaque côté change la longueur du caractère en 9
Appelez - moi quand la classe est instantanée !
O:4:"demo":3:{s:4:"name";s:7:"xiaocui";s:6:"*sex";s:3:"man";s:9:"demoage";i:26;}
Appelez - moi quand la séquence est inversée !
object(demo)#2
(3) { ["name"]=> string(7) "xiaocui" ["sex":protected]=>
string(3) "man" ["age":"demo":private]=> int(26) }
Appelez - moi quand toutes les méthodes de la classe sont détruites !
Appelez - moi quand toutes les méthodes de la classe sont détruites !
La sortie ci - dessus donne une vue très intuitive de la séquence d'exécution du Code :__construct()=>serialize($D)=>__wakeup()=>unserialize($ser)=>__destruct()=>__destruct()
Lors de l'Instanciation d'un objet, effectuez d'abord la méthode de construction __construct(), Puis la sérialisation serialize($D), Avant de désérialiser __wakeup()Méthodes,Puis désérialiserunserialize($ser), Dernière exécution lorsque toutes les méthodes ont terminé la destruction __destruct()Méthode analytique, Parce que la restauration de la chaîne sérialisée originale après désrialisation a été effectuée à nouveau __destruct().
__toString()
__toString() La méthode est utilisée pour définir ce qu'il faut faire lorsqu'une classe est traitée comme une chaîne .
Exemple de code:
<?php
highlight_file(__FILE__);
class demo{
public $name="xiaocui";
protected $sex="man";
private $age=26;
public function __construct()
{
echo "<br/>"." Appelez - moi quand la classe est instantanée !"."<br/>";
}
public function __destruct(){
echo "<br/>"." Appelez - moi quand toutes les méthodes de la classe sont détruites !"."<br/>";
}
public function __wakeup()
{
echo "<br/>"." Appelez - moi quand la séquence est inversée !".'<br/>';
}
public function __toString(){
return "<br/>"." Appelez - moi quand la classe est traitée comme une chaîne !"."<br/>";
}
}
$D=new demo(); //Objet instantané
echo $D; // La classe est sortie comme une chaîne
?>
Résultats obtenus:
Appelez - moi quand la classe est instantanée !
Appelez - moi quand la classe est traitée comme une chaîne !
Appelez - moi quand toutes les méthodes de la classe sont détruites !
Les résultats de sortie ci - dessus peuvent être vus , Quand la classe est traitée comme une chaîne echoHeure,__toString() La méthode est appelée et exécutée .
S'il n'y a pas de __toString()Méthodes,En coursechoAu moment de la sortie,PHP Une erreur fatale sera lancée ,Les erreurs sont les suivantes::
Catchablefatalerror: ObjectofclassdemocouldnotbeconvertedtostringinD:\XXXX\phpstudy_pro\WWW\two\demo.phponline30
__sleep()
En serviceserialize()Fonction, Le programme vérifie s'il y a un __sleep()Méthode magique.Si elle existe, La méthode est appelée en premier , Puis l'opération de sérialisation .
__sleep()La méthode est souvent utilisée pour soumettre des données non soumises,Ou opérations de nettoyage similaires.En même temps,S'il y a de gros objets,Mais il n'est pas nécessaire d'enregistrer tout, Cette fonction a un bon effet de nettoyage .
Exemple de code:
<?php
highlight_file(__FILE__);
class demo{
public $name="xiaocui";
protected $sex="man";
private $age=26;
public function __construct()
{
echo "<br/>"." Appelez - moi quand la classe est instantanée !"."<br/>";
}
public function __destruct(){
echo "<br/>"." Appelez - moi quand toutes les méthodes de la classe sont détruites !"."<br/>";
}
public function __wakeup()
{
echo "<br/>"." Appelez - moi quand la séquence est inversée !".'<br/>';
}
public function __sleep(){
echo "<br/>"." Appelez - moi quand la séquence est !".'<br/>';
return array("name","sex","age"); //Une valeur numérique doit être retournée ici,L'élément à l'intérieur représente le nom de l'attribut retourné
}
}
$D=new demo(); //Objet instantané
echo $ser = serialize($D); //Objet sérialisé
?>
Résultats obtenus:
Appelez - moi quand la classe est instantanée !
Appelez - moi quand la séquence est !
O:4:"demo":3:{s:4:"name";s:7:"xiaocui";s:6:"*sex";s:3:"man";s:9:"demoage";i:26;}
Appelez - moi quand toutes les méthodes de la classe sont détruites !
Les résultats de sortie ci - dessus peuvent être vus , Appelé en premier lorsque la classe est sérialisée __sleep()Méthodes, La fonction doit renvoyer une valeur numérique . Si la fonction n'a pas de propriété de retour , Les propriétés sont effacées lors de la sérialisation .
__invoke()
Lorsque vous essayez d'appeler un objet comme une fonction,__invokeLa méthode est appelée automatiquement.(Cette fonctionnalité n'est disponible que sur PHP 5.3.0 Et plus.)
Exemple de code:
<?php
highlight_file(__FILE__);
class demo{
public $name="xiaocui";
protected $sex="man";
private $age=26;
public function __construct()
{
echo "<br/>"." Appelez - moi quand la classe est instantanée !"."<br/>";
}
public function __destruct(){
echo "<br/>"." Appelez - moi quand toutes les méthodes de la classe sont détruites !"."<br/>";
}
public function __wakeup()
{
echo "<br/>"." Appelez - moi quand vous désérialisez !".'<br/>';
}
public function __sleep(){
echo "<br/>"." Appelez - moi quand vous sérialisez !".'<br/>';
return array("name","sex","age");
}
public function __invoke()
{
echo "<br/>"." Je suis appelé quand l'objet est appelé comme une fonction !".'<br/>';
}
}
$D=new demo(); //Objet instantané
$D(); // Appeler l'objet en fonction
?>
Résultats obtenus:
Appelez - moi quand la classe est instantanée !
Je suis appelé quand l'objet est appelé comme une fonction !
Appelez - moi quand toutes les méthodes de la classe sont détruites !
Les résultats ci - dessus montrent que lorsque l'objet est appelé en utilisant la méthode de la fonction ,Appelle__invoke()Méthodes.
Si la méthode n'existe pas dans la classe ,AlorsPHP Une erreur fatale sera signalée ,Comme suit:
Fatalerror:
UncaughtError:
FunctionnamemustbeastringinD:\xxxxx\phpstudy_pro\WWW\two\demo.php:42Stacktrace:
#0 {main} thrown in D:\xxxxx\phpstudy_pro\WWW\two\demo.php on line 42
__call()
Lorsqu'une méthode inexistante ou inaccessible est appelée dans l'objet ,__callSera appelé.
Exemple de code:
<?php
highlight_file(__FILE__);
class demo{
public $name="xiaocui";
protected $sex="man";
private $age=26;
public function __construct()
{
echo "<br/>"." Appelez - moi quand la classe est instantanée !"."<br/>";
}
public function num($a,$b){
echo "<br/>".$c = $a + $b.'<br/>';
return $c;
}
public function __destruct(){
echo "<br/>"." Appelez - moi quand toutes les méthodes de la classe sont détruites !"."<br/>";
}
public function person($per){
echo "<br/>"."We are $per !!!".'<br/>';
}
public function __wakeup()
{
echo "<br/>"." Appelez - moi quand vous désérialisez !".'<br/>';
}
public function __sleep(){
echo "<br/>"." Appelez - moi quand la séquence est !".'<br/>';
return array("name","sex","age");
}
public function __call($arg1,$arg2){
echo "<br/>"." Appelez - moi quand l'objet appelle une méthode inexistante ou inaccessible !".'<br/>';
}
}
$D=new demo(); //Objet instantané
$D->num1(1,2); // Appelez une méthode qui n'existe pas
?>
Résultats obtenus:
Appelez - moi quand la classe est instantanée !
Appelez - moi quand l'objet appelle une méthode inexistante ou inaccessible !
Appelez - moi quand toutes les méthodes de la classe sont détruites !
__set()
Lors de l'attribution d'une valeur à une propriété inaccessible ,__setSera appelé.
Exemple de code:
<?php
highlight_file(__FILE__);
class demo extends demo1{
public $name="xiaocui";
protected $sex="man";
private $age=26;
public function __construct()
{
echo "<br/>"." Appelez - moi quand la classe est instantanée !"."<br/>";
}
public function __destruct(){
echo "<br/>"." Appelez - moi quand toutes les méthodes de la classe sont détruites !"."<br/>";
}
public function person($per){
echo "<br/>"."We are $per !!!".'<br/>';
}
public function __set($arg1,$arg2){
echo "<br/>"." Appelez - moi quand vous attribuez une valeur à une propriété qui n'existe pas ou qui n'est pas accessible !"."<br/>";
}
}
class demo1{
private $weight;
public $height;
public function people(){
echo $this->weight;
echo $this->height;
}
}
$D=new demo(); //Objet instantané
$D->weight=74; // Assigner une valeur à une propriété inaccessible
?>
Résultats obtenus:
Appelez - moi quand la classe est instantanée !
Appelez - moi quand vous attribuez une valeur à une propriété qui n'existe pas ou qui n'est pas accessible !
Appelez - moi quand toutes les méthodes de la classe sont détruites !
__isset()
Appelé sur une propriété inaccessible isset()Ouempty()Heure,__iset()Sera appelé.
__unset()
Appelé sur une propriété inaccessible unset()Heure,__unset()Sera appelé.
__get()
Lors de la lecture de la valeur d'une propriété inaccessible ,__getSera appelé.
Exemple de code:
<?php
highlight_file(__FILE__);
class demo extends demo1{
public $name="xiaocui";
protected $sex="man";
private $age=26;
public function __construct()
{
echo "<br/>"." Appelez - moi quand la classe est instantanée !"."<br/>";
}
public function __destruct(){
echo "<br/>"." Appelez - moi quand toutes les méthodes de la classe sont détruites !"."<br/>";
}
public function __get($arg1){
echo "<br/>"." Appelez - moi en lisant une propriété inexistante ou inaccessible !";
}
}
class demo1{
private $weight = 0;
public $height;
public function people(){
echo $this->weight;
echo $this->height;
}
}
$D=new demo(); //Objet instantané
$D->weight; // Lire les propriétés inaccessibles dans la classe parent
?>
Résultats obtenus:
Appelez - moi quand la classe est instantanée !
Appelez - moi en lisant une propriété inexistante ou inaccessible !
Appelez - moi quand toutes les méthodes de la classe sont détruites !
3.Vulnérabilité de désrialisation
3.1 Condition d'exploitation de la vulnérabilité de désrialisation
① unserialize() Les paramètres de la fonction sont contrôlables
② Il y a des classes disponibles , Et il y a des méthodes magiques dans la classe
Exemple de code1:
<?php
highlight_file(__FILE__);
class demo
{
public $arg1 = "0";
public function __destruct()
{
echo $this->arg1; // Output user pass arg1Valeur
}
}
$a=$_GET['arg']; // Réception de la transmission frontale arg1Variables
$unser = unserialize($a); // Désérialisation passée arg1
?>
Le code ci - dessus répond à deux conditions pour une vulnérabilité de désrialisation ,argParamètres contrôlables,C'est - à - direunserialize()Les paramètres de la fonction sont contrôlables; Il y a des classes disponibles demo,Etdemo Il y a des méthodes magiques disponibles dans la classe __destruct(),Et pourtant__destruct() Utilisé dans les méthodes magiques echo Variable de sortie arg.
AdoptionargParamètres, Construire une chaîne sérialisée ,Adoptionunserialize()Fonction de désrialisation,Enfin__destruct() Variables de sortie de la méthode magique ,CauseXSS.


Exemple de code2
<?php
highlight_file(__FILE__);
class demo
{
public $arg1 = "0";
public function __destruct()
{
eval($this->arg1); //eval() Pour exécuter la livraison de l'utilisateur arg1Valeur
}
}
$a=$_GET['arg']; // Réception de la transmission frontale arg1Variables
$unser = unserialize($a); // Désérialisation passée arg1
var_dump($unser);
?>
Si la méthode magique existe eval(), Et les paramètres sont contrôlables , En construisant la chaîne de sérialisation , Causé par une vulnérabilité de désrialisation RCE.

3.2 __wakeup()La fonction contourne
Lorsque les propriétés de l'objet passé lors de la sérialisation sont plus grandes que celles de l'objet réel ,__wakeup() La méthode magique ne sera pas exécutée ,Cela conduit à un contournement.
PHPVersion<=5.6.25OuPHPVersion<=7.0.11
Exemple de code:
<?php
highlight_file(__FILE__);
class demo
{
public $arg1 = "0";
public function __destruct()
{
eval($this->arg1); //eval() Pour exécuter la livraison de l'utilisateur arg1Valeur
}
public function __wakeup(){
foreach(get_object_vars($this) as $k => $v) {
$this->$k = ''; // Traverser les paramètres entrants , Toutes les assignations sont vides
}
}
}
$a=$_GET['arg']; // Réception de la transmission frontale arg1Variables
$unser = unserialize($a); // Désérialisation passée arg1
var_dump($unser);
?>
Si la valeur de la propriété est la même que la valeur réelle de la propriété de l'objet , Est exécuté lors de la désrialisation __wakeup() La fonction remplace la valeur de la variable passée par NULL .
Si le paramètre de valeur de propriété est supérieur à la valeur de propriété réelle de l'objet, il contourne __wakeup()Fonctions.
边栏推荐
- VHDL实现单周期CPU设计
- 数学归纳与递归
- 海思3559万能平台搭建:RTSP实时播放的支持
- Optimization of application startup speed
- 1200.Minimum Absolute Difference
- How to customize the shortcut key for latex to stop running
- Not All Points Are Equal Learning Highly Efficient Point-based Detectors for 3D LiDAR Point
- .net中 接口可以有默认实现了
- [leetcode] 450 and 98 (deletion and verification of binary search tree)
- 小程序能运行在自有App中,且实现直播和连麦?
猜你喜欢

The latest 2022 review of "small sample deep learning image recognition"

如何替换模型的骨干网络(backbone)

23. (ArcGIS API for JS) ArcGIS API for JS ellipse collection (sketchviewmodel)

从0开始创建小程序

R数据分析:cox模型如何做预测,高分文章复现

VHDL实现任意大小矩阵乘法运算

Make (convert) ICO Icon

装饰设计企业网站管理系统源码(含手机版源码)

海思万能平台搭建:颜色空间转换YUV2RGB

Open3d mesh filtering
随机推荐
C# Task拓展方法
19.(arcgis api for js篇)arcgis api for js线采集(SketchViewModel)
Install torch 0.4.1
About Tolerance Intervals
变量、流程控制与游标(MySQL)
树莓派设置wifi自动连接
Function reentry, function overloading and function rewriting are understood by yourself
Experience design details
Calculation of time and space complexity (notes of runners)
Room rate system - login optimization
HMS core machine learning service creates a new "sound" state of simultaneous interpreting translation, and AI makes international exchanges smoother
pip只下载不安装
leetcode
25. (ArcGIS API for JS) ArcGIS API for JS line modification line editing (sketchviewmodel)
Jerry's FM mode mono or stereo selection setting [chapter]
MySQL的存储引擎
Basic concepts of Huffman tree
Search of linear table
Open3d mesh filtering
Open3D 网格滤波