API安全Top 10 漏洞:crAPI漏洞靶场与解题思路
2022-11-6 23:17:30 Author: www.freebuf.com(查看原文) 阅读量:17 收藏

0x00 前言

靶场简介

在 hack 中学习,不要去学习 hack

对于想了解 API 安全的同学,最直接的方式就是拿到一个靶场进行实战。正好,crAPI 项目就是 OWASP 推出的 API 安全项目,可以帮助大家了解常见的 API 安全漏洞。

本文将对 crAPI 靶场的相关漏洞以及打靶思路进行简单的介绍,希望对大家有所帮助。

靶场安装

首先,附上 crAPI 项目的 Giithub 地址:https://github.com/OWASP/crAPI。还有 OWASP API Security Project 可以参考:https://owasp.org/www-project-api-security/

安装靶场的话,可以使用多种方式,本文直接使用 docker 搭建(需要先安装 docker 以及 docker-compose) ,docker 启动命令如下:

docker-compose -f docker-compose.yml --compatibility up -d

安装完成,就可以开始研究漏洞了,大家打靶的时候可以参考官方给的提示:https://github.com/OWASP/crAPI/blob/develop/docs/challenges.md,下面就针对 crAPI 漏洞以及打靶思路进行介绍。

1667745815_6367c817222cf692a3b4d.png!small?1667745815681

0x01 Broken Object Level Authorization

失效的对象级别授权

挑战1:访问其它用户车辆的详细信息

1、首先找到泄露其它用户的车辆 id 的接口

在社区论坛处,可以获取所有评论者的详细信息

1667745847_6367c8379693a4eacde12.png!small?1667745848073

1667745864_6367c8482497ca3663a0f.png!small?1667745864758

2、车辆定位功能处,可以看到车辆位置信息信息

1667745906_6367c8726c3011222a9d8.png!small?1667745907068

3、更改车辆 id ,发现可以访问其它车辆的信息

1667745922_6367c882caeda99c2f652.png!small?1667745923432

挑战2:访问其它用户的机械报告

1、发送维修报告请求

1667745940_6367c8946d9c930c11b94.png!small?1667745940927

抓包分析,发现请求之后,会返回一个报告访问的地址

1667745958_6367c8a642031ac3a75a2.png!small?1667745960065

2、修改 report_id 可以查看其它用户提交的维修报告

1667745973_6367c8b5b719a31822de8.png!small?1667745974373

0x02 Broken User Authentication

失效的用户身份验证

挑战3:重置其它用户的密码

1、找到可以查看其它用户的 email 的接口

1667746002_6367c8d24a08850be236f.png!small?1667746003330

2、登录处可以重置密码

1667746024_6367c8e8092329bd51c74.png!small?1667746024509

抓包分析1667746041_6367c8f9d52b272d10d26.png!small?1667746042577

多重放几次,发现重放多次会有限制

1667746066_6367c912aa9448960a33a.png!small?1667746067344

3、此时将 v3 改为 v1或者 v2 试试,发现 v2 可以无限重放

使用 v2 提供的接口,可以爆破四位数的 otp

1667746086_6367c9269b08e5a7a39bb.png!small?1667746087229

4、爆破成功,即重置他人密码成功

1667746104_6367c9380705e3e016a94.png!small?1667746104645

0x03 Excessive Data Exposure

过多的数据暴露

挑战4:找到泄露其它用户敏感信息的API接口

1、敏感信息泄露接口

/community/api/v2/community/posts/recent

1667746127_6367c94f06800b7024ebc.png!small?1667746128031

挑战5:找到泄露视频内部属性的API接口

1、找到修改上传的视频名称的接口

/identity/api/v2/user/videos/30

1667746146_6367c96220f39a4c6851c.png!small?1667746147518

可以看到视频内部相关的属性。

0x04 Lack of Resources & Rate Limiting

资源缺乏和速率限制

挑战6:使用 “contact mechanic” 功能完成第7层DoS

1、 找到 contact mechanic 功能

1667746173_6367c97d1ee150331c334.png!small?1667746173609

2、尝试修改参数接口请求中的参数

将 repeat_request_if_failed 改为 true,将 number_of_repeats 改为较大的数字,重放,发现 DoS 攻击

1667746200_6367c99841588d7aacaed.png!small?1667746200886

、0x05 Broken Function Level Authorization

失效的功能级别授权

挑战7:删除另一个用户的视频

1、将 put 请求方式改为其它的,比如 delete

发现存在 DELETE 请求方式,但是该接口需要 admin 权限

1667746221_6367c9ad98e121c91410d.png!small?1667746222270

2、尝试将接口中的 user 改为 admin

利用 REST api 的可预测特性找到一个管理接口来删除视频

1667746236_6367c9bccbee7745a7060.png!small?1667746237940

3、尝试将 videos 后参数改为其它用户的视频id

1667746254_6367c9ce59d8f8bb7d4c3.png!small?1667746255495

发现可以删除其他用户的视频。

0x06 Mass Assignment

批量分配 / 大量赋值 / 自动绑定漏洞

