关于 API,我们先来了解一下 API 的基本概念,以下是来自 ChatGPT 的介绍:
API 是“应用程序编程接口”(Application Programming Interface)的缩写,它是一套预定义的函数、协议和工具,用于构建软件和应用程序。API 充当了不同软件间的中间人,使得开发者在创建新的程序或集成不同服务时,能够使用已有的功能而不必从头开始编写代码。
API 可以分为几种类型:
本地API:这些API是操作系统或软件库提供的,它们允许应用程序使用系统或库中的功能。
Web API:这些API通常通过网络提供服务。它们可以是基于REST、SOAP或GraphQL等技术。
硬件API:这些API提供了与硬件设备交互的接口,例如打印机、传感器等。
API 的关键组成部分包括:
端点(Endpoints):API 的网络地址,通常是URL,客户端发送请求到这个地址以调用API。
方法(Methods):定义了客户端可以对API执行的操作类型,如GET(获取数据)、POST(提交数据)、PUT(更新数据)或DELETE(删除数据)。
请求(Requests):客户端向API发送的消息,包含了方法、端点、头信息(Headers)和有时的请求正文(Body)。
响应(Responses):API返回给客户端的消息,通常包含一个状态码(如200 OK表示成功)和响应数据。
API 的优点:
简化开发:API 让开发者能够快速集成和使用其他应用程序或服务的功能。
模块化:API 使得软件设计可以更加模块化,有助于代码的重用和维护。
时间节省:通过使用现成的API,开发者可以节省大量开发时间和成本。
创新促进:API 使得数据和服务可以被更广泛地使用,促进了新应用程序的创新和发展。
API 的使用需要注意安全性,因为它们可能会暴露敏感数据或成为攻击的入口点。因此,通常需要使用认证和授权机制来保护API,例如使用API密钥、OAuth协议等。此外,API的设计应遵循最佳实践,如限制访问速率、输入验证、输出编码等,以确保它们的安全和有效性。
在了解完 API 的基本概念之后,我们整理下关于 API 的几个关键部分:
1、API 接口地址,也就是 API 的路径,访问 API 接口,如果未做权限控制,那么就可能出现未授权访问漏洞,泄漏敏感信息,比如用户相关的账号、密码、邮箱、手机号、身份证号码等信息
2、API 参数,通过 API 参数可以切换想要查询的信息,比如默认只能看用户 A 的基本信息,通过切换参数的值来查看用户 B 的信息,即使存在权限控制,也有可能会存在越权访问的安全问题
关于 API 接口信息的收集,主要有三种方式:
1、通过爬虫抓取页面或者 js 代码中配置好的接口地址和参数,这种方式对于参数的提取相对比较困难
2、通过 API 管理系统的未授权访问,获取 API 接口,比如之前分享的 《swagger 接口未授权怎么玩儿》
3、通过暴力枚举的方式,发现真实存在的 API 接口,这种方式比较考验用于枚举的接口和参数字典,这也是本文的重点
那么,我们如何通过暴力枚举的方式,发现真实存在的接口呢?
想要完成这个工作,需要准备几个工具:
1、用于接口枚举的字典和工具
2、用户参数枚举的字典和工具
关于这些东西,网络上有非常多开源的项目,本文分享的工具和字典仅用作演示。
首先准备一个用户接口枚举的字典,字典内容如下:
/base/user/all
/userInfo/findByUserId
/user/list
/api/login/info
/vip/member
/sysUser/get
/sys/user/sysusers
接下来,安装部署好用于枚举的工具,wfuzz,项目地址:
https://github.com/xmendez/wfuzz
然后使用下面的命令来进行 fuzz,如图:
从结果上看,主要关注响应码是 200 的,我们看到有一个接口符合我们的条件,接下来组合网站地址进行访问,看看是否存在未授权访问的问题,访问如图:
这不发现了一个未授权接口访问的漏洞,可以提交平台获得赏金啦。
接下来我们来看一个接口枚举+参数枚举的案例,首先准备一个常见的参数名字典,如下:
id
userid
userId
name
user
第一步还是枚举接口,如图:
从结果中,我们获得一个存在的接口:
/userInfo/findByUserId
直接访问如图:
状态 200,但是没有数据返回,可能是缺少参数导致的,那么我们尝试暴力枚举一下参数:
从结果中发现,其中一个参数名的响应内容长度与其他的不同,我们尝试组合接口和参数:
/userInfo/findByUserId?userId=1
访问后如图:
发现是有数据返回的,说明参数正确。
针对 API 的安全漏洞,不仅仅是未授权访问和越权这类漏洞,还有可能存在 SQL 注入、文件上传、CSRF、CRLF 等各种漏洞,有了接口和参数,我们就可以测是各种漏洞类型,这种方式虽然比较暴力,且速度慢,但是对于一些没有任何功能的网站来说,不失为一种突破限制的技术。
后续我会将历史上我发现存在漏洞的接口进行统计分享至信安之路的知识星球,供大家直接使用,欢迎大家加入我们一起学习信息安全技术。