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

     

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

  • 相关阅读:
    开挂的列表与矜持的元组
    烦人的字符串
    好用的for循环与range
    浅谈编码
    流程控制与循环
    基础运算符
    python初识
    python的小介绍
    来自极客标签10款最新设计素材-系列九
    chmod----改变一个或多个文件的存取模式(mode)
  • 原文地址:https://www.cnblogs.com/nienie/p/9769297.html
Copyright © 2011-2022 走看看