皮卡丘中的PHP反序列化

Posted 新网工李白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了皮卡丘中的PHP反序列化相关的知识,希望对你有一定的参考价值。

以下内容来自pikachu靶场,自己记录用于复习PHP反序列化的利用.

真他妈后悔上课的时候没好好学PHP,现在搞web很是吃力.一步一步的走是很重要的.

序列化

序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象
使用的函数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将在序列化之后立即被调用

pikachu漏洞

    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:"<script>alert('xss')</script>";}

以上是关于皮卡丘中的PHP反序列化的主要内容,如果未能解决你的问题,请参考以下文章

php代码审计9审计反序列化漏洞

深入理解PHP Phar反序列化漏洞原理及利用方法

今晚拿下PHP反序列化的一系列操作

PHP反序列化一个JS序列化的变量字符串[重复]

2020/2/2 PHP代码审计之反序列化

使用字符串函数反序列化亚马逊红移中的 php 对象