Js跟踪到未授权访问
字数 1194 2025-08-10 08:28:42
JavaScript 验证绕过漏洞分析与防御
0x00 漏洞概述
本文分析了一个通过跟踪JavaScript代码发现的后台未授权访问漏洞。攻击者通过分析登录页面的JavaScript验证逻辑,发现系统仅验证用户名而忽略了密码和验证码的校验,从而实现了未授权访问后台管理系统的攻击。
0x01 漏洞发现过程
1. 初始分析
- 目标系统:
http://xxx.xxxx.com/login.do - 原始注入漏洞已修复(通过RSA加密验证输入)
2. JavaScript代码跟踪
发现关键文件:login.min.js,其中包含以下重要信息:
// 定义验证变量
a -> loginId (用户名)
b -> password (密码)
c -> verifycode (验证码)
// 关键接口
/frameword/login_login.do // 登录验证接口
/frameword/login_toManage.do // 后台管理接口
3. 验证逻辑分析
JavaScript中的验证逻辑存在缺陷:
post(baseUrl_+"/framework/login_login.do",
{loginId:a,password:b,verifycode:c,abc:Math.random()},
function(a){
"true"==a ?
window.location=baseUrl_+"/framework/login_toManage.do" :
"code Faild" == a ? ...
}
)
关键问题:系统仅验证了loginId参数(a),而忽略了password和verifycode的校验。
0x02 漏洞利用步骤
-
构造请求:
- 使用已知或猜测的有效用户名(如admin)
- 密码和验证码可随意填写
-
直接访问后台接口:
- 在验证通过后,直接访问
/framework/login_toManage.do - 成功获取管理员权限
- 在验证通过后,直接访问
-
后续利用:
- 利用后台功能(如文件上传)获取Webshell
- 进一步渗透内网
0x03 漏洞原理
该漏洞属于客户端验证不完整导致的安全问题,具体表现为:
-
验证逻辑缺陷:
- 前端JavaScript仅验证用户名有效性
- 后端未对密码和验证码进行二次验证
-
接口暴露:
- 后台管理接口
/framework/login_toManage.do未做权限校验 - 可直接通过URL访问
- 后台管理接口
-
信任前端验证:
- 系统过度信任前端传递的参数
- 缺乏服务端完整的验证机制
0x04 防御措施
1. 服务端完整验证
// 伪代码示例
public boolean validateLogin(String username, String password, String verifyCode) {
// 验证所有必填参数
if(isEmpty(username) || isEmpty(password) || isEmpty(verifyCode)) {
return false;
}
// 验证验证码
if(!verifyCode.equals(session.get("verifyCode"))) {
return false;
}
// 验证用户名密码
User user = userDao.getByUsername(username);
if(user == null || !password.equals(user.getPassword())) {
return false;
}
return true;
}
2. 接口权限控制
- 对所有管理接口添加权限校验
- 使用拦截器或过滤器验证会话有效性
3. 安全开发建议
-
前后端分离验证:
- 前端可做基础验证提升用户体验
- 后端必须做完整验证确保安全
-
敏感接口保护:
- 管理接口不应直接暴露
- 应通过中间层进行权限控制
-
代码混淆与压缩:
- 对前端JavaScript进行混淆处理
- 避免敏感信息泄露
-
日志监控:
- 记录所有登录尝试
- 设置异常登录告警
0x05 漏洞挖掘技巧
-
JavaScript分析:
- 审查所有与认证相关的JS文件
- 查找关键接口和验证逻辑
-
接口枚举:
- 尝试直接访问发现的接口
- 测试参数最小集
-
逻辑漏洞测试:
- 尝试省略非必需参数
- 测试边界条件和异常输入
-
工具辅助:
- 使用Burp Suite拦截和分析请求
- 利用浏览器开发者工具调试JavaScript
0x06 总结
本案例展示了由于验证逻辑不完整导致的严重安全漏洞。开发人员应始终遵循"不信任前端"的原则,在服务端实现完整的验证机制。安全测试人员在进行渗透测试时,应特别关注JavaScript验证逻辑和隐藏接口,这些往往是发现逻辑漏洞的关键点。