某开源堡垒机历史漏洞分析
字数 1694 2025-08-26 22:11:34

开源堡垒机历史漏洞分析教学文档

环境搭建

版本信息

  • 分析版本:3.5.6-rc6
  • 对比版本:3.1.0(老版本)

搭建步骤

  1. 从官网下载安装包
  2. 使用tar命令解压
  3. 进入解压后的目录
  4. 以管理员身份运行./setup.sh(直接按Enter选择默认路径)

环境问题解决

  • 问题现象:CentOS7虚拟机可以ping通主机但无法telnet到7190端口
  • 解决方案:关闭CentOS7防火墙即可

漏洞分析

1. 逻辑缺陷漏洞(登录绕过)

漏洞位置

  • 路由文件:app/controller/__init__.py
  • 登录处理类:app.controller.auth.DoLoginHandler
  • 用户认证方法:app.model.user.login

漏洞原理

  1. 登录流程将usernamepasswordoath参数传入app.model.user.login方法
  2. password为空时,系统没有对应的控制逻辑,导致可以绕过密码验证

利用方式

  • 正常请求JSON:
    {"username":"admin","password":"123456"}
    
  • 绕过方式:将password设为null
    {"username":"admin","password":null}
    

2. 任意文件读取漏洞(后台)

漏洞位置

  • 处理类:app.controller.audit.DoGetFileHandler
  • 路由:/audit/do-get-file

漏洞原理

  1. 通过f参数获取filename信息
  2. filename直接拼接到file路径后并打开
  3. 需要满足以下条件:
    • 参数act_typeridfilename不能为空
    • act必须是sizeread
    • _type必须是rdpsshtelnet

限制条件

  • 需要后台管理员权限
  • 系统用户均为具有一定权限的用户

3. 存储型XSS漏洞

漏洞位置

  • 对比版本:3.1.0(存在) vs 3.5.6(修复)

漏洞原理

  1. 在3.1.0版本中,未对<>进行实体编码
  2. 攻击者可以通过闭合<>标签实现存储型XSS
  3. 3.5.6版本修复方式:对<>进行实体编码

4. CSRF漏洞(密码重置)

漏洞位置

  • 处理类:app.controller.user.DoResetPasswordHandler
  • 路由:/user/do-reset-password

漏洞原理

  1. 通过mode参数控制执行模式
  2. mode=2时:
    • 先进行鉴权
    • 获取user_idpassword
    • 不需要传入旧密码
    • 进行密码强度检查后直接重置密码

利用方式

  • 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

漏洞原理

  1. 大多数方法会调用app.base.controller.TPBaseHandler.check_privilege进行鉴权
  2. DoGetLogsHandler中没有进行鉴权检查
  3. 无论是否携带cookie都能返回数据

潜在风险

  • 调用了app.model.syslog.get_logs方法
  • sql_filterlog_user_name的值直接带入SQL语句
  • 可能通过闭合引号实现SQL注入

总结与建议

代码审计要点

  1. 关注认证逻辑中的边界条件(如空密码处理)
  2. 检查文件操作是否进行路径校验
  3. 验证所有敏感操作是否进行权限检查
  4. 检查输出是否进行适当的编码处理
  5. 确认关键操作是否有CSRF防护

修复建议

  1. 对所有输入参数进行严格验证
  2. 实现统一的权限检查机制
  3. 对文件操作进行路径规范化检查
  4. 对所有输出进行HTML编码
  5. 为敏感操作添加CSRF Token

学习价值

  • Python Web应用安全审计的典型案例
  • 多种类型漏洞的综合分析
  • 新旧版本安全改进对比

通过分析这些历史漏洞,可以深入了解堡垒机系统的安全薄弱环节,并为类似系统的安全开发和安全审计提供参考。

开源堡垒机历史漏洞分析教学文档 环境搭建 版本信息 分析版本: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: 绕过方式:将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数据: 注意 :该漏洞在最新发行版本中仍存在 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应用安全审计的典型案例 多种类型漏洞的综合分析 新旧版本安全改进对比 通过分析这些历史漏洞,可以深入了解堡垒机系统的安全薄弱环节,并为类似系统的安全开发和安全审计提供参考。