abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-follow-existence
Gitea 1.27.3 - Gitea
GetInfo 已经对隐藏用户返回 404,并对其原因撒了谎:fake ErrUserNotExist error message to not leak information about existence。PUT /user/following/{username} 使用 UserAssignmentAPI() 加载目标并调用 Follow。没有 IsUserVisibleToViewer。不存在的名称:404 user redirect does not exist。存在的隐藏名称:204。
204 表示账户存在。404 表示你猜了一个不存在的名称。个人资料 JSON 仍然关闭。
| ID | 暂无 CVE |
| CWE | CWE-203 |
| CVSS | 中危:4.3 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N |
| 产品 | Gitea |
| 受影响版本 | 至 v1.27.3(146cc3e) |
| 认证 | 已登录账户 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
登录(默认开放注册成本很低)。即使个人资料 API 返回 404,也能证明隐藏或受限账户存在。无法导出个人资料。无法访问私有 git。结合未认证 stargazers,你可以在公开仓库上找到隐藏登录名,然后在他们隐藏个人资料后确认该账户仍然存在。
Check 和 Unfollow 位于同一组。同样缺少检查。
与 stargazers 相同的可见性检查。当一个处理程序如此努力地撒谎时,你会查看所有其他接受 {username} 的路由。Follow 没有。
我注册了一个受限攻击者,关注了隐藏名称,关注了一个不存在的名称,并比较了状态码。公开用户本应返回 204。这不是 SUCCESS。隐藏用户返回 204 而未知用户返回 404,同时 GET 返回 404,这就是 SUCCESS。
已记录的弯路:Follow 隐藏用户返回 404(那么可见性就在此路由上);隐藏用户的个人资料 JSON(GetInfo 已经返回 404——这个 bug 是状态类别,不是数据泄露);将公开用户上的 Follow 204 视为 SUCCESS;反向 shell。都是表演。
cd lab
./run.sh
目标仅限 http://127.0.0.1:18134。Compose 允许 public,limited,private 可见性。
get-hidden status=404
follow-hidden status=204
follow-unknown status=404 user redirect does not exist
oracle hidden=204 unknown=404
SUCCESS GITEA-FOLLOW-ORACLE
在 FollowUser 之前,在 Follow(以及 Check/Unfollow)中调用 IsUserVisibleToViewer。隐藏名称必须像 GetInfo 已经做的那样返回 404。
follower.go · api.go following 组 · GetInfoGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。无担保。