反序列化漏洞-基础篇笔记

序列化与反序列化概述

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后的变量内容进行检查,以确定内容没有被污染

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值