对于[php反序列化长度变化尾部字符串逃逸]浅显看法

标签:通过   安全   htm   eva   src   功能   tps   导致   参考   

0x00 前言

今天做到一道有关php反序列化字符逃逸漏洞的CTF题目,看了一下午师傅们写的关于这个漏洞的文章总算看懂了,觉得还是有必要写一下关于这个漏洞的文章.

参考这位师傅的文章:https://www.cnblogs.com/litlifep/11690918.html


0x01 漏洞浅析

  1. 先看一段php序列化的代码(本代码基于7.0.9版本的php,经过测试较低版本的php会使”被转义导致实验失败:
    技术图片
  2. 代码功能很简单,输入name,并和sign一同传入到user数组中,user数组序列化后的字符串经过test函数检测之后,输出反序列化之后的结果.
    技术图片
  3. 关于php反序列化引擎在进行反序列化的时候是以字符长度来进行判断的,关于这一点,前言中的参考文章已经解释的很详细了,这里不再赘述.
  4. 下面进行漏洞测试,通过修改name的值从而改变sign的值.
    1. 关键点在于test函数,这个函数检测并替换了非法字符串,看似增加了代码的安全系数,实则让整段代码更加危险.test函数中检测序列化后的字符串,如果检测到了非法字符‘x‘,就把它替换为‘ha‘.
    2. 如果输入name=evALx
      技术图片
    3. 可以看到被替换成了‘evALha‘,这个字符串长度为6,从而导致反序列化失败,无法输出结果.利用这个漏洞,就可以对sign的值进行修改.输入name=evALxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”;i:1;s:14:”hello hackerrr”;}
      技术图片
    4. 可以就看到sign的值被成功修改.
  5. 原因分析
    1. test函数把‘x‘替换成‘ha‘,换句话来说,就是把一个字符替换成了两个字符,造成了序列化字符串的”膨胀”.
    2. 首先来考虑要注入的数据,在这个例子中把sign替换为”hello hackerrr”,这个字符串在本实验的序列化结果是i:1;s:14:”hello hackerrr,由于要闭合name的双引号以及结束的花括号,所以payload应该是”;i:1;s:14:”hello hackerrr”;}
    3. 下面来考虑长度溢出,payload的字符串的长度是29,所以要在name中输入29个x,再加上evAL,整体长度就是62,在经过test函数替换之后,x被替换成了ha,如下图所示:
      技术图片
    4. 溢出的部分成功逃逸,经过双引号闭合name,以及闭合结束时的花括号,导致sign被成功修改.

0x02 特征

序列化后的字符串经过非法字符替换之后导致了”字符串膨胀”,引发了字符串逃逸.

对于[php反序列化长度变化尾部字符串逃逸]浅显看法

标签:通过   安全   htm   eva   src   功能   tps   导致   参考   

原文地址:https://www.cnblogs.com/hello-there/p/12870541.html