Cet article vous apporte des connaissances pertinentes sur PHP, qui présente principalement les problèmes liés à l'échappement des caractères de désérialisation. La chaîne après la sérialisation PHP a été remplacée ou modifiée, entraînant une modification de la longueur de la chaîne. puis remplacé et modifié. Examinons-le ensemble, j'espère que cela sera utile à tout le monde.
Etude recommandée : "Tutoriel vidéo PHP"
Essence : Fermé
Catégorie : Plus de caractères, moins de caractères
Points communs :
- La chaîne après sérialisation PHP a été remplacée ou modifiée, ce qui entraîne la longueur de la chaîne les changements
- sont toujours sérialisés en premier, puis remplacés et modifiés
classification
augmentation des caractères
- Idée :
Selon le format de chaîne et les caractéristiques après sérialisation, le nombre de caractères est identifié La longueur à être reconnu plus tard
Si vous souhaitez modifier un attribut, vous devez le remplacer, ce qui peut être contrôlé par la chaîne entrante
Vous devez fermer les guillemets précédents, puis transmettre les caractères à construire plus tard
Mais à ce moment , elle est différente de la chaîne précédente La longueur ne correspond pas et la construction n'est pas valide
Solution : en fonction du changement de longueur du caractère de remplacement, extrayez la chaîne construite de la plage de longueur et devenez la partie suivante
(utilisez la longueur transformation lors du remplacement pour combler les trous dans la chaîne injectée)
- astuces:
- Juge qu'après filtrage, chaque caractère aura le nombre de caractères sortis)
-
- Exemple:
Objectif: Modifier une valeur dans l'objet , par exemple, l'âge doit être modifié à 20
<?php function filter($string){
$filter = '/p/i';
return preg_replace($filter,'WW',$string);
}
$username = 'purplet';
$age = "10";
$user = array($username,$age);
var_dump(serialize($user));
echo "<pre class="brush:php;toolbar:false">";
$r = filter(serialize($user));
var_dump($r);
var_dump(unserialize($r));
?>
Copier après la connexion
La partie suivante peut être enregistrée comme modèle. Lorsque vous répondez à la question, affichez-la d'abord et jetez-y un œil
var_dump(serialize($user)); # 序列化
echo "<pre class="brush:php;toolbar:false">";
$r = filter(serialize($user)); # 替换后序列化
var_dump($r);
var_dump(unserialize($r)); # 打印反序列化
Copier après la connexion
Vous pouvez l'observer, chaque substitution change de p en. ww, c'est-à-dire qu'un caractère supplémentaire est ajouté à chaque fois Cela entraîne des erreurs de lecture d'allocation de longueur et des erreurs de sortie lors de la désérialisation
Pensez donc à construire des échappements de caractères à travers la nature de sa lecture de longueur
Pour changer 10 en 20, déterminez d'abord le chaîne à construire plus tard :
原字符串:";i:1;s:2:"10";}
目标子串:";i:1;s:2:"20";}
Copier après la connexion
Déterminez la longueur : 16 (c'est-à-dire que la chaîne entrante a besoin de 16 caractères supplémentaires pour mettre ces caractères dans l'attribut suivant) Chaque fois qu'il y a 1 caractère supplémentaire, il faut donc 16 p
Par conséquent , entrée :
Sortie du résultat :
Réduction des caractères
Échappement de la valeur
Filtrage des valeurs, la valeur précédente inclut la dernière clé et la dernière valeur (jusqu'au crochet gauche) )
Exemple
Cible : changer l'âge à 20
<?php function filter($string){
$filter = '/pp/i';
return preg_replace($filter,'W',$string);
}
$username = "ppurlet"
$age = "10";
$user = array($username,$age);
var_dump (serialize($user)); # 序列化
echo "<pre class="brush:php;toolbar:false">";
$r = filter(serialize($user)); # 替换后序列化
var_dump ($r);
var_dump (unserialize($r)); # 打印反序列
?>
Copier après la connexion
Similaire au code ci-dessus, sauf que 2 ps sont remplacés par un w, et les caractères sont réduits
La même valeur ne correspondra pas et la désérialisation échouera
username : Code requis pour construire l'évasion
age : Construction du code d'échappement
A est suivi de la chaîne d'âge entrante Calculez la longueur de construction
, qui doit occuper ces 13 caractères
Tous les 2 p changent en 1 w équivaut à échapper un bit, donc entrez 13*2=26 p, la longueur du caractère est marquée comme 26, ce qui devient 13 w, et les 13 caractères suivants occupent les 13 bits restants
charge utile :
username='pppppppppppppppppppppppppp'
age=A";i:1;s:2:"20";}
Copier après la connexion
Résumé
Les caractères augmentent
Regardez la longueur du guillemet après la fin du premier paramètre jusqu'au dernier crochet droit (chaîne cible) n
- Regardez chaque incrément de remplacement x
- Utilisez n/x caractères de remplacement et construisez le code Pour construire, passez dans l'objet sérialisé
-
- Réduction de caractère
Construire avec le deuxième paramètre
- Définir la fermeture au début : A" (nous verrons comment le construire plus tard)
- Regardez le guillemet fermant après le premier paramètre pour A. Combien de caractères n
- le remplacement réduit x caractères
- Créer un objet :
Le premier paramètre est passé en n*(x+1) caractères de remplacement- Le deuxième paramètre est passé dans la chaîne construite
-
Étude recommandée : "
Tutoriel vidéo 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!