由于实验室产品的监控模块的需求,需要绕过zabbix的验证模块,实现从二级平台到zabbix的无缝接入。
测试发现,zabbix的身份验证并不是想象的那么简单,为了实现功能,遂进行源码分析。


zabbix常规登陆验证流程:

分析./include/classes/user/CWebUser.php中的login和logout可以了解到zabbix的常规验证流程。
主要逻辑如下:

login

  1. 查询出对应用户名密码的user对象
  2. 检查该用户登陆尝试次数是否超出限制
  3. 根据查询的userid验证用户权限,将页面是否允许访问存入guiAccess
  4. 登陆方式选择(ldap、数据库)
  5. 开始新的session: 生成sessionId,将(sessionId、userid、当前时间、激活状态)插入数据库
  6. 根据第3步的guiAccess判断是否结束并抛出异常
  7. 成功登陆后,清除访客的session
  8. 将新的sessionId存入cookie
  9. 对该次用户登录做审计

logout

  1. 从cookie里得到sessionId
  2. 从数据库里删除该登出用户对应的所有状态为PASSIVE的session记录
  3. 将cookie中得到的这个sessionId对应的session记录的状态修改为PASSIVE
  4. 从cookie里删除该sessionId

然而,从一个静态URL想要绕过登陆直接跳转到zabbix的某个监控页面,肯定是不能走这个常规流程,所以,我们以zabbix的监控图表界面对应的charts.php代码来理清zabbix对于URL跳转这类请求的验证流程。

URL跳转验证流程

包括chart.php的几乎每一个zabbix的展示页面的php代码都会在开头包含一个config.inc.php,且并无其他验证相关代码存在,config.inc.php中只有一行主要代码Z::getInstance()->run(),追踪到这个run函数里,就能找到疑似的验证流程入口$this->authenticateUser()
该函数位于 ./include/classes/core/ZBase.php 中。

checkAuthentication

ZBase.php中的函数,是对./include/classes/user/CWebUser.php中同名函数的封装,CWebUser.php中的checkAuthentication又是对zabbix API即./include/classes/api/services/CUser.php中的同名函数的封装。

具体流程如下:

  1. 从cookie中取出zbx_sessionid的值存入sessionId
  2. 如果该sessionId不为空,根据这个sessionId查询出对应的用户userid、autologout字段和处于ACTIVE状态session的lastaccess字段,如果sessionId为空,以访客模式调用login函数并得到新的sessionId,该sessionId对应的GUEST特殊用户将不能通过后面的权限认证
  3. 如果步骤2没有查出记录,那么会报错Session terminated, re-login, please
  4. 调用check_perm2system检查该用户的权限,若有问题,报错No permissions for system access
  5. 如果查出的记录的autologout > 0, 删除数据库中对应用户的过期的session
  6. 更新数据库中当前sessionId和userId对应的session记录的最近访问是时间(lassaccess)字段
  7. 检查该用户的页面访问权限(检查gui_access,与login流程的验证guiAccess一样)
  8. 将userid,sessionid,gui_access存入data变量中
  9. 如果gui_access为GROUP_GUI_ACCESS_DISABLED,即禁用,抛异常,退出。
  10. 将sessionId保存到cookie中
  11. 用sessionId为API设置验证令牌

分析得出结论,如果要实现在任何环境下的一次URL跳转都能成功以管理员的权限进入zabbix,关键在于以上流程的第2步,不能以访客模式进入zabbix,即需要让sessionId不为空且可用,自然得出的办法就是,提前保存好一个可用的sessionId到cookie中。

多番测试后,证实了以上方案是可行的,于是,实施方案如下:

手动在zabbix增加一个session记录,每次直接请求URL的时候,先调用一个自定义php,存入这个session的id,再继续访问,bingo!


后续发现问题,会回来更新。

