0x01
当时只做出了签到的php(bushi),现在来看看
0x02 question
simple_php
| |
直接就可以弹shell
| |
| |
本地通了但是ctfshow没成功,和大菜鸡师傅问了一下,原来是靶机没有bash,那么直接截断绕过其实也可以
| |
发现有mysql,再看看进程,
| |
可以进数据库看看,什么情况,直接猜弱密码
| |
但是截断的这种打不了了,只能换了,还可以利用十六进制打,记得自己之前刷题的时候有做过,当时看着狗哥博客做的
| |
easycms
打一个ssrf,302跳转打
| |
但是还是不能弹shell,我们换成执行命令的就可以了
| |
| |
sanic
这道题质量非常高,我什么时候能一样出这么好的题呢
| |
首先就是/login路由的身份验证,但是因为是从cookie处获取,默认是;就给截断了,但是由于是python解析,我们可以使用进制绕过
| |
看到/src这里是使用的open(__file__).read(),也就是说如果我们能够污染或者说可控__file__就可以实现任意文件读取,看到/admin

发现使用了pydash,并且版本正确可以进行原型链污染,只不过这里需要绕过一下_.,这个绕过用\转义就可以绕过了,我们换上session就可以进行污染的尝试了
| |
| |
访问/src发现成功污染了,接着污染/flag,发现不对,可能是因为flag的名字并未是这个?也就是说我们必须要有个东西能够列出根目录的文件,才能够污染拿到flag,但是怎么找呢,由于这个代码非常简短所以很容易就引导我们去app应用查找

跟进static
| |
我们其实后面对每个属性都不用看,直接看两个属性,一个是file_or_directory,一个是directory_view

该函数的作用是 为 Sanic 应用注册静态文件或静态目录,并返回注册的路由信息。
- 如果
file_or_directory是文件 → 访问该 URL 时直接返回该文件内容。 - 如果
file_or_directory是目录 → 允许访问目录中的文件,甚至可以自动列出目录内容。
也就是说,我们首先污染directory_view为True,然后污染file_or_directory为/,拿到文件名就可以污染flag了,但是下一步该如何呢,我们应该怎么去获取到这个类和属性呢,看到下面出现了很多directory_handler所以直接跟进到DirectoryHandler(个人推荐自己起Docker来进行动态调试),

可以看到初始化的时候就得到了属性名,但是只是知道这个属性在这里,并不知道如何的去获得这个属性,sanic资料 在这篇文章里里面知道sanic自带路由,并且里面也有app.add_route怎么感觉可以注入内存马呢,不过这里我们先思考一下问题,那我们现在就是要获得注册的路由,app.router.routes 或app.router.routes_layer,那还是要自己起环境
| |

/src?rce=print(app.router.routes[2])得到<Route: name=__mp_main__.static path=static/<__file_uri__:path>>,那我们访问的时候就是
| |
不过后面尝试污染的时候发现这样子不行,并不能成功,必须要找个返回是列表的来进行访问,看gxn男神用的是name_index方法来进行访问的,我在网上查查资料也没找到,只能用这个了,直接打断点

然后我发现居然就打这个一个断点就能拿到答案了

| |
就可以把目录列出来了,访问/stctic/发现成功

| |
正准备拿flag呢,结果发现这样报错了,我们再次调试看看是为啥

原来directory是一个对象,并且parts才是路径,回到最开始的跟进,我们跟进parts,结果发现根本找不到_parts这个属性,然后尝试污染一下,发现仍然是报错,可能最新版的sanic已经没有了?感兴趣的师傅可以降版本回去找到这个,
经过本人的多次尝试可以知道他肯定是没有这个属性了
| |
本来预期是返回一个列表,然后赋值即可,现在只能靠ctfshow的复现环境来了
| |
拿到24bcbd0192e591d6ded1_flag
| |
顺便写个一把梭哈的脚本
| |
mossfern
一看题目描述,就很容易知道是python沙箱逃逸了

创建文件把代码放到里面然后再来运行