newphp(web41)
这道题卡了很久,主要是在纠结一个弱智的问题:在序列里放一个序列,能不能一次性反序化了(以及其格式问题)。
先说题目。
初始界面,读代码——
从上往下简单解读一下:
1.evil类:
建一个公有的$hint
construct 构造函数,读取传入的值给hint赋值
destruct 析构函数,判断hint的值,若是则输出base64加密后的文件内容
wakeup函数,unserialize()后调用,判断hint,换值(需要绕过)
2.User类:
构造的时候接收两个值(username,password),并分别赋值
3.write,read
分别是把字符串中的*换成\0\0\0(一换三)和\0\0\0换成*(三换一)
4.主函数
post方式接收username和password
创建一个User的对象,序列化后赋给$a
简单判断后
对write和read函数处理过的$a进行反序化还原
思路:
利用write和read进行字符串逃逸
这里只需要利用read就够了。
举个简单的例子:
字符串O:4:”User”:2:{s:8:”username”;s:3:”\0\0\0”;s:8:”password”;s:2:”12”}
在经历read函数变换后变成O:4:”User”:2:{s:8:”username”;s:3:”*“;s:8:”password”;s:2:”12”}
字符串内容(长度)虽然变了,但是前面要读取的字符串长度还是3,就会多往后读两位,导致引号(“)不闭合,这样明显就会造成代码错误。
而这是如果我们利用”\0\0\0”的数量来控制要“消去”的东西,然后在后面人为加一个引号(“)就可以实现加入自己相加的东西。
很明显,这里需要我们触发evil类,这里就要用到“序列嵌套”的东西,也就是我一开始说的最纠结的东西,可以参考另一篇——https://ouroborosscr.github.io/2021/07/11/%E5%B5%8C%E5%A5%97%E7%9A%84%E5%8F%8D%E5%BA%8F%E5%8C%96%E9%97%AE%E9%A2%98/
简单来说,就是把
s:8:”username”
s:3:”\0\0\0”
s:8:”password”
s:2:”12”
四个部分的任意一个完全替换成O:4:”evil”:2:{s:4:”hint”;s:8:”hint.php”;}就可以在反序化的时候触发evil类。
主要的难点是去掉前面的s
因为有两个传入点(username和password)
所以我们用username传\0\0\0,用password传O:4:”evil”:2:{s:4:”hint”;s:8:”hint.php”;}
我先改造了一下原来的代码,用123做了测试——
得到序列为O:4:”User”:2:{s:8:”username”;s:3:”123”;s:8:”password”;s:41:”O:4:”evil”:1:{s:4:”hint”;s:8:”hint.php”;}”;}
这里只需要替换123为多个“\0\0\0”使前面的数字增大,目的是把;s:8:”password”;s:41:”给包括(主要是“s:41:”,相当于换上面所说的第三四部分),和后面的引号闭合。
因为是2换1,所以只能在后面加一个没用的字符a,用8个“\0\0\0”来换。
得到payload——
username=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0&password=a”;O:4:”evil”:1:{s:4:”hint”;s:8:”hint.php”;}
输入后发现还需要绕过最开始的判断,把1改成2(类似于数组绕过)(不太确定)——
username=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0&password=a”;O:4:”evil”:2:{s:4:”hint”;s:8:”hint.php”;}
得到一串base64加密码
也可以多此一举的加上password(更严格的换第四部分)
username=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0&password=a”;s:8:”password”;O:4:”evil”:2:{s:4:”hint”;s:8:”hint.php”;}
解码base64得到一个网址,打开以后是一个ssrf,直接file:///flag就行了
然后补充一下,在学ssrf的时候,发现了一个视频感觉真的不错——
https://www.bilibili.com/video/BV1wK411V7KM/?spm_id_from=333.788.recommend_more_video.1
虽然是一个学生做的,但是普通话很标准并且不拖拉(这很重要,机构的老师不是一口台湾方言就是语速慢的要死,很容易睡着),提前准备过不至于不知道讲什么,从原理来讲述,也讲的很全面,属于好看不火进不了搜索首页的那种(不愧是b站)
再有就是涅普科技的视频——
https://www.bilibili.com/video/BV1VA411u7Tg?p=8
缺点是明显感觉准备不充分(语速,进度,不熟练讲课等方面),不过推荐的方法很实用。