zabbix身份验证流程解析&绕过身份验证的方法的更多相关文章

  1. Session (简介、、相关方法、流程解析、登录验证)

    Session简介 Session的由来 Cookie虽然在一定程度上解决了"保持状态"的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能 ...

  2. WEB安全新玩法 [9] 重置密码之验证流程防绕过

    一般来说,业务流程中出现多个操作环节时,是需要顺序完成的.程序设计者往往按照正常用户的操作顺序实现功能,而忽略了攻击者能够绕过中途环节,直接在后续环节上进行非法操作.iFlow 业务安全加固平台能够在 ...

  3. Spring Security验证流程剖析及自定义验证方法

    Spring Security的本质 Spring Security本质上是一连串的Filter, 然后又以一个独立的Filter的形式插入到Filter Chain里,其名为FilterChainP ...

  4. 转 Web用户的身份验证及WebApi权限验证流程的设计和实现

    前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个功能复杂的业务应用系统,通过角色授权来控制用户访问,本文通过Form认证,Mvc的Controller基类及Action的权 ...

  5. [置顶] Web用户的身份验证及WebApi权限验证流程的设计和实现 (不是Token驗證!!!不是Token驗證!!!都是基於用户身份的票据信息驗證!!!)

     转发 http://blog.csdn.net/besley/article/details/8516894 不是Token驗證!!!不是Token驗證!!!都是基於用户身份的票据信息驗證!!! [ ...

  6. Web用户的身份验证及WebApi权限验证流程的设计和实现 asp.net mvc AllowAnonymous 不起作用, asp.net mvc 匿名访问

    原文地址: https://blog.csdn.net/zjlovety/article/details/17095627 前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个 ...

  7. Kerberos身份验证流程

    介绍:Kerberos 是一种由 MIT(麻省理工大学)提出的一种网络身份验证协议.它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证. 在 Kerberos 认证中,最主要的问题是如何 ...

  8. ASP.NET Core Web API中带有刷新令牌的JWT身份验证流程

    ASP.NET Core Web API中带有刷新令牌的JWT身份验证流程 翻译自:地址 在今年年初,我整理了有关将JWT身份验证与ASP.NET Core Web API和Angular一起使用的详 ...

  9. 域渗透-Kerberos身份验证流程

    域渗透-Kerberos身份验证流程 Kerberos协议框架 在 Kerberos 协议中主要是有三个角色的存在: 1. 访问服务的 Client: 2. 提供服务的 Server: 3.KDC(K ...

随机推荐

  1. c#在字符串中计算加减乘除...

                DataTable dt = new DataTable();             Response.Write(dt.Compute("1+1*5", ...

  2. ng-app一些使用

    ng-app是angular的一个指令,代表一个angular应用(也叫模块).使用ng-app或ng-app=""来标记一个DOM结点,让框架会自动加载.也就是说,ng-app是 ...

  3. c#获取外网IP地址的方法

    1.如果你是通过路由上网的,可以通过访问ip138之类的地址来获取外网IP 2.如果是通过PPPOE拨号上网的,可以使用以下代码获取IP //获取宽带连接(PPPOE拨号)的IP地址,timeout超 ...

  4. 【krpano】krpano xml资源解密(破解)软件说明与下载(v1.4)

    欢迎加入qq群551278936讨论krpano技术以及获取最新软件.   该软件已经不再维护,现在已经被KRPano资源分析工具取代,详情参见 http://www.cnblogs.com/reac ...

  5. 修改jetty的默认端口号

    jetty默认端口是8080,修改端口号也很简单,首先进入到jetty服务器安装目录下会看到start.ini配置文件,这里就是jetty启动时加载的配置,其中包括要加载的模块,超时时间配置还有这里的 ...

  6. DIV+CSS布局

    宽度自适应两列布局 <!DOCTYPE html> <html> <head> <meta charset="gbk"> <t ...

  7. MMAP和DIRECT IO区别

    看完此文,题目不言自明.转自 http://blog.chinaunix.net/uid-27105712-id-3270102.html 在Linux 开发中,有几个关系到性能的东西,技术人员非常关 ...

  8. SQL中循环和条件语句

    .if语句使用示例: declare @a int begin print @a end else begin print 'no' end .while语句使用示例: declare @i int ...

  9. 解决UC浏览器或微信浏览器上flex兼容问题

    在UC浏览器上使用display:flex;时会不起作用,要加上兼容性写法,如下 display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */ disp ...

  10. WPF 变量绑定实现

    最近初学WPF,遇到如控件的内容是动态生成的.这时候就需要变量绑定. 简单写下变量绑定的步骤. 如下面的 例子,TextBlock 的内容是动态的,绑定变量StuName. <TextBlock ...