越权漏洞检测工具 secscan-authcheck

越权漏洞检测工具 secscan-authcheck

越权漏洞概念

在安全测试中我们经常会遇到各类逻辑漏洞,而越权漏洞是逻辑漏洞中一种很常见的安全漏洞。在OWASP TOP10中,越权漏洞更是长期榜上有名,一方面是因为越权造成的危害一般都比较大,例如越权获取敏感信息、越权删除他人订单、越权添加管理账号等;另一方面,也是因为越权漏洞比较难以全面的检测。

越权漏洞的检测

我们知道,服务端接收的每个请求都会有它自己对应的一个身份,而这个身份会在请求中的某个地方进行一定的标识,例如cookie、token、jwt等。越权行为可以认为是用一种身份标识去请求获得非其拥有的权限,若生效,则说明该请求存在越权问题。

而目前,针对越权漏洞常见的检测方式大致如下:

  • 水平越权

通过更换请求中的某个ID之类的身份标识,从而使A账号获取(修改、删除等)B账号数据。

  • 垂直越权

使用低权限身份的账号,发送高权限账号才能有的请求,获得其高权限的操作。

  • 未授权访问

通过删除请求中的认证信息后重放该请求,依旧可以访问或者完成操作。

为了能够快速地进行越权漏洞检测,我们开发了一款半自动化的工具来辅助,下面介绍这款工具的设计思路。

设计思路

为了实现越权漏洞的检测,我们将整个越权漏洞的检测分为三个步骤:系统认证、流量获取、越权判断,通过尽可能地对这三步进行自动化以达到辅助检测越权漏洞的功能。

系统认证

目前各类系统认证实现的方式和协议都存在很大的差异,但是从安全测试的角度实现自动化系统认证还是有很多种方案的,常见的方案有:

  • 手动录入认证信息

在人工登陆待测系统后,直接获取认证后的认证信息,例如token等信息,然后将认证信息录入越权检测系统。

  • 手动登录

在安全测试前,通过在越权检测工具内模拟在待测站点的登陆界面登录,使用越权检测工具记录整个登录流程中的认证信息进行登录。

  • 自动登录

随着统一认证架构的普及,为自动登录提供了非常有利的条件。在中通内部几乎所有系统均使用统一认证进行安全接入,这时可以直接将越权检查工具接入统一认证体系就可以实现自动登录,另外在不同的认证体系中,对于应用间存在隔离的体系,还需要对其开放特定的支持跨应用的权限。而如果在缺少统一认证体系,每个系统的账号体系及登录流程都不同的环境中,想要实现自动登录需要为每个系统准备一套登录流程,在面对大量不同认证方式的系统时,就难以实现通用性。

流量获取

在未接入公司统一权限管理系统的时,想要获取系统的全部权限,通常的做法是对系统的全部功能进行验证然后获取功能验证的流量。而抓取功能验证的流量,通常有如下几种解决可选方案:

  • 使用无界面浏览器对站点进行动态的爬取

虽然从WEB2.0开始,前端框架的使用以及JS的混淆导致了主动爬取站点的复杂度增加了,但是可以使用无界面浏览器对站点进行动态的爬取,这个方案的具体实现思路可参考猪猪侠在先知白帽大会分享的WEB2.0启发式爬虫实战,详细可以见文末参考链接,这里就不再赘述了。

  • 通过流量网关,获取测试/生产中所有的流量

在有流量网关的情况下,可以直接从流量网关抓取流量。依赖于流量网关,对于需要测试的目标系统,可直接从流量网关中筛选出目标的请求即可。但是此方案存在一定的局限性,还是需要对系统的全部功能进行触发,若获取到的请求数量不足,就难以覆盖到整个系统。

  • 通过代理或插件等形式,被动的获取流量

通过在测试人员的浏览器中安装插件并配置好测试系统相关信息后,在测试人员手动点击待测功能,就可以通过插件或代理服务器等方式收集到待测流量。中通的分布式被动扫描系统就是基于此方式实现流量的抓取,详细介绍可以查看中通安全文章分享中通分布式被动安全扫描实践

越权判断

无论是垂直越权还是水平越权,我们想要的实际是以某个身份发送不属于该身份的请求。通过上述的第一步可以得到不同身份下的认证信息,第二步中得到该站点下待测的请求,但是还缺少这些请求与权限策略的对应关系。在这一步里,根据请求抓取方式的不同,可以考虑不同的判断依据:

  • 使用无界面浏览器对站点进行动态的爬取

对于垂直越权,若可以成功抓取到请求,只需要再对不同身份下的请求做个减法便可以得到不属于该身份的请求。但是对于一些公共接口还是需要通过手动判断或者通过关键字白名单的方式进行过滤。

对于水平越权,相对于垂直越权来说较难以判断。对于一些简单的站点可以根据表单中的禁止编辑属性以及隐藏表单等属性来得到判断依据,但是对于复杂的前端框架,还未找到比较好的方法,如果有较好的方法还希望可以分享和指教。

  • 通过流量网关,获取测试/生产中所有的流量

通过流量网关获取到的流量只是单纯的流量,还需要对获取到每个请求进行进一步的处理后重放,例如修改认证信息等,通过对比重放前后的返回信息内容进行判断是否存在越权。

  • 通过代理或插件等形式,被动的获取流量

