一、认识API
1. 什么是API
API(应用程序接口):是一种软件中介,它允许两个不相关的应用程序相互通信。它就像一座桥梁,从一个程序接收请求或消息,然后将其传递给另一个程序,翻译消息并根据 API 的程序设计执行协议。API 几乎存在于我们数字生活的各个方面,可以说是我们现代插件、数字接口和软件通信环境的隐藏支柱。它们将所有内容连接在一起,使软件系统协调一致地工作。
通俗的来说API就是A调用B中某个功能的接口,比如说我们自己搭建的网站有个上传图片的功能,我们要把图片上传到阿里云的云储存,就需要调用阿里云的云储存的API接口。如果还无法理解,更通俗的说法比如你的电脑需要连接移硬盘,移动硬盘用来连接电脑的那根线就是API。
2. 为什么使用API
当我们在开发功能的时候比如我们需要使用A程序的地图功能,如果我们要在程序上添加地图这个功能,需要写一大堆代码,但是有了API我们直接调用地图这个功能的函数,带来了很大的便利。
3. API造成的安全问题
当然带来便利的同时也带来了安全隐患:信息截获、篡改信息、信息泄露
详细的分类可以参考:OWASP API Security TOP 10 2023
4. 常见API特征
SOAP:WSDL
OpenApi:Swagger
RESTful:/v1/api
二、API利用
(一) 工具介绍
Postman(常用)
ReadyAPI
Burp插件APIKit
工具联动xray、burp等方法,虽然工具好但是不精确,所以手工也是不可缺的部分。
(二) 靶场实战练习
vAPi:GitHub - roottusk/vapi: vAPI is Vulnerable Adversely Programmed Interface which is Self-Hostable API that mimics OWASP API Top 10 scenarios through Exercises.
1. 靶场搭建
git clone https://github.com/roottusk/vapi.git
cd vapi/
docer-compose up -d
访问http://ip/vapi
Postman导入Collection
Collection:https://raw.githubusercontent.com/roottusk/vapi/master/postman/vAPI.postman_collection.json
设置hosts
2. vapi1
一共有三个接口:创建用户、查看用户、修改用户
创建用户
查看用户
user后面是用户id,还需要修改Authorization-Token的值为username:password编码成base64
修改用户
最开始的步骤修改Authorization-Token更改查看用户一样
漏洞点只要登录了凭证就可以查看所有用户
防护措施:完善权限校验
3. vapi2
两个接口:登录用户、获取用户信息
这关是爆破,不用burp抓包我们直接在Postman中复制到burp中
复制到burp的爆破模式中,使用Pitchfork模式
字典在vapi/Resources/API2_CredentialStuffing目录中
因为字典前面是邮箱后面是密码所以我们要设置一下burp爆破规则
邮箱设置把","以及后面的数据都删掉
密码设置取后面8位数字
爆破得到账号密码
刚刚爆破得到的响应的token值放入获取用户接口的Authorization-Token中得到flag
防护方法:添加登录验证码;限制账号、IP登录次数。
4. vapi3
在/bc/vapi/Resources/API3_APK目录下有个apk文件安装到虚拟机打开
输入靶场地址,不要再后面加上/
利用接口创建用户
用在Postman注册的用户登录
登录成功后找到这个数据包
发送请求得到flag,可以在登录的时候就开始抓包然后放包到这个请求在查看返回值就可以了
防护方法:返回数据时,统一使用特定的 Wrapper 包裹,进行数据过滤; 在 DAO 层中指定非 JSON 序列化属性; 使用特定数据传输类。
5. vapi4
一共三个接口:手机号登录、验证码、获取用户信息
这个验证码是一次性验证码我们可以直接爆破4位数的验证码
把key值放在获取用户信息的接口Authorization-Token中,得到flag
防护方法:限制OTP错误次数;增强OTP复杂度。
6. vapi5
有两个接口:创建用户、查询用户
先利用创建用户接口创建一个用户
利用查询用户接口查询用户
有个查询所有用户的接口为users,我们用这个普通用户的权限就可以查看所有用户
防护方法:完善权限校验机制
7. vapi6
两个接口:创建用户、查询用户
先创建用户
查询用户credit为0
重新创建用户把credit的值改为200
得到flag
防护方法:添加数据传输层;添加权限校验;抽离函数功能,指定修改字段。
8. vapi7
四个接口:创建用户、登录用户、获取Key值、退出登录
创建用户
登录
存在CORS漏洞,添加Origin随便输入值
防护方法:配置 CORS 添加 CSRF_TOKEN
9. vapi8
两个接口:登录用户、获取用户信息
登录用户地方存在sql注入利用万能账户登录成功
得到flag
防护方法:预处理;过滤特殊字符。
10. vapi9
一个接口(这是一个v2的接口):登录
爆破pin的值
爆破时发现返回的全是500,因为v2有放爆破机制的,我们更改为v1
改了v1后爆破得到为1655
防护方法:停用老版本 API; 将老版本 API 放入内网。
11. vapi10
直接发送就可以
(三) 工具利用检测
Post联动xray自动检测
开启xray被动监听
./xray.exe webscan --listen 127.0.0.1:1236
打开Postman的下游代理
Postman发包
跳转到这个页面点击run vapi
分别找到了第七关和第九关的漏洞
三、总结
API发现接口的方法:爆破、开放的接目录
如何测试:利用Postman工具(Postman工具是专门给开发人员测试功能的并不具备安全检测功能,所以需要联动其他检测工具进行批量检测),配合Postman手工检测,主要查看返回状态码为200的包,与burp联动插件自动检测。
API的检测主要是用手工检测而工具只能作为辅助。