安洵杯 2019 easy_serialize_php 详解
damn!喜欢多解是吧,那就多亿点分析
可能涉及知识点
- php反序列化
- 变量覆盖(当然本题也可
不知道) - 字符串逃逸(减)
分析
各大平台上都有这个题应该,随便找个都能打.
~当然很久前我想写这个题解的,一直鸽了.今天终于抽空好好看了看和想了想.~
首先是开题页面:
点进去看得到源码,浅浅审计一下
下面给出注释版!
1 |
|
首先访问phpinfo界面然后找到个什么奇怪的d0g3_f1ag.php
文件,巴拉巴的就不讲了,自行解决!
首先讲第一个知识点,extract()变量覆盖
本题可用也可不用,随意即可!当然既然说是详解,俺肯定是都会讲.
先写一个蹩脚的测试代码看看发生了啥:
1 |
|
访问看看效果
这时我们POST传参看看会发生啥:
发现之前的变量都被清空了只保留了我们传参的flag
这里的$_SESSION
不是一个对象喔
ok,这个知识点讲完嘞
接下来直接开始字符串逃逸
,飞起来!
便于看出反序列化的变化特点,在本地打通再去远程把.加一条dump
变量的语句食用效果更佳!
第一种方式,不用前面的变量覆盖,老老实实传题目出现的变量
我们需要知道需要控制的变量是$_SESSION['img']
即可!
先打一发_SESSION[user]=flag
string(87) "a:3:{s:4:"user";s:4:"";s:8:"function";s:3:"123";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}"
可以看到flag被正则过滤了,替换为了空值,然后就是影响了原本的序列化数据结构,当然到你要反序列化回去的时候就会出现问题!而我们就可以利用这个问题达到我们的攻击目的!(反序列化的对象注入).这也就是所谓的字符串逃逸
咯
我们要的是读取ZDBnM19mMWFnLnBocA==
而非Z3Vlc3RfaW1nLnBuZw==
也即我们希望出现 s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==
那我们就把原先的不想要的img挤出去
通过它前面那个function变量覆盖一下
现在应该是有点感觉了吧!
然后开始数数阶段,如何把数给对上!
发现这个";s:8:"function";s:39:"
一段多余,因为前面的s:4都数越界了,然后后面的s:78
为了让我们假冒的img
变量注入真正起作用,这个必须给除掉,不然后面一大串我们的传参都是当作s:78
的值,也就是不会解析
数一下这段刚好是23,不方便凑数,凑个24出来更好,变成";s:8:"function";s:39:"a
Payload:_SESSION[user]=flagflagflagflagflagflag&&_SESSION[function]=a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:4:"name";s:6:"Eviden";}
解释一下后面这个s:4:"name";s:6:"Eviden";}
,因为序列化粗来的变量是a:3
也就是3个,我们污染
了两个其实.所以除了我们伪造的那个img
变量,另外一个还得凑一个变量出来才能符合要求!
当然这也就是我开头所说的不利用extract
变量覆盖,从而添加的凑数对象出现在后面
导致payload过长!
第二种方式,利用变量覆盖,凑数对象直接出现在中间!(网上通用解法)
前面看了demo函数之后我们应该会想到一种赋值,我们直接对SESSION
数组赋值看看是啥
发现序列化的变量只有两个了,也符合前面的分析,我们自己赋值了一个flag
变量,然后题目后面自己赋值了一个img
变量.
我们还是希望出现 s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==
直接传入看看
再前面加个;
便于分析.传入_SESSION[flag]=;s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==
得到序列化数据为:string(95) "a:2:{s:4:"";s:36:";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}"
发现";s:37:
多余,数一下长度为7=4+3
直接传入最终Payload:_SESSION[flagphp]=;s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
这里的s:1:"1"
就是我们在中间插入的对象,然后后面的";}
意味着反序列化终止的地方.
右键查看源码可以看到我们预先放本地的flag
总结
两种方式都有各自的实战场景,当然这个题肯定是后者分析起来舒服点!
初学者建议从第一种方式入手,更加朴实无华!
参考
安洵杯 2019]easy_serialize_php -------- 反序列化/序列化和代码审计_ctf 反序列化变量覆盖-CSDN博客