某开源堡垒机历史漏洞分析
字数 1694 2025-08-26 22:11:34
开源堡垒机历史漏洞分析教学文档
环境搭建
版本信息
- 分析版本:3.5.6-rc6
- 对比版本:3.1.0(老版本)
搭建步骤
- 从官网下载安装包
- 使用
tar命令解压 - 进入解压后的目录
- 以管理员身份运行
./setup.sh(直接按Enter选择默认路径)
环境问题解决
- 问题现象:CentOS7虚拟机可以ping通主机但无法telnet到7190端口
- 解决方案:关闭CentOS7防火墙即可
漏洞分析
1. 逻辑缺陷漏洞(登录绕过)
漏洞位置
- 路由文件:
app/controller/__init__.py - 登录处理类:
app.controller.auth.DoLoginHandler - 用户认证方法:
app.model.user.login
漏洞原理
- 登录流程将
username、password和oath参数传入app.model.user.login方法 - 当
password为空时,系统没有对应的控制逻辑,导致可以绕过密码验证
利用方式
- 正常请求JSON:
{"username":"admin","password":"123456"} - 绕过方式:将password设为null
{"username":"admin","password":null}
2. 任意文件读取漏洞(后台)
漏洞位置
- 处理类:
app.controller.audit.DoGetFileHandler - 路由:
/audit/do-get-file
漏洞原理
- 通过
f参数获取filename信息 filename直接拼接到file路径后并打开- 需要满足以下条件:
- 参数
act、_type、rid和filename不能为空 act必须是size或read_type必须是rdp、ssh或telnet
- 参数
限制条件
- 需要后台管理员权限
- 系统用户均为具有一定权限的用户
3. 存储型XSS漏洞
漏洞位置
- 对比版本:3.1.0(存在) vs 3.5.6(修复)
漏洞原理
- 在3.1.0版本中,未对
<>进行实体编码 - 攻击者可以通过闭合
<>标签实现存储型XSS - 3.5.6版本修复方式:对
<>进行实体编码
4. CSRF漏洞(密码重置)
漏洞位置
- 处理类:
app.controller.user.DoResetPasswordHandler - 路由:
/user/do-reset-password
漏洞原理
- 通过
mode参数控制执行模式 - 当
mode=2时:- 先进行鉴权
- 获取
user_id和password - 不需要传入旧密码
- 进行密码强度检查后直接重置密码
利用方式
- URL:
http://[目标IP]:7190/user/do-reset-password - POST数据:
{"mode":2,"id":2,"password":"Qdmin@12345"} - 注意:该漏洞在最新发行版本中仍存在
5. 未授权访问漏洞
漏洞位置
- 处理类:
app.controller.system.DoGetLogsHandler - 路由:
/system/do-get-logs
漏洞原理
- 大多数方法会调用
app.base.controller.TPBaseHandler.check_privilege进行鉴权 - 但
DoGetLogsHandler中没有进行鉴权检查 - 无论是否携带cookie都能返回数据
潜在风险
- 调用了
app.model.syslog.get_logs方法 sql_filter中log_user_name的值直接带入SQL语句- 可能通过闭合引号实现SQL注入
总结与建议
代码审计要点
- 关注认证逻辑中的边界条件(如空密码处理)
- 检查文件操作是否进行路径校验
- 验证所有敏感操作是否进行权限检查
- 检查输出是否进行适当的编码处理
- 确认关键操作是否有CSRF防护
修复建议
- 对所有输入参数进行严格验证
- 实现统一的权限检查机制
- 对文件操作进行路径规范化检查
- 对所有输出进行HTML编码
- 为敏感操作添加CSRF Token
学习价值
- Python Web应用安全审计的典型案例
- 多种类型漏洞的综合分析
- 新旧版本安全改进对比
通过分析这些历史漏洞,可以深入了解堡垒机系统的安全薄弱环节,并为类似系统的安全开发和安全审计提供参考。