PHP原生类反序列化

2021-03-28 01:28

阅读:498

标签:PHP5和PHP7   dct   struct   href   魔法   方法   实现   document   new   

    在做BJDCTF中的题目XSS之光的时候遇到了PHP原生类的反序列化,以前没有了解过,现在来学习一波。

 基础知识

首先还是来回顾一下序列化中的魔术方法,下面也将以此进行分类来进行研究。

当对象被创建的时候调用:__construct
当对象被销毁的时候调用:__destruct
当对象被当作一个字符串使用时候调用(不仅仅是echo的时候,比如file_exists()判断也会触发):__toString
序列化对象之前就调用此方法(其返回需要是一个数组):__sleep
反序列化恢复对象之前就调用此方法:__wakeup
当调用对象中不存在的方法会自动调用此方法:__call

看一下当前php本身内置类有:

 foreach ($classes as $class) {
    $methods = get_class_methods($class);
    foreach ($methods as $method) {
        if (in_array($method, array(
            ‘__destruct‘,
            ‘__toString‘,
            ‘__wakeup‘,
            ‘__call‘,
            ‘__callStatic‘,
            ‘__get‘,
            ‘__set‘,
            ‘__isset‘,
            ‘__unset‘,
            ‘__invoke‘,
            ‘__set_state‘
        ))) {
            print $class . ‘::‘ . $method . "\n";
        }
    }
} 

当然有些类不一定能够进行反序列化,php中使用了zend_class_unserialize_deny来禁止一些类的反序列化,比如序列化DirectoryIterator的时候。

 

回到本题,本题存在git源码泄露,用GitHack下载源码后只有简单的两行。

技术图片

 

这里要利用魔法方法 __toString来实现xss,而__toString中Error 和 Exception类 会造成XSS  但是Error只适于php7下造成xss,Exception php5和php7都适用

用burp抓包发现是php5.6的,因此是Exception。

技术图片

 

 

于是先用下面的exp看看有没有弹窗。

exp:

 

$a = unserialize($_GET[‘lemon‘]);
echo $a;

 

 

 

技术图片

 

 

 

 

然后本题的exp:

 

 

$a = new Exception("");
echo urlencode(serialize($a));

 

 

 

 

 

 

 

技术图片

 

 

 flag就在cookie和url上面

 

在这里学下xss相关知识:

#实现恶意跳转

 

 

 

参考博客:

https://blog.csdn.net/qq_43431158/article/details/105135969?%3E

http://blog.ydspoplar.top/2020/03/17/php%E5%8F%AF%E5%88%A9%E7%94%A8%E7%9A%84%E5%8E%9F%E7%94%9F%E7%B1%BB/

感谢大佬!!!菜鸡受教了    

PHP原生类反序列化

标签:PHP5和PHP7   dct   struct   href   魔法   方法   实现   document   new   

原文地址:https://www.cnblogs.com/4sh3s/p/12623979.html

上一篇:web前端面试题汇总(2)

下一篇:css/选择器


评论


亲,登录后才可以留言!