CTF

[安洵杯 2019]easy_serialize_php之愚见

2020-01-18  本文已影响0人  天水麒麟儿_

三句题外话,第一句是终于放假了,在考试周活了下来,最后一周面临3门考试,我仍然做了2道比较基础的题目,现在重做一下顺便写wp,不敢说是热爱,勉强说是兴趣,矢志web。第二句是感谢通信原理老师给了我过,对于从没接触过通信的我来说,上课完全听不懂,最后靠党性,衷心感谢老师。第三句,寒假还是要学点习的(坐等真香),尤其是追求自己的喜欢的。

进入正题,打开即是源码,

将参数f改成phpinfo即可调用phpinfo()函数,看到几个比较敏感的点,

我想到了几个问题:

1.源码里,没有session_start(),phpinfo()里,session.auto_start也是off的,这样的话,在session这个问题上,每个页面顶多只能读取本身页面的$_SESSION数组。所以对于本题来讲应该只需要对这个页面做文章,不用想别的页面了。我们要搞清楚PHP中session机制的工作流程,同时我们也要明白这个题目里根本没有读取session文件,这个题只是把$_SESSION数组进行了serialize(),这种地方不要因为看到php处理器而犯迷糊。

2.虽然使用的是php处理器,但按上面所讲显然不存在解析器差异带来的对象注入问题;

3.过滤函数filter()是对serialize($_SESSION)进行过滤,滤掉一些关键字

4.正常传img参数进去会被sha1加密,我认为这里应该不存在有一个字符串,它sha1加密后的结果能与dog_flag.php这种名字碰撞,故我们应该用别的方法控制$_SESSION中的参数;

5.引用一位大佬的一句话:任何具有一定结构的数据,只要经过了某些处理而把自身结构改变,则可能会产生漏洞。

本来挺好的序列化的字符串,按某种去掉了一些关键字,本身就不对,本身就涉及到可能破坏原有结构而无法正常反序列化的问题。这里是利用反序列化长度逃逸控制了img参数。之前有一道题目是关键字替换导致字符串长度变长,把后面的原有参数挤出去了,本题是关键字被置空导致长度变短,后面的值的单引号闭合了前面的值的单引号,导致一些内容逃逸。

正常的序列化字符串

因为我们能控制的是$_SESSION的参数,payload只能以字符串形式传进去,然后想办法将它前面的控制符  s:xx: 闭合到一个字符串中取,这样就能将后面的payload作为独立的一个键和值。

我们需要的序列化字符串的格式(为了便于截图已换行)

我们要注意一点,如果 s:40:被闭合了,前面的s:5:"xxxxx";s:40:"只是一个键,而没有值(先不考虑长度问题),会反序列化失败,所以我们的payload的里应额外包含一个键值对,

真正能发挥作用的字符串的格式

";s:64: 这几个控制字符长度为7,";s:7:"xxxxxxx"这几个控制字符(和数据)长度为13,为了将他们闭合进前面的字符串,

由外而内

由此以来的话,payload为

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

传入即可,

心得:接触一个题时思路还是要发散的,通过题目去猜测出题人的引导,去排除,再加上多多积累多多见识多多实践,(不难的)题目一般都可以做。不得不说安洵杯的题确实比较友好,考点不难而且也比较直接,不拐弯抹角。

大胆应无惧,雄心誓不回

上一篇下一篇

猜你喜欢

热点阅读