将客户端提供的数据(例如 JSON )绑定到数据模型,而没有基于 allowlist 进行适当的属性过滤,通常会导致 Mass Assignment 。猜测对象属性、探索其他 API 端点、阅读文档或在请求有效负载中提供额外的对象属性,都允许攻击者修改他们不应该修改的对象属性。

挑战8:免费获得一件物品

1、增加订单功能接口

1667746274_6367c9e280785b902db8b.png!small?1667746275611

2、更改请求方式为 GET,并增加订单参数

1667746295_6367c9f7ed9f3e85ee704.png!small?1667746296574

3、将 GET 请求方式改为 PUT

发现可以请求成功,继续修改参数,发现可以修改数量和状态

1667746316_6367ca0c7eee4defac776.png!small?1667746317484

4、尝试修改 status 属性的值

1667746338_6367ca2237a5cee84c395.png!small?1667746339110

5、将 status 修改为 retured

其中'delivered'表示已收到货品,'return pending' 表示退货, 'returned' 表示已经退货,修改订单状态,直接将status 改为 returned 状态,发现此时自己的余额增加了,相当于免费购买了一件商品

1667746354_6367ca32ac9d4dce41f81.png!small?1667746355373

挑战9:将您的结余增加1000元或以上

1、修改订单中的数量为100,status改为 delivered

1667746375_6367ca47a6da35a1a8ccc.png!small?1667746376921

2、再修改 status 为 returned

1667746396_6367ca5c4b64eee587aae.png!small?1667746396954

3、此时发现金额已经发生变化,增加了 $1000

1667746416_6367ca704278fc5f1362c.png!small?1667746416747

挑战10:更新内部视频属性

1、在修改视频名称的时候,尝试增加其它的参数

发现可以修改 conversion_params的属性值

1667746431_6367ca7f818e2cee40221.png!small?1667746432205

0x07 SSRF

挑战11:让crAPI发送一个HTTP调用到“www.baidu.com”并返回HTTP响应

1、找到联系机械工的接口

将 mechanic_api 的值改为http://baidu.com,发现服务器会发起请求,并返回结果

1667746453_6367ca9582d6fcdbe9293.png!small?1667746454403

2、也可以使用 dnslog 验证

1667746471_6367caa7857bd2c83a7d9.png!small?1667746472779

3、查看 dnslog 结果

1667746516_6367cad460c3d9dfba619.png!small?1667746517228

0x08 NoSQl Injection

挑战12:想办法在不知道优惠券代码的情况下获得免费优惠券

1、找到验证优惠券的接口,使用 nosql 注入的语句尝试

尝试使用{"$ne":"xxxxxxxxxxxx"(备注:$ne表示不等于)

1667746535_6367cae72f63157b454ca.png!small?1667746535809

2、得到一个优惠券:TRAC075

0x09 SQL Injection

挑战13:通过修改数据库找到一种方法来兑换您已经认领的优惠券

由于本文使用的是 docker 搭建的,查看靶场的版本不是最新的,所以这个注入漏洞没有复现。在最新的源码中可以看到是存在 sql 注入的,此关就不做说明了。

最新版本源码存在 sql注入的代码:

1667746556_6367cafc711b614c625b6.png!small?1667746557006

0x0A Unauthenticated Access

未经身份验证的访问

挑战14:查找不为用户执行身份验证检查的接口

1、查看机械工报告的接口,不需要进行身份验证就可以直接访问

1667746575_6367cb0f55ebb0407de0b.png!small?1667746576001

0x0B two secret challenges

官方文档提到:“crAPI中还有两个秘密挑战,它们非常复杂,目前我们不分享它们的细节,只知道它们真的很酷。” 更多的漏洞,大家可以自行探索。

0x0C 其它漏洞

除了以上漏洞,其它漏洞大家也可以多去挖掘,这边附上几个漏洞,供大家参考

增加一个商品

1、获取商品列表接口

1667746597_6367cb25a288b556a1d50.png!small?1667746598313

2、尝试将 GET 请求方法改为 POST

发现需要传值,构造相应的参数之后,即可请求成功

1667746617_6367cb39776b2c296d53a.png!small?1667746618509

成功之后,就上传了一个商品

支付漏洞

1、查询余额

1667746631_6367cb47d9253d800c967.png!small?1667746632325

2、购买商品接口处,修改购买的数量,改为负数

1667746647_6367cb57867ffb7bda61a.png!small?1667746648188

3、发现金额增加了

1667746660_6367cb648932027e30168.png!small?1667746661049

JWT 密钥爆破

1、使用 JWT_Tool 对 jwt 进行爆破

得到密钥为 crapi

1667746679_6367cb77b471d66aed1a8.png!small?1667746680455

2、修改账号信息,使用爆破得到的密钥签名

1667746694_6367cb86577423971f28f.png!small?1667746694955

3、使用伪造的 token 进行访问,发现可以成功

1667746709_6367cb95c32dc9a388725.png!small?1667746710408

0x0D 结语

本文分享了 crAPI 靶场的相关漏洞以及解题思路,里面覆盖了大部分的 OWASP API top 10 的安全漏洞。其实,打靶的过程也是学习的过程,相信对 API 安全漏洞的研究会有一些帮助。


文章来源: https://www.freebuf.com/articles/web/348982.html
如有侵权请联系:admin#unsafe.sh