我是靠谱客的博主 欢呼镜子,最近开发中收集的这篇文章主要介绍反序列化漏洞-基础篇笔记,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

序列化与反序列化概述

serialize和unserialize就是解决这一问题的存在,serialize可以将变量转换为字符串,并且在转换中可以保存当前变量的值;而unserialize则可以将serialize生成的字符串变换回变量。


通过一个列子查看php对象序列化之后的格式


 对php对象进行反序列化


跟serialize和unserialize相关的一些magic函数

    __sleep magic方法在一个对象被序列化的时候调用。

    __wakeup magic方法在一个对象被反序列化的时候调用。

可以看到serialize的时候调用了__sleep,unserialize的时候调用了__wakeup函数,在对象销毁的时候调用了__destruct函数

    举个存在漏洞栗子。一个类用于临时将日志储存进某个文件,当__destruct被调用时,日志文件会被删除

调用这个类:test06.php

看到

    $usr = unserialize($_GET['usr_serialized']);

    $_GET['usr_serialized']是可控的,那么我们就可以构造输入删除任意文件的脚本

    如:构造输入删除目录下的1.php文件的过程

编写脚本:test07.php

访问得到序列化代码:得到序列化之后的字符串O:7:"LogFile":1:{s:8:"filename";s:5:"1.php";}

如图:

访问http://localhost/test06.php?usr_serialized=O:7:"LogFile":1:{s:8:"filename";s:5:"1.php";}得到如图

这时发现一个存在的1.php文件被删除了


常见的注入点以及防范方法

在上述实验中,展示了由于输入可控造成的__destruct函数删除任意文件,其实问题也可能存在于__wakeup、__sleep、__toString等其他magic函数,一切都是取决于程序逻辑。

    打个比方,某用户类定义了一个__toString为了让应用程序能够将类作为一个字符串输出(echo $obj) ,而且其他类也可能定义了一个类允许__toString读取某个文件。

获取exp,访问http://localhost/exp/test08.php

 触发漏洞,获取1.txt内容,访问http://localhost/test09.php?usr_serialized=O:9:"FileClass":1:{s:8:"filename";s:5:"1.txt";}

 

防范方法

Unserialize漏洞依赖几个条件

    1)unserialize函数的参数可控

    2)脚本中存在一个构造函数、析构函数、__wakeup()函数中有向php文件中写数据的操作的类

    3)所写的内容需要有对象中的成员变量的值

防范方法有:

    1)要严格控制unserialize函数的参数,坚持用户所输入的信息都是不可靠的原则

    2)要对于unserialize后的变量内容进行检查,以确定内容没有被污染

最后

以上就是欢呼镜子为你收集整理的反序列化漏洞-基础篇笔记的全部内容,希望文章能够帮你解决反序列化漏洞-基础篇笔记所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部