laravel相关知识学习
这里就是旧瓶装舅舅 为面试做准备 所以要来过一遍框架
larabel7.30.1反序列化
这部分先照着ctfshow上的教程去过一遍 然后再自己去研究研究
环境搭建
1 | composer create-project laravel/laravel www --prefer-dist "7.30.1" |
然后phpstudy搭建的时候有个bug 艹 浪费我两小时
这 .htaccess 是空的
你加上
1 | <IfModule mod_rewrite.c> |
然后把跟路径设为 /public 即可
入口点设置
随便开个路由即可 看看文档就回了
开始挖掘
一般会调用 __destruct() 方法
来复习一下(忘得差不多了都)
1 | __wakeup() //执行unserialize()时,先会调用这个函数 |

然后一条一条去跟
突然发现 php执行的条件是没有报错?
还是说 反序列化执行顺序的问题??? 不懂
1.举个例子/first try

这里要是 $jsonStr 可控 则可以写文件 但我们看到 如果想要能写 就必须要去满足上面这个shouldRersisit函数
跟进去看一下

我们这时候发现 将bool $allowSessionCookies = false 设为 true 就可以pass第一个判断
然后我们发现这玩意是可控的
然后就是要去满足第二个判断
也就是 getDiscard() 怎么看他能不能过呢?
跟一下

我们还要满足这个玩意
构造一下 放到 /test.php
1 |
|
1 | O%3A31%3A%22GuzzleHttp%5CCookie%5CFileCookieJar%22%3A2%3A%7Bs%3A41%3A%22%00GuzzleHttp%5CCookie%5CFileCookieJar%00filename%22%3Bs%3A9%3A%22shell.php%22%3Bs%3A19%3A%22storeSessionCookies%22%3Bb%3A1%3B%7D |
然后我们去设断点调一下
结果进都没进循环 草
为什么 不懂


反正不管这么多 咱们可控的俩参数是没戏了
2.有点东西
发现一个有趣的东西
这里的 events event 都是可控的
这时候我们有两种思路
- 调用
__call方法 - 直接找一个
dispatch可控的

1 | __call() //在对象上下文中调用不可访问的方法时触发 |
如过我们调用一个 不存在 dispatch ( 他自己写的一个函数方法)的类时
我们就可以调用到 __call() 然后 我们还可以控制其参数
1 | class a{ |
所以 接下来 我们去搜一下 __call 方法再已上面的为跳板 进行利用

78个 希望大大滴有
tip => 要时刻关注是否被 __wakeup() ban掉了关键函数 和能不能绕过
一般是
PHP5 < 5.6.25
PHP7 < 7.0.10
对于一些老的网站 还在使用php5.6.25 则可以进行绕过

发现一处 __call 这里 $arguments 可控 但是 $name不可控
如果 $res 可控的话 我们就可以rce了
然后来看上面这里
1 | $res = call_user_func_array([$this->generator, $name], $arguments); |
还是 $name 不可控 怎么才能执行命令呢?
我们知道 如果调用了不可访问的方法时会触发 __call 所以这里我们再用一次 如果返回值可控 我们就完全可控了

所以来构造 payload
1 |
|

NNNNNNBBBBBB
果然有点东西