记一次Node.js站点渗透
字数 1297 2025-08-29 08:31:41
Node.js站点渗透实战教学文档
1. 前言
本教学文档基于一次真实的Node.js站点渗透过程,详细记录了从信息搜集到最终获取管理员权限的全流程。Node.js站点由于其特殊的架构和运行机制,与传统PHP/JSP站点在渗透方式上有显著差异。
2. 信息搜集阶段
2.1 基础信息收集
- 子域名扫描:使用工具如subfinder、Sublist3r等发现相关子域
- 端口扫描:使用nmap进行全端口扫描,识别开放服务
- 目录扫描:使用dirsearch、gobuster等工具探测敏感路径
2.2 Node.js特征识别
- 404页面特征:Node.js框架通常有独特的404错误页面样式
- 文件扩展名:重点关注.js文件而非传统的.php/.jsp
- 路由特征:Node.js应用通常使用RESTful风格的API接口
3. 突破接口阶段
3.1 JS文件分析
- 查看页面源代码,寻找与产品/站点名称相关的js文件
- 分析js文件中的关键函数:
document.write函数:用于动态构建前端界面- Ajax请求:通常包含与后端交互的API接口
3.2 接口发现与利用
示例发现的关键Ajax请求:
$.ajax({
url: host + "/agent/getPlayerInfo",
type: "post",
dataType: 'json',
headers: {"content-type": "application/json"},
data: JSON.stringify({"uid": uid})
})
渗透方法:
- 使用Postman构造相同格式的请求
- 修改关键参数测试未授权访问漏洞
- 批量测试接口功能
4. 后台登录突破
4.1 用户枚举
- 通过发现的接口获取用户UID列表
- 使用接口获取对应用户名
- 将用户名作为字典用于爆破
4.2 密码加密分析
在JS代码中发现加密方式:
- 密码使用16位MD5加密
- 加密逻辑通常在登录相关的JS文件中
4.3 爆破策略
- 分析登录请求响应:
- 密码错误:返回code值为101100
- 登录成功:返回code值为200
- 使用Burp Suite配置爆破:
- 设置正确的加密方式
- 根据响应码判断结果
5. 权限提升技巧
5.1 前端权限控制绕过
发现关键权限控制逻辑:
if(data.code == 200) {
// 根据agentClass值渲染不同界面
// 1=管理员, 2-4=不同等级用户
}
5.2 权限提升方法
- 使用Burp拦截登录响应
- 修改返回包中的
agentClass值为1 - 前端将渲染管理员界面
5.3 后端鉴权缺失
- 即使前端显示管理员界面,仍需验证后端接口是否校验权限
- 测试发现所有管理功能接口均无二次鉴权
- 可直接调用管理员功能API
6. 安全建议
6.1 针对开发者的防御建议
- 接口鉴权:
- 所有敏感接口必须进行权限验证
- 使用JWT等机制进行身份验证
- 密码安全:
- 强制使用复杂密码
- 增加登录失败锁定机制
- 前端安全:
- 不要仅依赖前端进行权限控制
- 敏感数据应在服务端验证
- 错误处理:
- 统一错误响应,避免泄露敏感信息
6.2 针对管理员的防护建议
- 定期审计:
- 检查用户列表,删除不必要账户
- 监控异常登录行为
- 密码策略:
- 强制定期更换密码
- 禁止使用弱口令
- 日志监控:
- 记录所有敏感操作
- 设置异常操作告警
7. 总结
本次渗透揭示了Node.js应用中常见的几类安全问题:
- 未授权访问API接口
- 前端权限控制可被绕过
- 缺乏有效的二次鉴权机制
- 密码策略不严格导致爆破风险
通过系统化的信息收集、细致的代码分析和逻辑漏洞利用,即使在没有传统getshell的情况下,也能实现完整的权限控制。