codeql分析Alist的反射型xss漏洞 (CVE-2022-26533)

前言

CVE-2022-26533 为alist v2.0.10-v2.1.0中存在反射型XSS漏洞,使用codeql进行分析.

漏洞原因

r.GET("/i/:data/ipa.plist", controllers.Plist)  //绑定路由
//未对参数进行过滤导致XSS注入
func Plist(c *gin.Context) {
	data := c.Param("data")
	data = strings.ReplaceAll(data, "_", "/")
	data = strings.ReplaceAll(data, "-", "=")
	bytes, err := base64.StdEncoding.DecodeString(data)
	if err != nil {
		common.ErrorResp(c, err, 500)
		return
	}
	u := string(bytes)
    plist := fmt.Sprintf(`xml...%s,%s,%s...`, u, name, name)
	c.Header("Content-Type", "application/xml;charset=utf-8")
	c.Status(200)
	_, _ = c.Writer.WriteString(plist)
}

设置sink

设置sink为 c.Writer.WriteString(plist)中的参数plist为注入点

class AlistSink extends DataFlow::Node {
  AlistSink() {
    exists(DataFlow::MethodCallNode m |
      m.getTarget().hasQualifiedName("github.com/gin-gonic/gin", "ResponseWriter", "WriteString")
    |
      this = m.getAnArgument()
    )
  }
}

设置source

设置source直接使用了UntrustedFlowSource::Range
具体的代码可以参考: https://github.com/github/codeql/blob/main/go/ql/lib/semmle/go/frameworks/Gin.qll
以下是该文件的部分截取,主在是获取框架内读取数据method结果做为注入点

  private class GithubComGinGonicGinContextSource extends UntrustedFlowSource::Range {
    GithubComGinGonicGinContextSource() {
      // Method calls:
      exists(DataFlow::MethodCallNode call, string methodName |
        call.getTarget().hasQualifiedName(packagePath(), "Context", methodName) and
        methodName in [
            "FullPath", "GetHeader", "QueryArray", "Query", "PostFormArray", "PostForm", "Param",
            "GetStringSlice", "GetString", "GetRawData", "ClientIP", "ContentType", "Cookie",
            "GetQueryArray", "GetQuery", "GetPostFormArray", "GetPostForm", "DefaultPostForm",
            "DefaultQuery", "GetPostFormMap", "GetQueryMap", "GetStringMap", "GetStringMapString",
            "GetStringMapStringSlice", "PostFormMap", "QueryMap"
          ]
      |
        this = call.getResult(0)
      )
      or
      // Field reads:
      exists(DataFlow::Field fld |
        fld.hasQualifiedName(packagePath(), "Context", ["Accepted", "Params"]) and
        this = fld.getARead()
      )
    }
  }

设置config

source instanceof UntrustedFlowSource::Range

class AlistConfig extends TaintTracking::Configuration {
  AlistConfig() { this = "Alist config" }

  override predicate isSource(DataFlow::Node source) {
    source instanceof UntrustedFlowSource::Range
  }

  override predicate isSink(DataFlow::Node sink) { sink instanceof AlistSink }

  override int fieldFlowBranchLimit() { result = 5000 }
}

污点追踪

from DataFlow::PathNode source, DataFlow::PathNode sink
where exists(AlistConfig cfg | cfg.hasFlowPath(source, sink))
select source.getNode(), source, sink, "source"

完工

对codeql的学习做一点记录.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值