在一次项目中遇到了Harbor,当时没在意,第二天起床的时候发现有个漏洞,趁着项目结束后的空档,赶紧分析学习一波

分析

在流传的poc视频中,可以发现研究员往/api/userpost了用户数据 > https://www.youtube.com/watch?v=LBgIKqdfF1k image.png

所以来看看路由src/core/router.go image.png 跟进api.UserAPI{}src/core/api/user.go image.png 往下翻翻,发现303行定义了Post函数,来仔细看看 image.png 317行解析了输入的json数据,看看models.User{}的结构 image.png src/common/models/user.go,38行的HasAdminRole有个json tag,以为着在json中存在这个字段就能绑定到User上,造成了越权成为admin image.png 并且下面的代码并只检查了用户的用户名密码是否合法,没有检查用户注册时的权限是否正确 image.png image.png 然后就插入数据库了,成功添加一个admin用户 image.png

修复

官方在注册的时候检测了是否存在HasAdminRole image.png

参考

https://github.com/goharbor/harbor/commit/1559c8ccd19ac6bd128d2cc91c4cc0b3ac4b35a2

https://www.youtube.com/watch?v=LBgIKqdfF1k