在此方案中,流量的来源就是在测试系统点击界面时交互所获取到的,所以可以直接通过测试人员的对返回信息的对比进行判断是否存在越权问题。

详细说明介绍查看如下文章
https://mp.weixin.qq.com/s/vwF7aTvk-U-SnJqO3f80gA

项目地址

GitHub github.com/ztosec/secscan-authcheck

越权检测工具使用

  • 启动服务
cd authcheck
docker-compose up -d
  • 启动示例站点
cd example
# 需要将 docker-compose.yml 中的 your-ip 替换为当前机器的ip,以便访问
docker-compose up -d

流量捕获

可通过burp插件、浏览器插件、代理服务器等方式向越权检测服务器传输流量

traffic文件中包含了burp插件和chrome扩展两个示例

①burp插件加载后,输入越权检测服务器的地址,在浏览器中打开任意页面登陆后,点击开始扫描即可

②chrome扩展加载后,输入越权检测服务器的地址,打开任意页面,登录即可

登录

目前工具内置的两个账号,如下:(默认端口8888)

  • 管理员admin: admin123
  • 普通用户normal: normal123

正式使用时可接入自己公司内部的认证体系,以便标识使用者身份

examples中带了两个示例站点(默认端口8000、8001)和一个sso认证站点(默认端口 7373)

  • 管理员admin: admin123
  • 普通用户normal: normal123

在使用时,如果发现登陆了examples中的站点会导致越权检测工具的登陆状态失效,可考虑使用隐私窗口打开待测站点

预配置

工具支持两种类型系统的检测,sso认证和手动录入认证信息,sso认证以examples下的站点作为演示,如果要适配自己公司内部的sso,可修改相关认证逻辑

录入账号

先录入一些账号信息以便自动登陆sso,这里简单的录入账号密码作为演示(若要录入空账号,可将用户名设置为 – )

工作空间

在测试前,需要为待测站点创建一个工作空间,创建后根据要测试的系统来选择不同的认证逻辑。对于接入统一认证的系统,只需要输入首页url后点击解析按钮,并选择要使用的账号即可

当然,自动认证的逻辑还是要自己实现,这里只是用examples中的站点做个示例对于一些不方便实现自动认证的系统,可以选择手动录入认证信息

越权漏洞检测

流程如下,burp插件/chrome扩展 会将流量实时发送至越权检测服务器中,测试人员可在流量明细界面实时监听

扫描的请求会对完全相同的请求进行去重,点击右上角的清空按钮后,可将工作空间内的流量清空,同时去重规则也会清空。如果需要再查看已被清空的流量的话,可选中左上角的“全量”按钮

测试中的可能存在问题的请求会高亮标识,选中左上角的”可疑“按钮,将会只查看可能存在的请求

上方的表单可以进行一定的筛选,筛选规则为 包含/不包含 ,若有多个,可以 | 进行分隔

每个请求包上都会有两个按钮,屏蔽和重放。点击屏蔽,可在上方的表单中添加对应的屏蔽规则,在重新查询或者监听时,不会再展示在屏蔽规则内的流量(只是不展示了,实际还存在的)。点击重放按钮,即可对该条请求进行重放,这在复测的时候比较好用

同时每次打开流量明细的窗口时,都会刷新对应工作空间的session信息(手动录入认证信息的工作空间不会刷新)

操作示意

开发指南

若系统没有接入统一认证或无法大批量实现自动认证,可直接部署好后,为每个工作空间手动录入认证信息

若可以实现待测系统的自动认证,可参考下面的内容来定制化工具

代码结构

authcheck/
├── app
│   ├── common
│   │   ├── decorators.py             # 装饰器
│   │   ├── func.py                   # 模板中用到的一些函数
│   │   ├── __init__.py
│   │   └── util.py                   # 辅助工具
│   ├── conf
│   │   ├── conf.py                   # 一些常规配置
│   │   ├── __init__.py
│   │   └── secret.py                 # 密钥、数据库等配置信息
│   ├── core
│   │   ├── flow.py                   # 站点解析
│   │   ├── identify                  # 不同系统类型的工作空间认证流程
│   │   │   ├── direct.py                 # 直接录入认证信息
│   │   │   ├── __init__.py
│   │   │   └── sso.py                    # 接入统一认证的系统(示例)
│   │   ├── __init__.py
│   │   ├── jobs.py                   # 定时任务
│   │   └── lib.py                    # 其他函数
│   ├── __init__.py
│   ├── model
│   │   ├── exception.py              # 异常类定义
│   │   ├── __init__.py
│   │   ├── model.py                  # 一些简单的model
│   │   └── po.py                     # 数据库model
│   ├── static
│   ├── templates
│   └── web
│       ├── api.py                    # 开放的api
│       ├── error.py                  # 异常处理
│       ├── __init__.py
│       ├── web.py                    # web页面
│       └── ws.py                     # 流量监听
├── docker-compose.yml
├── Dockerfile
├── favicon.ico
├── README.md
├── requirements.txt
├── uwsgi.ini
└── wsgi.py

主要改写流程

  • 确定自动认证的流程需要哪些信息,并在 app/model/po.py 中添加相应的模型
  • app/templates/ 下修改页面
  • app/lib/identify 下添加自己的认证流程,配置等

目前工具中放入了一个简单的自动认证sso的示例,可参考修改

下载地址:

①GitHub master.zip
②雨苁网盘 https://w.ddosi.workers.dev

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用 * 标注