zoukankan      html  css  js  c++  java
  • Day 11

    这源码考的是php的反序列化漏洞

    所谓的反序列化漏洞就是将一个对象进行序列化变成一个字符串,当这个字符串被反序列化的时候,如果这个字符串里面对应的对象的一些参数变化了,那么当再一次调用这个对象这个参数的时候,那个参数就会被改变成字符串所构造的那个数据。

    一般来说,反序列化的漏洞都是由魔术方法导致的

    常见魔术方法有:

    __construct()当一个对象创建时被调用

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

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

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

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

    解析得有点拗口,拿代码来解析一下

    可以看到,这里是将对象当字符串输出了,所以会执行__toString()魔术方法

    输出a

    改一下代码

     

    这里执行了反序列化函数

    可以看到这里的序列是一个对象,对象名为Demo   参数file的值为wowowo

    如果执行这个就会输出 wowowo

    因为这个序列一旦被反序列出来,就会成为一个对象,而这个被当成字符串使用,那么就会执行源码里面的__toString()方法

    其他的魔术方法使用都大致一样

    说白了就是,序列化一个相同的对象,但是里面的参数的值改变了,当源码中将这个序列返回成一个对象之后,如果源码再一次调用那个参数,那么就可以改变那个参数的值,相当于是重新赋值了

    有了上面的知识,再去看这道题的源码

     

    源码目的就是将$cachefile的值作为文件名,$template的值作为文件内容,保存为一个文件

    保存文件的方法是:

     

    这个方法是在代码结束之前执行的

     

    而且代码中还有反序列化函数

     

    那么思路就清晰了,

    执行这个反序列化函数,生成一个对象,然后程序注销之前调用了createCache()

    生成文件,文件名和文件内容都是可控,那么就可以生成任意文件了

    下面就是构造序列了,绕过什么的,等下再解决

    正常构造:

    写一个class ,名字和源码的class要对应,然后要改变什么参数,就写进去,然后将这个对象序列化

     

    但是这样子是不行的,因为源码里面有限制

     

    有两个限制,第一个限制,前面两位不能是0:

    但是一个对象序列化出来的就是0:

     

    这里好绕过,这个对象用一个array() 括起来就好了,

     

    第二个限制,进行正则匹配,0: 后面不可以是数字

    这里在8前面加一个+号就可以

    那么全部都可以了

    将生成的序列,填写进cookie里面,发送过去

    检查一下文件是否有生成,发现没有生成

    这时还有一个知识点

    那就是cookie的值,不可以有分号(;

    分号后面的不见了

    可以用url编码

     

    然后得到编码后的,注意要在8前面加上  +  + url编码是%2b

     

    刷新一下,就会发现文件生成了

  • 相关阅读:
    C# 使用SqlBulkCopy类批量复制大数据 快速导入Excel大量数据
    Git的安装与使用
    未能加载文件或程序集“Microsoft.VisualStudio.Web.PageInspector.Loader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。
    Android SDK Manager不能显示所有包的解决办法
    editor多功能文本框在有些计算机上不能正常加载,解决方法,本人用的是把js调用方法放到<body></body>后面)
    MVC URL参数传递+变为空格解决方法
    SQL 查询不重复数据
    Java基本数据类型取值范围
    统计数组中的逆数对个数
    Docker 安装 ElasticSearch
  • 原文地址:https://www.cnblogs.com/nienie/p/9769297.html
Copyright © 2011-2022 走看看