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
果然有点东西