找回密码
立即注册
搜索
发回帖 发新帖

6625

积分

0

好友

836

主题
发表于 前天 23:15 | 查看: 20| 回复: 0

一、登录框常规测试

目标是一个常见的后台登录页面。先用插件扫了一遍接口,不出所料,全部返回 403。

接口扫描返回403的路径列表

抓登录包看数据格式,发现是 JSON 提交。本来想试试 Fastjson 反序列化,但响应头暴露了服务器信息:IIS 7.5 + ASP.NET 8,Java 那一套漏洞直接排除。

登录接口响应泄漏服务器指纹

转向爆破弱口令,却发现验证码无法绕过——删除验证码字段返回"不能为空"。

删除验证码字段后的报错响应

验证码不能为空报错响应

有人可能会说用 OCR 识别,但这里的验证码是 Base64 内嵌的,现有爆破工具都不支持,需要写中转脚本配合,较麻烦,先放一放。

于是我又想到了,修改返回包,看看能否中个奖,绕过登录。

修改返回包后状态变为success的响应

返回了,JWT 认证格式。我寻思,JWT 不都是 Java 里面的,.NET 竟然也会有?

JWT认证格式中的请求头字段

于是 F12,全局搜索关键字,翻找半天,并未发现相关的参数,点燃的希望又破灭了。

前端XMLHttpRequest中Authorization处理逻辑

常规思路走完一遍,还是没有突破,剩下最后一招:扫目录。

二、Swagger 未授权访问

目录扫描命中了 Swagger 接口文档。

Swagger接口文档OpenAPI配置

文档里列出了大量后台接口,但绝大多数都需要鉴权,只有两三个字典类接口能匿名访问,且不含敏感信息。

不过有一个有价值的收获:响应中暴露了后端框架信息——Vol.Core(一个开源的 .NET 后台框架)。

三、源码审计:定位加密逻辑

既然知道了框架,直接把源码拉下来做源码审计。

翻到 SQL 初始化文件,里面存了默认管理员密码,但是 Base64 解不开,说明是加密存储,需要找密钥。

SQL初始化文件中的加密密码数据

接着翻配置文件,找到了 Key。

VOL.WebApi配置文件结构

Secret配置中的JWT/AES密钥

但直接拿这个 Key 还是解不出来,说明加密逻辑不是简单的 AES/DES。全局搜索 decrypt 定位解密函数。

DecryptDES解密方法源码

发现一个有意思的地方:函数命名是 Des,但内部实际调用的是 AES。密钥取配置值的前 16 位。

AES解密工具得到的默认密码

默认密码登录失败提示

解密成功,拿到默认 admin 密码,登录——失败。说明默认密码已被修改。

四、JWT 伪造:第一次尝试

思考片刻:配置文件里同时存在 JWT 密钥,如果默认密钥没改,直接伪造 Token 就能进后台。

伪造 Token 需要知道参数结构,前端没有,但这是后端,继续全局搜索 JWT,定位到核心生成逻辑。

JWT令牌生成方法源码

需要六个字段:

字段 含义
jti 用户ID
iat 当前时间戳
nbf 当前时间戳
exp 过期时间戳
iss 配置中的 Issuer
aud 配置中的 Audience

构造 Payload:

{
  "jti": "1",
  "iat": "1788013440",
  "nbf": "1788013440",
  "exp": "1788020640",
  "iss": "vol.core.owner",
  "aud": "vol.core"
}

用配置文件里的密钥签名后请求——401。

伪造JWT后接口返回401

说明 JWT 密钥也被改了。继续硬刚的话,只能审未授权漏洞或前台 RCE。

但审了半个多小时,确认 Swagger 里的接口和代码里的接口一一对应,不存在未授权接口。

Builder模块接口路径列表

BuilderController控制器源码

五、意外收获:string/{key} 接口读取真实配置

正当准备放弃时,重新仔细看了一遍接口文档,发现一个被忽略的接口:string/{key}。

而这个接口,findsomething 插件并未提取出来,所以在一开始接口 fuzz 的时候,并未注意到。

起初不知道这个接口是干什么的,丢给 AI 生成了一批常见 key 值挨个试,还真发现了问题。

string/Path → 返回系统环境变量
string/username → 返回系统用户名
string/os → 返回 Windows

string/Path接口返回系统路径

string/username接口返回系统用户名

string/OS接口返回Windows系统

第一反应是命令注入或文件读取,但试了 id、cmd:whoami 都没反应。

卡了一个小时无法深入利用。

回头看接口定义:

"/string/{key}": {
  "get": {
    "tags": ["ApiConfig"],
    "parameters": [
      {
        "name": "key",
        "in": "path",
        "required": true,
        "schema": { "type": "string" }
      }
    ],
    "responses": {
      "200": { "description": "Success" }
    }
  }
}

推测逻辑是:根据 key 从 API 配置文件中返回对应的字符串值。

关键来了——我手上有源码啊。匹配了三层参数后确认,这个接口就是从配置中按 key 取值。

string/Logging读取日志级别配置

一一对应。

Logging日志级别默认配置

既然前面 JWT 默认密钥伪造失败,那就用这个接口把真实密钥读出来。

string/Secret:JWT接口读取JWT密钥

成功拿到真实密钥。

六、二次伪造:拿下后台权限

用读到的真实密钥重新签发 JWT,调用用户列表接口测试。

用户列表接口返回大量用户数据

接口直接返回了 1000+ 条用户数据,且包含密码字段。

用前面审计到的 AES 密钥解密,发现存在弱口令(如 123456),只是用户名是中文姓名。

登录页提示保存密码123456

再多说一嘴,在前期审计的时候,发现了上传接口,需 token,但由于是配置原因,aspx 不解析。

上传目录中ASPX文件不解析

最后在登录页面,抓包修改返回包并添加有效 token,即可登录后台。

七、总结

主要坑点在于 .NET 系统的权限校验做得比较好,但好在接口文档泄露了后台框架,且为开源项目,可自行审计,发现配置关键字后一举拿下后台。

这条链路从 Swagger 泄露到配置读取,再到 JWT 伪造,在 .NET 后台渗透中并不罕见。对 .NET 安全、JWT 伪造与源码审计感兴趣的朋友,也欢迎到云栈社区交流实战经验。




上一篇:开源 Skill 把 AI 几百行回答排版成一页 HTML:token 省 87%
下一篇:DeepSeek Harness 上下文管理、记忆压缩与知识获取机制解析
您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-10-28 08:21 , Processed in 0.068237 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表