API(Application Programming Interface,应用程序编程接口)是一个允许不同软件应用程序之间进行通信和数据交换的接口。API定义了一组规则和协议,软件开发者可以使用这些规则和协议来访问操作系统、库、服务或其他应用程序的功能。
接口(Interface):
API提供了一组公开的方法和端点,供外部系统调用。
这些方法和端点通常通过URL、函数名或服务名称来表示。
请求和响应(Request and Response):
客户端向API发送请求,请求中包含所需的操作和相关数据。
服务器处理请求并返回响应,响应中包含操作结果和数据。
协议(Protocol):
API使用特定的协议来通信,常见的协议包括HTTP、HTTPS、FTP等。
例如,基于HTTP协议的API通过HTTP请求和响应进行通信。
数据格式(Data Format):
API请求和响应的数据通常以标准格式表示,常见的格式包括JSON、XML、CSV等。
JSON是最常用的数据格式,因为它轻量级且易于解析。
数据访问:
提供一种访问应用程序或服务中数据的方式。
例如,数据库API允许应用程序访问和操作数据库中的数据。
功能调用:
允许应用程序调用另一程序的功能或服务。
例如,支付API允许应用程序集成支付功能。
系统集成:
实现不同系统或服务之间的集成和互操作。
例如,社交媒体API允许应用程序发布内容到社交媒体平台。
Web API:
通过HTTP协议进行通信的API,常用于Web服务和应用程序。
例如,RESTful API、GraphQL API。
库和框架API:
提供特定编程语言或框架功能的API,供开发者在应用程序中使用。
例如,Java API、Python标准库。
操作系统API:
提供操作系统功能访问的API。
例如,Windows API、POSIX API。
远程API:
允许在网络上远程访问服务的API。
例如,SOAP API、XML-RPC API。
常用的Web API有:
API类型
描述
优点
适用场景
RESTful API
REST是一种软件架构风格,用于设计网络应用程序。RESTful是基于HTTP协议的遵循REST的API风格。使用标准HTTP方法操作资源,数据格式常为JSON或XML。
扩展性好、可维护性强
大多数Web服务和应用程序
GraphQL API
GraphQL是一种用于API的查询语言,由Facebook在2015年开源。GraphQL API是使用GraphQL查询语言和运行时构建的API。允许客户端指定所需数据的精确结构,通过**单个端点(URL)**处理复杂查询。
高灵活性、高效率
复杂查询、减少数据过多或不足的问题
gRPC API
gRPC是由Google开发的一个高性能、开源的远程过程调用(RPC)框架,使用HTTP/2进行通信,并通过Protocol Buffers(protobuf)进行数据序列化。gRPC API是使用gRPC框架构建的API。
低延迟、高吞吐量
需要高性能和高效通信的系统
JSON-RPC API
使用JSON格式进行编码的RPC协议,通过HTTP或WebSocket通信,支持双向通信。
轻量级、实时应用
简单、轻量级API,实时应用
SOAP API
SOAP(Simple Object Access Protocol,简单对象访问协议)是一种基于XML的协议,用于在网络上交换结构化信息。SOAP API是基于SOAP协议实现的API。
高级安全性、事务支持
企业级应用、需要高级功能的系统
OData API
OData(Open Data Protocol)是用于查询和更新数据的协议,基于REST架构,提供标准化的数据访问接口。OData API是使用此协议实现的API。
简化CRUD操作
企业数据集成和共享
HATEOAS API
HATEOAS(Hypermedia as the Engine of Application State)是一种RESTful API设计原则,HATEOAS的核心思想是通过超媒体(例如链接)将客户端引导到可以进行的下一步操作,而不是依赖于硬编码的URL或其他客户端。
增强自描述性和导航性
复杂系统的自发现和自适应
WebSub API
WebSub(以前称为 PubSubHubbub)是一种用于Web上实现实时通知和推送更新的协议。它基于发布/订阅(Pub/Sub)模式,使得发布者可以将更新推送到订阅者,而不需要订阅者不断轮询发布者获取更新。
低延迟通知
RSS/Atom feed的实时更新
Falcor API
Falcor 是一个用于构建高效数据获取和管理的 JavaScript 库,由 Netflix 开发。它提供了一种简化的数据访问模型,使客户端能够通过统一的 API 请求所需的数据,并处理复杂的数据获取逻辑。
高效数据传输、灵活查询
需要高效数据传输和灵活查询的应用
XML-RPC API
XML-RPC 是一种简单的远程过程调用(RPC)协议,它使用 XML 作为数据编码格式,通过 HTTP 协议进行通信。
简单、易于实现
需要与老旧系统或不同平台互操作的应用
WSDL API
WSDL(Web Services Description Language)是一种用于描述 Web 服务的标准格式。它基于 XML,定义了 Web 服务的接口,包括可用的方法、参数、返回值及其数据类型。
标准化描述和发现Web服务
企业级应用、需要标准化描述的系统
Web API 渗透测试
拦截数据包:Burp Suite等
构造API请求:Postman、Apifox、Apipost等
扫描工具:Owasp Zap、Awvs、Xray等
信息收集是 Web API 渗透测试的重要步骤,无论是黑盒测试还是白盒测试,都需要系统地收集相关信息。在白盒测试中,测试人员可以直接获取API文档和代码等详细信息。在黑盒测试中,测试人员无法直接获取API文档,代码等资源,只能从外部自行收集。以下是API信息收集的方法:
1. 目录扫描
大多数Web API位于网站/api/
、/v1/api/
、/v2/api/
等目录中,通过目录扫描可以发现
使用Burp Suite主动扫描和被动扫描也不错
使用Xray被动扫描也不错
2. 网络流量分析
有些系统的API和Web应用的端口是独立的,但是只要有交互通过分析流量就可以获取API接口,如Burp Proxy组件记录、浏览器开发者工具网络组件
有些API会写在经过混淆后的Javascript文件中,无法直接获取,可以使用此方法
3. 使用互联网资源
通过Github查询开源系统是否存在API及API目录和文档等
通过Google、Shodan、Censys、Fofa等搜索引擎搜索
收集到API接口信息后,可以分析API的目录结构、接口命名规则、参数命名规则、功能和业务逻辑等,根据这些信息可以进行接口枚举和参数枚举。
其实针对Web API的渗透测试和Web应用的渗透测试差不多,不过通常API的功能可能没有Web应用那么多,涉及的测试项较少:
测试项
测试方法
接口枚举
根据接口命名规则进行枚举,获取一些隐藏接口,如当前用户无权限或暂时未使用到的接口
参数枚举
根据参数命名规则可以枚举接口的隐藏参数或隐藏接口的参数
敏感信息泄露
响应中是否返回明文或Base64等可恢复明文的编码技术编码后的密码、密钥等
SQL注入
对参数进行SQL注入测试,手工测试或使用sqlmap等工具,通常盲注多一些
XSS
构造XSS Payload对参数进行测试,检查响应是否包含未过滤或未转义的XSS数据
命令注入
对参数进行命令注入测试,检查是否可以注入成功,通常无回显
SSRF
构造SSRF Payload对参数进行测试,检查是否存在SSRF漏洞
任意文件读取/下载
对文件内容读取或下载的接口进行测试,检查是否存在漏洞
任意文件上传
对文件上传功能进行测试,检查是否可以上传任意文件或绕过限制上传其它文件
路径穿越
对文件读取、下载、上传等功能的接口进行路径穿越测试,检查是否未可以造成路径穿越
XXE
对传递的数据为XML数据的API接口参数中注入XXE Payload,检查是否存在XXE漏洞
反序列化
对于Json类型API接口,构造畸形Json数据,检查响应是否包含fastjson等组件名称和版本信息,进一步检测是否存在反序列化漏洞
CRLF注入
查看参数是否被添加到HTTP响应中,构造包含CRLF的数据尝试注入HTTP响应头
错误信息泄露
通过在参数中插入特殊字符、访问不存在的API接口或构造畸形数据使服务端返回错误响应,查看报错信息中是否包含服务器代码信息、数据库连接信息、SQL语句、框架和组件信息或者敏感文件的路径等信息。
拒绝服务
构造超长字符串对Header或参数进行测试,检测服务器是否拒绝服务
用户名枚举
使用用户名密码登录失败是否提示“用户不存在”等信息
暴力破解
检查是否有锁定机制,或防重放机制,防止暴力破解
令牌伪造
检查令牌随机性,是否容易伪造,是否使用JWT弱密码等
令牌有效期过长
检查令牌是否长时间(超过2小时)有效
令牌重用
会话注销后,检查令牌是否仍然可以重复使用
MFA绕过
删除或修改多因素认证步骤中的部分数据包,检查是否可以绕过多因素认证
任意密码修改/重置
检查密码修改/重置机制的安全性,是否可以绕过认证修改/重置任意用户密码
未授权访问
删除令牌后,检查是否仍然可以访问需要授权的资源
不安全的直接对象引用 (IDOR)
通过直接引用对象 ID 来访问未授权的数据
业务流程跨越
绕过正常的业务流程,查看是否存在漏洞
越权
修改请求参数的用户ID或角色ID,检查是否可以越权访问其他用户信息或高权限资源
[实战案例]
根据响应状态或响应提示判断存在的接口和不存在的接口:
根据响应提示判断参数是否存在。如参数不存在时响应:
参数存在时响应:
用户名不存在时响应:
用户名存在时响应:
错误信息中包含物理路径、后端语言、CMS等信息:
参数添加到了响应头:
利用CRLF注入进行XSS攻击:
如果你是一个长期主义者,欢迎加入我的知识星球,我们一起往前走,每日都会更新,精细化运营,微信识别二维码付费即可加入,如不满意,72 小时内可在 App 内无条件自助退款