php反序列化漏洞復現過程(phpsession反序列化漏洞)

本文目錄一覽:

這個網站幹什麼的 什麼是PHP反序列化靶機實戰

在我們講PHP反序列化的時候,基本都是圍繞着serialize(),unserialize()這兩個函數。那麼什麼是序列化呢,序列化說通俗點就是把一個對象變成可以傳輸的字符串。舉個例子,不知道大家知不知道json格式,這就是一種序列化,有可能就是通過array序列化而來的。而反序列化就是把那串可以傳輸的字符串再變回對象。而反序列化則比較容易出現漏洞。

這麼序列化一下然後反序列化,為什麼就能產生漏洞了呢?

這個時候,我們就要了解一下PHP裏面的魔術方法了,魔法函數一般是以__開頭,通常會因為某些條件而觸發不用我們手動調用:

在研究反序列化漏洞的時候,如果服務器能夠接收我們反序列化過的字符串、並且未經過濾的把其中的變量直接放進這些魔術方法裏面的話,就容易造成很嚴重的漏洞了。

所以這個網站其實希望告訴大家這個反序列化的問題,並提供一些實戰練習。

簡單分析PHP中序列化用法介紹

簡單分析PHP中序列化用法介紹

序列化在我們學習php中都會有用到了對於序列化我們常用的函數有serialize和unserialize了,希望以下這篇文章能夠幫助到各位了解到PHP中序列化用法,具體如下:

0x00 序列化函數

serialize():返回帶有變量類型和值的字符串

unserialize():想要將已序列化的字符串變回 PHP 的值

測試代碼:

?php

class test{

var $a;

var $b;

function __construct($a,$b,$c){

$a = $a;

$this-b = $b;

}

}

class test1 extends test{

function __construct($a){

$this-a = $a;

}

}

$a = ‘hello’;

$b = 123;

$c = false;

$d = new test(‘helloa’,’hellob’,’helloc’);

$e = new test1(‘hello’);

var_dump(serialize($a));

var_dump(serialize($b));

var_dump(serialize($c));

var_dump(serialize($d));

var_dump(serialize($e));

?

運行結果:

string ‘s:5:”hello”;’ (length=12)

string ‘i:123;’ (length=6)

string ‘b:0;’ (length=4)

string ‘O:4:”test”:2:{s:1:”a”;N;s:1:”b”;s:6:”hellob”;}’ (length=46)

string ‘O:5:”test1″:2:{s:1:”a”;s:5:”hello”;s:1:”b”;N;}’ (length=46)

序列化字符串格式: 變量類型:變量長度:變量內容 。

如果序列化的是一個對象,序列化字符串格式為:

變量類型:類名長度:類名:屬性數量:{屬性類型:屬性名長度:屬性名;屬性值類型:屬性值長度:屬性值內容}

將上述結果反序列化輸出,執行結果:

string ‘hello’ (length=5)

int 123

boolean false

object(test)[1]

public ‘a’ = null

public ‘b’ = string ‘hellob’ (length=6)

object(test1)[1]

public ‘a’ = string ‘hello’ (length=5)

public ‘b’ = null

0x01 對象序列化

當序列化對象時,PHP 將在序列動作之前調用該對象的成員函數 sleep()。這樣就允許對象在被序列化之前做任何清除操作。類似的,當使用 unserialize() 恢復對象時, 將調用 wakeup()成員函數。

在serialize()函數執行時,會先檢查類中是否定義了 sleep()函數,如果存在,則首先調用 sleep()函數,如果不存在,就保留序列字符串中的所有屬性。

在unserialize()函數執行時,會先檢查是否定義了 wakeup()函數。如果 wakeup()存在,將執行__wakeup()函數,會使變量被重新賦值。

serialize()測試代碼:

?php

class test{

var $a;

var $b;

function __construct($a,$b,$c){

$this-a = $a;

$this-b = $b;

}

function __sleep(){

echo “b has changed”.”\n”;

$this-b = ‘hib’;

return $this-b;

}

function __wakeup(){

echo “a has changed”.”\n”;

$this-a = ‘hia’;

}

}

class test1 extends test{

function __construct($a){

$this-a = $a;

}

}

$d = new test(‘helloa’,’hellob’,’helloc’);

$e = new test1(‘hello’);

serialize($d);

serialize($e);

var_dump($d);

var_dump($e);

?

執行結果:

b has changed b has changed

object(test)[1]

public ‘a’ = string ‘helloa’ (length=6)

public ‘b’ = string ‘hib’ (length=3)

object(test1)[2]

public ‘a’ = string ‘hello’ (length=5)

public ‘b’ = string ‘hib’ (length=3)

unserialize()測試代碼:

class test{

var $a;

var $b;

function __construct($a,$b,$c){

$this-a = $a;

$this-b = $b;

}

function __sleep(){

echo “b has changed”.”\n”;

$this-b = ‘hib’;

return $this-b;

}

function __wakeup(){

echo “a has changed”.”\n”;

$this-a = ‘hia’;

}

}

class test1 extends test{

function __construct($a){

$this-a = $a;

}

}

$d = ‘O:4:”test”:2:{s:1:”a”;N;s:1:”b”;s:6:”hellob”;}’ ;

請寫出php變量序列化和反序列化的函數,並舉出1個應用例子

PHP中的序列化和反序列化分別通過函數serialize()和unserialize()即可實現。serialize()的參數可以是resource類型外的所有變量類型,最常見的是用來序列化對象,unseialize()將serialize的返回結果作為參數,進行反序列化,得到原對象。$str = serialize ($obj);…$obj222 = unserialize($str);現在可以用$object222對象來執行該對象可以執行的各種操作。在用serialize序列化對象時,會自動調用__sleep方法,__sleep方法必須返回一個數組,包含需要串行化的屬性。 PHP會拋棄其它屬性的值, 如果沒有__sleep方法,PHP將保存所有屬性,包括private屬性。用unserialize反序列化對象時,PHP 會調用__wakeup方法。__sleep和__wakeup方法可以根據實際需要,都添加上,也可以只要其中的一個,當然也可以都不要。下面給出一個序列化的代碼:共serialize.php和unserialize.php兩個文件。// serialize.php?php

class User

{

private $name;

private $id;

public $sex=”F”;

function __construct()

{

//give user a unique ID 賦予一個不同的ID

$this-id = uniqid();

}

function __sleep()

{

//do not serialize this-id 不串行化id

return(array(“name”,”sex”));

}

function __wakeup()

{

//give user a unique ID

$this-id = uniqid();

}

function p(){

echo “in function p() \t”;

return $this-name;

}

function setname($name){

$this-name = $name;

}

} //create object 建立一個對象

$u = new User;

$u-setname(“pphu”);

//serialize it 串行化

$s = serialize($u);

echo “in serialize.php br/”;

print_r($s);

echo “br/”;

print_r($u);

echo “br/br/”;

? //// unserialize.php?php

include(‘serialize.php’);

//global $s;

$u2 = unserialize($s);

echo “in unserialize.phpbr/”;

echo $u2-p().”br/”;

echo $u2-sex.”br/”;

print_r($u2);

?

php數組反序列化。下面這段為什麼失敗

不要濫用heredoc,代碼不美觀。

我試過了,用序列化的結果反序列化是沒問題的,你檢查一下是不是有個別字符對不上?

php如何循環反序列化?

1.構造HITCON類反序列化字符串,其中$method=’login’,$args數組』username』部分可用於構造SQL語句,進行SQL注入,’password』部分任意設置。

2.調用login()函數後,利用username構造聯合查詢,使查詢結果為SoFun類反序列化字符串,設置username構造聯合查詢,使查詢結果為SoFun類反序列化字符串,設置username構造聯合查詢,使查詢結果為SoFun類反序列化字符串,設置file=『flag.php』,需繞過__wakeup()函數。

3.繞過oadData()函數對反序列化字符串的驗證。

4.SoFun類 __destruct()函數調用後,包含flag.php文件,獲取flag,需繞過__wakeup()函數。

php 經過uft-8處理方式之後,反序列化仍然失敗

??UTF-8處理!不過是進行了一個正則替換而已,應該是規則寫的不完整,可以用在線正則工具測試一下

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/252841.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-14 02:15
下一篇 2024-12-14 02:15

相關推薦

  • 金額選擇性序列化

    本文將從多個方面對金額選擇性序列化進行詳細闡述,包括其定義、使用場景、實現方法等。 一、定義 金額選擇性序列化指根據傳入的金額值,選擇是否進行序列化,以達到減少數據傳輸的目的。在實…

    編程 2025-04-29
  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • 理解Java反序列化(Java Deserialization Vulnerability)

    本文將從多個方面深入探討Java反序列化漏洞,對於筆者所總結的經驗和教訓,以及掌握Java反序列化的設計模式、最佳實踐和防範措施。 一、Java反序列化漏洞概述 Java反序列化漏…

    編程 2025-04-28
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • 如何使用Python執行Shell命令並獲取執行過程信息

    本文將介紹如何使用Python執行Shell命令並獲取執行過程信息。我們將從以下幾個方面進行闡述: 一、執行Shell命令 Python內置的subprocess模塊可以方便地執行…

    編程 2025-04-28
  • Treck TCP/IP Stack 輸入驗證錯誤漏洞CVE-2020-11901解析

    本文將對Treck TCP/IP Stack 輸入驗證錯誤漏洞CVE-2020-11901進行詳細解析,並提供相關代碼示例。 一、漏洞背景 Treck TCP/IP Stack是一…

    編程 2025-04-27
  • Python調用C代碼過程用法介紹

    本文將從多個方面詳細闡述Python調用C代碼的過程,包括相關的知識點、實例代碼以及注意事項等內容。 一、概述 Python作為一門高級語言,在很多情況下不能滿足開發人員的需求。此…

    編程 2025-04-27
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若服務器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27

發表回復

登錄後才能評論