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沙箱逃逸了
创建文件把代码放到里面然后再来运行