美文网首页CTF
[安洵杯 2019]easy_serialize_php之愚见

[安洵杯 2019]easy_serialize_php之愚见

作者: 天水麒麟儿_ | 来源:发表于2020-01-18 22:36 被阅读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";}

    传入即可,

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

    大胆应无惧,雄心誓不回

    相关文章

      网友评论

        本文标题:[安洵杯 2019]easy_serialize_php之愚见

        本文链接:https://www.haomeiwen.com/subject/bstlzctx.html