在一次项目中遇到了Harbor,当时没在意,第二天起床的时候发现有个漏洞,趁着项目结束后的空档,赶紧分析学习一波
分析
在流传的poc视频中,可以发现研究员往/api/user
post了用户数据
> https://www.youtube.com/watch?v=LBgIKqdfF1k
所以来看看路由src/core/router.go
跟进api.UserAPI{}
,src/core/api/user.go
往下翻翻,发现303行定义了Post
函数,来仔细看看
317行解析了输入的json数据,看看models.User{}
的结构
src/common/models/user.go
,38行的HasAdminRole
有个json tag
,以为着在json中存在这个字段就能绑定到User
上,造成了越权成为admin
并且下面的代码并只检查了用户的用户名密码是否合法,没有检查用户注册时的权限是否正确
然后就插入数据库了,成功添加一个admin
用户
修复
官方在注册的时候检测了是否存在HasAdminRole
参考
https://github.com/goharbor/harbor/commit/1559c8ccd19ac6bd128d2cc91c4cc0b3ac4b35a2