[安洵杯 2019]easy_serialize_php 1——wp
easy_serialize_php
先给payload:
_SESSION['flagphp']=;s:5:"guest";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
开始做题(这题是一道PHP反序列化逃逸)
一:审计代码发现phpinfo以及分析源码
为了帮助理解if($_SESSION){}这句特意执行了一次。
二、见下图可知,当传入新的session值时,user和funciton被清掉了
由此可得session值可以控制,(比如后面要控制的 $_SESSION["img"]="payload" )
三、由下图可得: 序列化 $_SESSION =》filter过滤函数 =》反序列化 =》base64解密文件名(例子:$username['img']="base64加密后的d0g3_f1ag.php")
综上所述:需要先对 d0g3_f1ag.php 加密,然后赋值给 $_SESSION['img'] 就可以读取文件了
四、序列化文件名
得:a:2:{s:4:"user";s:5:"guest";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
然后截取一段作为可用payload ;s:5:"guest";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
为什么要截取呢? 因为序列化后 有个 filter 过滤,他会把flagphp过滤掉,那么少的东西 他会向后截取相应数量的,下面具体算一下为啥接到 分号前
再看一下过滤后的情况;
五、传入payload
六、base64加密 /d0g3_fllllllag 并且读取文件内容
payload:_SESSION['flagphp']=;s:5:"guest";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}"
俩次base64加密的长度都一样,直接替换就行不用再执行php