泛微 e-cology 远程代码执行漏洞分析
type
status
date
slug
summary
tags
category
icon
password
AI summary
文章首发自先知社区
漏洞分析
这个漏洞是一个前台身份验证绕过加上后台JDBC注入的组合漏洞。首先来分析一下这个身份验证绕过漏洞。
serviceTicketId
漏洞代码位于
com.weaver.passport.controller.RestLoginController#appThirdLogin()
跟进到

该方法会根据传入的
loginType
参数获取对应的CasLoginEnum
。如果当前没有可用的票据(ticket),则会使用传入的username
创建一个新的TicketGrantingTicket
。.png?table=block&id=1a80486f-a456-4ca0-8d53-fe06e354b682&t=1a80486f-a456-4ca0-8d53-fe06e354b682&width=707.953125&cache=v2)
.png?table=block&id=3a5e7dc6-dd7e-446d-93cb-bdda138e0a75&t=3a5e7dc6-dd7e-446d-93cb-bdda138e0a75&width=707.953125&cache=v2)
在
authenticateInternal
方法中,会根据相应的条件获取用户的相关信息。最后在appThirdLogin中生成serviceTicketId
EteamsId
在获取到
serviceTicketId
之后,可以通过调用 PassportLoginController#generateEteamsId()
方法来获取 EteamsId
。在泛微 e-cology 10 中,EteamsId 是一种用于会话管理的机制,类似于其他 Web 应用程序中的 Session ID 或 Cookie。
.png?table=block&id=32a7fa8a-7f99-44f8-ab3c-d609ff12ec6e&t=32a7fa8a-7f99-44f8-ab3c-d609ff12ec6e&width=707.984375&cache=v2)
这里返回了
EteamsId
,它是通过将 loginType
和 serviceTicketId
的 MD5 值拼接而成的。在补丁中,已经无法通过该接口获取 EteamsId
了。
不过,该代码给出了构造 EteamsId
的方式,最初我们以为可以手动伪造。但经过测试发现,这并不可行。原因是 this.securityContextCache.put(tokenId, context)
将 EteamsId
存储到了上下文环境中,而手动构造的 EteamsId
没有经历这一步,因此无法通过校验。JDBC Attack
漏洞点在
DataConnController#testConnByBasePassword()
跟进到
testConn()
继续跟进
.png?table=block&id=880b527d-8394-48e3-a04d-5d2acc2f5daf&t=880b527d-8394-48e3-a04d-5d2acc2f5daf&width=707.984375&cache=v2)
该方法会根据
DbType
参数来判断使用哪种数据库驱动。如果相应的驱动尚未加载,它还会通过反射的方式动态获取并实例化该驱动。随后,它会采用 JDK 自带的DriverManager.getConnection()
方法建立数据库连接。这种方式不需要显式声明数据库驱动,而是由 JDBC URL 来决定使用哪种驱动,但前提是该驱动类已经被成功加载。这里可以利用的点有很多,可以打mysql、db2等,但这两种都需要出网才能利用。
mysql
这里存在 MySQL5.x版本,可以利用它来读取文件。同时,如果存在合适的反序列化漏洞链,也能RCE
.png?table=block&id=3c7acfe1-0325-429c-bf89-cb8f089182fc&t=3c7acfe1-0325-429c-bf89-cb8f089182fc&width=693&cache=v2)
db2
由于新版本 ec10 中使用的 JDK 版本为 8u201,因此需要借助
javax.el.ELProcessor#eval
方法来绕过一些限制。
.png?table=block&id=5e4ae8b5-ee3e-4bd9-b7b3-c2223c52ea69&t=5e4ae8b5-ee3e-4bd9-b7b3-c2223c52ea69&width=707.984375&cache=v2)
.png?table=block&id=e1ace787-1ed9-4595-8c36-174cb7eb83e0&t=e1ace787-1ed9-4595-8c36-174cb7eb83e0&width=707.984375&cache=v2)
H2
更加优雅的利用方式就是通过加载 H2 数据库驱动来实现无需出网的利用。虽然在当前的环境中无法直接加载 H2 驱动,但我们可以寻找其他的方法加载h2驱动:
IaAuthclientController#save()
.png?table=block&id=cca03c72-38c7-4d20-a2d5-39c597a54bcc&t=cca03c72-38c7-4d20-a2d5-39c597a54bcc&width=707.96875&cache=v2)
构造如下格式的数据包即可加载h2数据库驱动
此时我们就可以利用h2数据库执行任意Java代码了,这里dbType任意即可。
Loading...