声明:Tide安全团队原创文章,转载请声明出处!文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!
API接口安全
在日常的测试中,我们会经常看到一些接口文档或接口地址,在数字化时代,API成为了数据交互的核心,但同时也带来了安全问题,本文的思路在于总结一些api方面常见的攻击面。笔者在此方向也是一个小白,如有错误,还望各位反馈。
0x01 API分类
SOAP – WSDL soap是简单对象访问协议,用于分布式环境的基本信息交换的同行协议,描述传递信息的格式和规范,它可以用于连接web服务和客户端之间的接口,是一个可以在不同操作系统上运行的不同语言编写的程序之间的传输通信协议,格式为xml。
fofa探针:
?wsdl
像上图所示,即为soap接口文档,或一般后缀为.asmx,即可判断为soap接口,在.asml后添加?wsdl会以xml的形式显示当前接口文档所有信息。
OpenApi – Swagger OpenAPI是用来描述API的文档,该文档基于控制器中的xml注释以及实体类属性attribue特性,它是OpenAPI流程的核心。Swagger我们就比较常见了,Swagger是一套围绕OpenApi规范构建的开源工具,可以帮助设计、构建、记录和使用Open API。
fofa探针:
Swagger-UI
RESTful – /v1/api Rest 是web服务的一种架构风格,一种设计风格,是一种思想;同时Rest不是针对某一种编程语言的。
0x02 如何判断网站使用何种接口
wsdl
方法1:一般站点在传参时url为.asmx时,可能为wsdl接口
swagger
方法2:目录扫描,有以下类似格式的目录或文件代表可能存在swagger
/swagger
/api/swagger
/swagger/ui
/api/swagger/ui
/swagger-ui.html
/api/swagger-ui.html
/user/swagger-ui.html
/libs/swaggerui
/api/swaggerui
/swagger-resources/configuration/ui
/swagger-resources/configuration/security
0x03 工具测试API
wsdl 工具测试
这里我们选择New Security Test后选择API Definition输入我们所获得的wsdl url地址
下一步选择测试安全选项,可进行sql注入、xml测试等漏洞。
以下就开始了安全测试
swagger 工具测试
常见的测试工具有:https://github.com/lijiejie/swagger-exp https://github.com/jayus0821/swagger-hack 这里我习惯用的是swagger-hack,在启动后它会自动化爬取并测试所有swagger API接口。运行非常的简单,直接在命令行后输入swagger首页的url地址即可
python3 swagger-hack2.0.py -u http://x.x.x.x:8080/swagger/v1/swagger.json
ApiKit burp插件使用
APIKit是基于BurpSuite提供的JavaAPI开发的插件。APIKit可以主动/被动扫描发现应用泄露的API文档,并将API文档解析成BurpSuite中的数据包用于API安全测试。以下是APIKit所支持探测并扫描应用泄露的API分类
下载链接:
https://github.com/API-Security/APIKit
安装也非常的简单,在burp的Extensions中选择安装APIkit插件即可
安装成功之后,APIKit中有两个选项默认是没有被勾选的
这两个选项的意思分别是:
-
Auto request sending 对子API进行自动化鉴权测试,快速发现API未授权访问漏洞。 -
Send with cookie 开启Cookie,可以把包的Cookie存下来,生成请求的时候保留Cookie。在平时测试时,第一个Auto request sending 一定要慎重勾选,它会将爬取到的所有子API自动传参跑一遍,非常容易影响业务(吃牢饭)
安装好之后,就可以被动扫描应用泄露的API文档
这里可以看到它也自动给我们构造好了参数,我们可以直接放到Repeater中发包进行测试
0x04 手工测试API
以下是在进行API测试中常用的方法,
Method:请求方法
攻击方式:OPTIONS,PUT,MOVE,DELETE
效果:上传恶意文件,修改页面等
URL:唯一资源定位符
攻击方式:猜测,遍历,跳转
效果:未授权访问等
Params:请求参数
攻击方式:构造参数,修改参数,遍历,重发
效果:爆破,越权,未授权访问,突破业务逻辑等
Authorization:认证方式
攻击方式:身份伪造,身份篡改
效果:越权,未授权访问等
Headers:请求消息头
攻击方式:拦截数据包,改Hosts,改Referer,改Content-Type等
效果:绕过身份认证,绕过Referer验证,绕过类型验证,DDOS等
Body:消息体
攻击方式:SQL注入,XML注入,反序列化等
效果:提权,突破业务逻辑,未授权访问等
VAPI靶场搭建
靶场安装
#安装docker的前提下
git clone https://github.com/roottusk/vapi.git
cd vapi/
我这里是直接导入的靶场文件,下载之后,修改yaml文件 vAPI默认绑定主机80(HTTP)、3306(MySQL)、8001(PHPMyAdmin)端口
vim docker-compose.yml
修改好之后直接启动即可,访问IP呈现如此界面,代表安装成功
docker-compose up -d
Postman配置 vAPI 编写了专门的测试 Collection
https://raw.githubusercontent.com/roottusk/vapi/master/postman/vAPI.postman_collection.json
点击导入URl后配置HOST为靶机IP地址
随机测试正常返回包后,靶场搭建结束
水平越权
搭建好靶场之后,我们打开API1,就是越权漏洞靶场 测试时,与我们平时测试水平越权时的方法类似 打开Create user 创建用户–>传入用户名、姓名、课程、密码
Get User 这里很明显,就是获取当前用户信息,需要在 Headers 中设置 Authorization-Token,格式为base64_encode(username:password)。这里我们输入刚刚返回包中的6,所返回的就是我们刚刚创建的用户信息
漏洞利用点 在获取了对象数据时,只要传入任一有效的 Authorization-Token,即可获取所有用户信息。这里我们可以尝试将userid改为其他数字,来测试是否存在越权漏洞问题。
验证枚举
API4 缺少对资源和速率的限制。Mobile Login 手机登录,通过手机号登录,输入手机号,提示已将4位数的OTP发送到手机。OTP:One Time Password,又称一次性口令、一次性密码、动态密码、单次有效密码。
漏洞利用点:后台没有对访问访问速率与错误次数进行限制,可暴力破解4位OTP 将数据包复制到Burp的Intruder模块中
设置payload
开始枚举
爆破获得验证码,这里直接验证后获得key后在Get Details 认证参数中插入key请求,获得flag
垂直越权
功能权限认证缺陷。有些程序员为了方便,会将同样的业务抽离出两个不同的接口,以供不同的用户使用,比如所有用户访问/userinfo可以访问自己的用户信息,管理员访问/userinfolist可以查看所有用户信息,这样的好处是不必在一个接口中同时完成筛选查找和批量查找,但这样的两个接口同样需要进行管理员权限认证,否则便会产生越权漏洞。这里使用Create User创建一个普通用户,使用其账号密码所生成的base64放到Get User的认证参数中,请求Get User接口。
漏洞利用点 分离出的管理员用来查看所有用户数据的 /users 接口没有进行管理员权限校验,只需要创建普通用户,然后使用普通用户即可查看所有用户数据。
数据库注入
API8,可以看到该接口下没有用户创建接口了,只有一个User Login接口,与Get Secret登录后获取用户信息。
漏洞利用点 尝试使用SQL注入万能密码登陆后使用所获得key去访问/user/secret接口,获得flag
V1/2多版本
API9 只有一个接口,用于用户登录,可以看出需要传出username与4位数字的pin码。
漏洞点 尝试爆破,发现存在防爆破机制,当尝试次数过多则会返回500。
将 URL中的v2 改成v1,爆破老版本API,没有爆破机制,成功爆破pin 为1655,获得flag。
0x05 参考链接
https://xz.aliyun.com/t/11977?time__1311=Cq0xuDRD0D9GeGNPeeuG4RhGrQ3wGO%2BbD
https://blog.csdn.net/m0_52526329/article/details/132022540
往期推荐
E
N
D
原文始发于微信公众号(Tide安全团队):API接口安全测试Tips