强网杯 2025 CeleRace Writeup
越权 先看系统权限,使用了 superviser 维持了三个程序: redis app.py (flask + broker) worker 其中 /readflag 程序 worker 用户可以执行,所以最终目标需要已 worker 用户 RCE。 题目在 werkzeug 的基础上自己写了一个阉割版的 Flask,其中在处理中间件那部分存在逻辑漏洞。 在处理请求时,先通过 path 找到对应的 endpoint,然后再收集该 endpoint 的 middlewares: def _collect_route_middlewares(self, endpoint: str, path: str) -> list[MiddlewareCallable]: scoped = list(self.route_middlewares.get(endpoint, [])) if scoped: return scoped if not self.wildcard_middlewares: return scoped normalized_path = self._normalize_path(path) for pattern, middlewares in reversed(self.wildcard_middlewares): if self._pattern_matches(pattern, normalized_path): return list(middlewares) return scoped 但是在匹配 middlewares 之前会先进行 _normalize_path 操作。所以对于 path : /tasks/fetch/%2e%2e/asd 来说,能够争取找到 fetch endpoint,但当匹配 middlewares 时就变成了 /tasks/asd 了,匹配失败,导致进入该 endpoint 前不需要执行任何 middlewares,实现越权。...