某面板组合拳前台RCE分析
原文链接: https://mp.weixin.qq.com/s?__biz=MzUyODkwNDIyMg==&mid=2247550870&idx=1&sn=a8857963542ca382f89e8d8dddc4863f
某面板组合拳前台RCE分析
原创 zkaq – cs 掌控安全EDU 2025-07-11 07:01
扫码领资料
获网安教程
本文由掌控安全学院 – cs 投稿
来Track安全社区投稿~
千元稿费!还有保底奖励~( https://bbs.zkaq.cn )
1、背景
今天在群里看到有人分享了 某 面板(xxxnel)的前台RCE组合漏洞。
正好周末有空,便尝试分析了一下。
2、漏洞复现
复现过程本文不再赘述,详情可参考原文:
https://mp.weixin.qq.com/s/nU1qFi01Ig2Stwzo__oRUQ
(原文已被删除)
3、本地分析
首先从官网下载并安装至本地 虚拟机 环境。
可以注意到该面板的端口和后台登录 URI 都是随机生成的。这某种程度上增加了安全性(虽然长度不长,但数字+字母的组合还需要一定时间的爆破,基本能被WAF拦截)。
看完文章的第一反应是后端接口存在未授权访问漏洞,因此可以直接修改返回数据包绕过权限验证。本地环境搭建完毕后,登录发现返回了JWT。
找一个接口去掉认证 token,发现不能未授权。
最初的思路错了,随机想到是否可能是因为 JWT 密钥被硬编码导致的。
4、寻找硬编码
定位运行程序 pid,
定位运行程序本体,
确认为 go 编译程序,
使用 ida 打开,定位到关键函数,
继续向上跟,
还原伪代码,
func GetToken(userId int64, account string, tempUser bool) string {
// **拿密钥**
key := config.String("jwt.signing_key")
...
jwtInstance := Jwt{SigningKey: []byte(key)}
claims := CustomerClaims{ ... }
// **生成token**
tokenStr, _ := jwtInstance.CreateToken(claims)
return tokenStr
}
结论一目了然
– 配置项名称:”jwt.signing_key”
– 实际存储地:服务的配置中心或者本地 config 文件
返回程序运行目录,
/xx/panel/config.json
关键配置类似如下:
xxx
"jwt": {
"signingKey": "xxx1973",
"issuer": "xxx",
"expireSeconds": 604800
},
xxx
经过重装虚拟机验证,发现每次配置均一致,说明密钥为默认固化,未做随机化处理。
5、漏洞修复
在写作本文时,官方尚未修复该缺陷
修复建议:
– 安装时自动生成随机密钥,避免采用固定值
– 除校验 JWT 签名外,还应校验当前用户是否存在于数据库中
6、补充
分析过程中还发现,尽管端口和后台URI是随机的,但实际攻击场景下如何定位这些信息,以及如何利用该漏洞,都是值得进一步探讨的话题。
实际系统中这部分是可以绕过的,
这就当做一个小彩蛋,各位自己寻找吧
申明:本公众号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,
所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法.
没看够~?欢迎关注!
分享本文到朋友圈,可以凭截图找老师领取
上千教程+工具+交流群+靶场账号
哦
**分享后扫码加我!
回顾往期内容
代理池工具撰写 | 只有无尽的跳转,没有封禁的IP!
点赞+在看支持一下吧~感谢看官老爷~
你的点赞是我更新的动力