Maison  >  Article  >  développement back-end  >  Analyse détaillée de la désérialisation PHP de l'échappement des caractères

Analyse détaillée de la désérialisation PHP de l'échappement des caractères

WBOY
WBOYavant
2022-04-14 12:06:495576parcourir

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.

Analyse détaillée de la désérialisation PHP de l'échappement des caractères

Etude recommandée : "Tutoriel vidéo PHP"

Essence : Fermé
Catégorie : Plus de caractères, moins de caractères
Points communs :

  1. 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
  2. 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:
  1. Juge qu'après filtrage, chaque caractère aura le nombre de caractères sortis)
  2. Exemple:
  3. Objectif: Modifier une valeur dans l'objet , par exemple, l'âge doit être modifié à 20
    <?php function filter($string){
        $filter = &#39;/p/i&#39;;
        return preg_replace($filter,&#39;WW&#39;,$string);
    }
    $username = &#39;purplet&#39;;
    $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));
    ?>
  • 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));     # 打印反序列化
  • 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 : Analyse détaillée de la désérialisation PHP de léchappement des caractères

    原字符串:";i:1;s:2:"10";}
    目标子串:";i:1;s:2:"20";}

    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 :

    Analyse détaillée de la désérialisation PHP de léchappement des caractères
    Réduction des caractères
    Analyse détaillée de la désérialisation PHP de léchappement 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 = &#39;/pp/i&#39;;
          return preg_replace($filter,&#39;W&#39;,$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));     # 打印反序列
      ?>
    • 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

      Analyse détaillée de la désérialisation PHP de léchappement des caractères第一步
      , 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 restantsAnalyse détaillée de la désérialisation PHP de léchappement des caractères


      charge utile :

      username='pppppppppppppppppppppppppp'
      age=A";i:1;s:2:"20";}
      Analyse détaillée de la désérialisation PHP de léchappement des caractèresRé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
      1. Regardez chaque incrément de remplacement x
        1. Utilisez n/x caractères de remplacement et construisez le code Pour construire, passez dans l'objet sérialisé
        2. Réduction de caractère
        Construire avec le deuxième paramètre
      2. Définir la fermeture au début : A" (nous verrons comment le construire plus tard)
        1. Regardez le guillemet fermant après le premier paramètre pour A. Combien de caractères n
        2. le remplacement réduit x caractères
        3. Créer un objet :
        4. Le premier paramètre est passé en n*(x+1) caractères de remplacement
        5. Le deuxième paramètre est passé dans la chaîne construite


        6. Étude recommandée : "
        Tutoriel vidéo PHP
      3. "

      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:
      Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer