Pikachu靶场通关笔记--php反序列化漏洞

在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数。

序列化serialize()
序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:

 class S{
        public $test="pikachu";
    }
    $s=new S(); //创建一个对象
    serialize($s); //把这个对象进行序列化
    序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}
        O:代表object
        1:代表对象名字长度为一个字符
        S:对象的名称
        1:代表对象里面有一个变量
        s:数据类型
        4:变量名称的长度
        test:变量名称
        s:数据类型
        7:变量值的长度
        pikachu:变量值

反序列化unserialize()

就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。

 $u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
    echo $u->test; //得到的结果为pikachu

序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题

  常见的几个魔法函数:
        __construct()当一个对象创建时被调用

        __destruct()当一个对象销毁时被调用

        __toString()当一个对象被当作一个字符串使用

        __sleep() 在对象在被序列化之前运行

        __wakeup将在序列化之后立即被调用

        漏洞举例:

        class S{
            var $test = "pikachu";
            function __destruct(){
                echo $this->test;
            }
        }
        $s = $_GET['test'];
        @$unser = unserialize($a);

        payload:O:1:"S":1:{s:4:"test";s:29:"";}

PHP反序列化

在提交框中输入任何内容都让我来点劲爆的,我这小暴脾气。

Pikachu靶场通关笔记--php反序列化漏洞_第1张图片

打开源码看一眼(unser.php)可以看到,他将我们输入的内容反序列化并且以html的方式在

标签中显示,加入条件判断。

$PIKA_ROOT_DIR =  "../../";
include_once $PIKA_ROOT_DIR.'header.php';


class S{
    var $test = "pikachu";
    function __construct(){
        echo $this->test;
    }
}


//O:1:"S":1:{s:4:"test";s:29:"";}
$html='';
if(isset($_POST['o'])){
    $s = $_POST['o'];
    if(!@$unser = unserialize($s)){
        $html.="

大兄弟,来点劲爆点儿的!

"; }else{ $html.="

{$unser->test}

"; } }

代码注释中给出一个反序列化的payload,根据这个payload我们写一个xss弹窗,给他序列化掉。

序列化脚本如下:

alert('hacker')";
}
$a = new s();
echo serialize($a);
?>

运行脚本,得到序列化结果 

O:1:"s":1:{s:4:"test";s:32:"";}

将序列化结果输入反序列化窗口提交,出现一个xss弹窗。

Pikachu靶场通关笔记--php反序列化漏洞_第2张图片

你可能感兴趣的:(php,开发语言,web安全)