小工具      在线工具  汉语词典  css  js  c++  java

crAPI射击场学习记录

渗透测试,网络安全,漏洞,安全 额外说明

收录于:40天前

射击场设置

【射击场下载地址】(我fork了一份)

Docker安装,笔者使用的是wsl+docker。

[lab0:**初始帐户**]

  1. 1、注册账号,邮箱地址为【[email protected]】,密码为Admin@123

图片

  1. 1、登录后,访问对应IP的8025端口,接收邮件,获取车辆信息。

图片

图片

[lab1:**访问其他用户的车辆详细信息**]

登录后,首先找到泄露其他用户车辆ID的接口。进入论坛首页,点击一篇论坛文章,发现此时的网址为:

图片

于是我试着把包裹拿起来看看能退回什么。可以看到返回了用户的隐私信息:

图片

我们进一步猜测一下,尝试直接抓取论坛主页:

图片

这里我们获取demo用户的vehicleid信息

  1. 1、查看车辆信息,现在我们只有Dashboard页面有车辆信息。我们试图捕获此页面。抓取主页后,我们发现应该根据我们当前用户的cookie返回它。我们再看看其他地方:

图片

图片

我们将其替换为演示用户的vehicleid信息54e7994a-e14e-4ee6-a46d-235ca3fd0eed

图片

[lab2:**访问其他用户的机械报告**]

图片

图片

提交的Json数据中发现危险数据:

图片

[lab3:**重置其他用户的密码**]

注销,点击忘记密码,输入<[email protected],点击发送OTP,后台查看验证码只有四位,准备爆吧

图片

填写表单,修改密码为Admin@456,并提交抓包查看:

图片

多提交几次,看看是否有爆破限制:

图片

由于这是一个API射击场,让我们尝试更改API版本:

图片

要开始爆破,只需选择狙击模式,导入我们的字典从0到9999并开始爆破:

图片

可以看到已经无法再使用原密码登录了:

图片

[lab4: 查找那些泄露其他用户敏感信息的人API**接口 **]

lab1的论坛页面信息泄露

[lab5: 找到了泄露视频内部属性的人API**接口 **]

我感觉这个界面没什么用。

图片

在上传视频选项弹出之前我懒得按这个按钮,所以我选择修改前端,删除隐藏部分:

图片

图片

图片

lab6: 使用 "contact mechanic"功能完成7[DoS]

图片

图片

提交的Json数据中发现危险数据:

我们尝试修改并重新提交:

图片

[lab7:**删除其他用户的视频**]

这个API危害很大

依然是lab5的抓包。让我们修改协议并将 PUT 更改为 OPTIONS。

HTTP中的OPTIONS方法是一种请求方法,用于获取目标资源支持的HTTP方法列表。它允许客户端向服务器查询特定资源支持的请求方法,以确定可以对该资源执行哪些操作,而无需实际发送请求。

OPTIONS 请求的主要用途包括:

  1. 1. CORS(跨域资源共享):在进行跨域请求时,浏览器会首先发送一个OPTIONS请求,以确定服务器是否允许发送实际的跨域请求。服务器可以通过返回特定的响应头来响应,例如Access-Control- Allow-Methods) 来指示允许的请求方法。

  2. 2、服务器功能查询:客户端可以使用OPTIONS请求向服务器查询特定资源支持的HTTP方法列表。这对于动态确定可以执行哪些操作非常有用,允许根据服务器返回的允许方法列表自适应地构造请求。

  3. 3. API文档和发现:OPTIONS方法还可以用于提供API文档和服务发现功能。通过在 OPTIONS 响应中包含有关资源的元数据,例如支持的方法、请求头和其他信息,客户端可以获得有关 API 的更多信息,以便能够正确使用和调用 API。

  4. 4. GET:用于从服务器获取资源。客户端发送 GET 请求以获取指定 URI 处的资源。 GET 请求是幂等的,即多次发送相同的 GET 请求应返回相同的响应。

  5. 5、POST:用于向服务器提交数据、创建新资源或触发服务器处理操作。 POST请求将数据作为请求体发送到服务器,通常用于提交表单数据、上传文件等。

  6. 6. PUT:用于向服务器更新或替换资源。 PUT 请求将请求正文中的数据保存到服务器上指定的 URI 位置。如果URI不存在,则可以创建新资源;如果 URI 已存在,则将其替换为请求的内容。

  7. 7. DELETE:用于删除服务器上的资源。 DELETE请求用于删除指定URI的资源。

  8. 8. OPTIONS:用于获取目标资源支持的HTTP方法列表。 OPTIONS 请求允许客户端查询服务器支持的特定资源的请求方法,以确定可以对该资源执行哪些操作。

  9. 9. HEAD:与GET方法类似,但不返回响应体,只返回响应头。 HEAD 请求用于获取有关资源的元数据,例如响应标头中的信息,而不传输整个响应正文。

  10. 10. PATCH:用于部分更新服务器上的资源。 PATCH 请求仅部分修改资源,而不是替换整个资源。

除了上述方法之外,HTTP/1.1规范还定义了一些其他的请求方法,例如:

TRACE:用于对请求的往返路径进行跟踪。它通常用于诊断和调试,以确定请求如何通过代理服务器和中间节点。

CONNECT:用于与目标主机建立隧道连接,通常用于通过代理服务器建立安全的HTTPS连接。

图片

权限不足说明需要使用admin身份:

图片

图片

随后,任何视频都可以通过修改videos/后的ID来删除

[lab8:**免费获得一件物品**]

图片

点击后抓包:

图片

修改请求方式为GET:

图片

我们可以敏锐地观察到,返回的Json数据中有一个状态数据,它清楚地表明了已经订购的信息。返回购买界面,我们看到有一个返回按钮。我们点击它并抓包可以看到:

图片

图片

直接切换到 GET 请求会显示我们无权使用它的消息。不要恐慌。我们先尝试退回产品,然后再按照之前的方式使用。

查看order_id,发现状态确实发生了变化。

图片

这里我们大胆猜测返回的状态是返回的,并尝试修改。注意,由于status是原始数据,所以这里我们需要使用PUT协议来提交,而不是POST协议:

PUT 和 POST 是用于向服务器提交数据的 HTTP 请求方法。它们在语义和使用场景上有以下区别:

  1. 1、用途:POST用于向服务器提交数据,请求服务器处理数据。通常用于创建新资源、提交表单数据、发送评论等。PUT用于向服务器更新或替换指定URI的资源。如果URI不存在,则可以创建新资源;如果 URI 已存在,则将其替换为请求的内容。

  2. 2.幂等性:POST请求不是幂等的,即多次发送相同的POST请求可能会产生不同的结果。每次发送 POST 请求时,服务器可能会创建新资源、执行不同的操作或返回不同的响应。 PUT 请求是幂等的,即多次发送相同的 PUT 请求应产生相同的结果。每次发送 PUT 请求时,服务器都应该将请求的内容保存在指定的 URI 位置,因此多个请求会更新或替换同一资源。

  3. 3.数据位置:POST请求将数据包含在请求体中并发送给服务器。数据的格式可以是表单数据、JSON、XML 等。PUT 请求还在请求正文中包含数据,但它通常用于指定 URI 位置并将请求的内容保存在该位置的资源。

  4. 4、资源标识:POST请求通常由服务器确定资源的标识,并返回新资源的标识符(如生成的ID)。

PUT 请求通常由客户端指定资源的标识,即 URI 中的位置。

总之,POST 用于提交数据进行处理,通常用于创建新资源或执行操作,而 PUT 用于更新或替换指定 URI 处的资源。 POST 请求不是幂等的,而 PUT 请求是幂等的。根据具体的应用场景和资源操作需求,选择合适的数据提交和资源更新请求方式。

从返回的数据中我们可以看到修改成功了,也就是说我们有4张空椅子。

图片

图片

[lab9:增加您的余额1000**元或以上 **]

同样,使用上面的API,因为我们发现数据不仅可以提交状态,还可以提交数量。

首先将数量改为100,状态改为已发货,这样我们就可以不花一分钱订购100把价值10元的椅子。

图片

然后将状态更改为已退回,就可以拿回钱了! ! ! -

图片

[lab10:**更新内部视频属性**]

通过lab5的抓包,我们可以看到返回的Json数据如下:

所以如果我们需要改变它,只需使用PUT协议并在请求的Json数据中指定即可。

图片

lab11: crAPI寄一个HTTP拨电至"www.ba idu.com" 并返回 HTTP回复

与lab2接口和数据包捕获相同。抓包后,我们在请求信息中找到了关键信息:

为了验证这个猜想,我们通过DNSlog来验证,使用工具:[https://dig.pm/]

DNSlog是一种收集和分析DNS查询日志的技术和工具。在网络通信中,DNS(域名系统)用于将域名解析为相应的IP地址。 DNSlog通过设置恶意DNS服务器或域名拦截应用程序或系统发出的DNS查询请求,并将查询信息记录到日志中。

DNSlog注入是由于应用程序对DNS查询结果处理不当而导致的安全漏洞。当应用程序通过 DNS 查询获取动态资源而没有对返回的 DNS 响应进行充分验证和过滤时,通常会发生这种情况。攻击者可以构造恶意的DNS查询请求,并将恶意内容注入到应用程序的响应中,以达到攻击的目的。

图片

复制子域名并添加http://并替换mechanical_api的值

图片

lab12: 想办法在不知道优惠券代码的情况下获得【获取免费优惠券】

首先找到输出优惠码的接口,抓包查看数据:

图片

我查看了文档,发现测试的重点是NoSQL Injection。之前学习的是基于MySQL的SQL注入。这是给我的 NoSQL 指南。我先来学习一下NoSQL的基础知识:

NoSQL注入(NoSQL Injection)是一种针对使用NoSQL数据库的应用程序的攻击技术,类似于传统的SQL注入攻击。 NoSQL 注入利用应用程序对用户输入数据的错误处理来执行未经授权的操作或绕过访问控制。

NoSQL数据库与传统关系数据库的不同之处在于,它们的查询语言和数据存储机制也不同。然而,一些NoSQL数据库仍然需要处理用户提供的数据,例如查询参数、过滤条件等。如果应用程序没有正确验证和过滤这些用户输入数据,则可能存在NoSQL注入漏洞。

NoSQL注入攻击的原理是,攻击者将恶意数据注入到应用程序发送到NoSQL数据库的查询中,以干扰查询逻辑。攻击者可以使用以下方法进行注入攻击:

  1. 1.注入查询语句:攻击者通过在查询中注入恶意运算符、查询语句或特殊字符来修改查询逻辑、获取敏感数据或执行未经授权的操作。

  2. 2.绕过访问控制:攻击者可以通过注入特定的查询条件来绕过应用程序的访问控制机制,获取未经授权的数据或执行特权操作。

  3. 3、盲注入:在某些情况下,应用程序可能不会直接将查询结果返回给用户,而是根据查询结果进行后续操作。攻击者可以注入特定的查询条件并观察应用程序行为的差异,以推断查询结果或执行特定操作。

NoSQL(Not Only SQL)是一种非关系型数据库,对应传统的关系型数据库(如MySQL、Oracle)。 NoSQL数据库设计的初衷是为了解决关系数据库在大规模数据存储和高并发访问方面的局限性。

NoSQL数据库使用不同的数据模型和存储机制来满足特定的应用需求。与使用表格结构和 SQL 查询语言的传统关系数据库不同,NoSQL 数据库通常使用以下数据模型之一:

  1. 1.键值存储:使用简单的键值对结构来存储数据,并通过唯一键访问数据。例如,Redis、DynamoDB。

  2. 2.文档存储:以类似于JSON或XML的文档格式存储数据,每个文档都有唯一的标识符。例如,MongoDB、CouchDB。

  3. 3. 列族存储:将数据组织成列族,每个列族包含不同的列和行。例如HBase、Cassandra。

  4. 4.图数据库:用于处理图结构数据,其中节点和边代表实体及其之间的关系。例如,Neo4j、JanusGraph。

NoSQL数据库具有以下特点和优势:

可扩展性:NoSQL数据库一般具有良好的水平扩展性,可以轻松处理大规模数据和高并发访问。

灵活的数据模型:NoSQL数据库提供了灵活的数据模型,可以适应不同类型和结构的数据,无需预先定义严格的表结构。

高性能:NoSQL数据库由于去除了复杂的关系模型和复杂的查询语言,可以获得更高的读写性能。

弱一致性:一些NoSQL数据库采用弱一致性模型,允许不同节点之间的数据存在一定的延迟和不一致,以提高性能和可用性。

分布式架构:NoSQL数据库通常用于分布式环境,数据可以在多个节点上分布和复制,提供高可用性和容错能力。

我们这里使用了两个数据库软件,Postgresdb和Mongodb,可以通过我们之前响应信息的Json格式来判断。但这里的Postgresdb(通常简称为Postgres)是一个开源关系数据库管理系统(RDBMS),而不是NoSQL数据库。

检查docker日志后,很奇怪我没有使用这个db。也许我们的模块还没有使用它。

图片

因此,我们只需要对Mongodb进行NoSQL注入即可。原始Json提交数据为:

这意味着MongoDB将在集合中搜索满足查询条件的文档,并返回结果集中包含“coupon_code”字段值为“1234”的文档。

图片

在学习了最基本的NoSQL注入语句和Mongodb数据的结构后,我构造了payload:

1 {"coupon_code": {"$ne": "hacked by c2yb8er"}}

该查询条件的含义是查找“coupon_code”字段值不等于被c2yb8er hacked的文档。

$ne 运算符表示不等于

NoSQL学习link

lab13: 通过修改数据库找到一种方法来兑换已经领取的优惠券

我有点困惑。实战中找不到这种文档怎么办?

查看文档,找到一个接口 /workshop/api/shop/apply_coupon

图片

图片-20230911150106024

我很困惑,明明用的是Mongodb,为什么不应该是NoSQL注入呢? MySQL中为什么会有字符注入?查一下对应的代码,真相就大白了!

class ApplyCouponView(APIView): 
"""
Apply Coupon View to increase the available credit
"""
    @jwt_auth_required
    def post(self, request, user=None):
    """
    api for checking if coupon is already claimed
    if claimed before: returns an error message else: increases the user credit
    :param request: http request for the view
    method allowed: POST
    http request should be authorised by the jwt token of the user
    :param user: User object of the requesting user
    :returns Response object with
    message and 200 status if no error message and corresponding status if error
    """
           coupon_request_body = request.data
        serializer = CouponSerializer(data=coupon_request_body) if not serializer.is_valid():
log_error(request.path, request.data, 400, serializer.errors) return Response(serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
        with connection.cursor() as cursor:
            cursor.execute("SELECT coupon_code from applied_coupon WHERE user_id = "\
                + str(user.id)\
                + " AND coupon_code = '"\
                + coupon_request_body['coupon_code']\
                + "'")
                row = cursor.fetchall()

                if row and row != None: return Response(
                {
                'message': row[0][0] + " " + messages.COUPON_ALREADY_APPLIED,
                },
                status=status.HTTP_400_BAD_REQUEST
                )

                try:
                coupon = Coupon.objects.using('mongodb').get(coupon_code=coupon_request_body['coupon_cod  e'])
                except ObjectDoesNotExist as e:
                log_error(request.path, request.data, 400, e) return Response(
                {'message': messages.COUPON_NOT_FOUND},
                status=status.HTTP_400_BAD_REQUEST
                )

                AppliedCoupon.objects.create( user=user,
                coupon_code=coupon_request_body['coupon_code']
                )
                user_details = UserDetails.objects.get(user=user) user_details.available_credit += coupon_request_body['amount'] user_details.save()
                return Response({
                'credit': user_details.available_credit, 'message': messages.COUPON_APPLIED
                }, status=status.HTTP_200_OK)

注入点是这段代码:

with connection.cursor() as cursor:
    cursor.execute("SELECT coupon_code from applied_coupon WHERE user_id = "\
        + str(user.id)\
       + " AND coupon_code = '"\
        + coupon_request_body['coupon_code']\
        + "'")

当我传入以下数据时:

 {
"coupon_code":"1'or '1'='1",
"amount":1
}

这里执行的SQL语句会变成这样:

SELECT coupon_code from applied_coupon WHERE user_id = 'My_id' AND coupon_code = '1'or '1'='1'

案子破了!我以为刚刚学的NoSQL注入白费了! -

[lab14:**查找不对用户执行身份验证检查的接口**]

与lab3中的/workshop/api/mechanic/mechanic_report?report_id=6相同

与 lab8 中的 /workshop/api/shop/orders/1 相同

[lab15:发现伪造品有效 JWT **令牌的方法 **]

【JWT算法混乱漏洞】

[检查文档]:Auth0 为每个租户公开一个 JWKS 端点,可以在以下位置找到:

https://{yourDomain}/.well-known/jwks.json 。此端点将包含用于验证该租户的所有 Auth0 颁发的 JWT 的 JWK。

通过访问 http://localhost:8888/.well-known/jwks.json 获取 JWT 公钥

图片

进入JWT选项卡,点击新建RSA密钥并复制JWK密钥内容

图片

图片

然后右键单击我们新的 Key Copy Public Key 作为 Pem

图片

转到“解码器”选项卡以 Base64 编码此 PEM 密钥并复制生成的字符串

图片

再次返回Burp主选项卡栏中的JWT Editor Keys选项卡,单击New Symmetric Key然后Generate,将生成的k属性值替换为PEM Base64编码。

图片

然后就可以在burp请求中找到json web token选项卡,同时在选择卡的左下角还可以看到json web token的攻击选项。

图片

【无效签名漏洞】

我们在访问Dashboard时抓包,进入Repeater中的JSON Web Token页面:

图片

图片

首先我们尝试将Payload中的sub修改为其他账户:成功访问其他用户的信息:

其实就是通过修改下图红框内的内容来验证的:

图片

现在我们更改Header中的算法将其禁用,在Attack中点击“none”Signing Algorithm,发现我们的验证字段值在发送包后发生了明显的变化:

图片

图片

但这只是一个特殊的接口漏洞。在该接口中,JWT可以通过这种方式破解进行未授权访问,但其他接口则不能:

图片

[AddLab1:**添加产品**]

首页商店抓包:

图片

查看相应的信息,发现也支持POST协议。尝试将 GET 更改为 POST:

图片

提示缺少三个参数。让我们尝试添加它们:

图片

图片

添加成功!

[AddLab2:**支付漏洞**]

使用lab8抓包,修改数量为负数:

图片

图片

[总结]

通过这次靶场学习,让我对以前认为比较抽象的API安全有了更深入的了解。同时,它还支持

对GET\POST\PUT\DELETE\OPTIONS等协议有了更深入的了解。

同时,在实验室分析一些题目时,学习了NoSQL注入方法,对Mongodb等非关系型数据库有了基本的了解。同时,我改进了Burp Suite的操作。

唯一的缺点是我对JWT相关知识不是很熟悉,在靶场射击后对这个东西的使用也不太了解。这是我以后需要进一步研究的。

总的来说,如果你认真对待这个靶场,相信你会对API安全有不一样的认识!

. . .

相关推荐

额外说明

apollo 将一个命名空间内容加载到内存并监控配置变更

背景 业务中有这样一种场景:   在项目启动时把apollo某一个命名空间所有的配置读取到内存,并且监控配置的变化操作,再根据对页面配置的增修改来操作内存对象,后续程序再用到这个内存对象。 我这里的对象是中英文切换使用的翻译对象 配置 # apollo

额外说明

UE5——网络——属性复制

当属性被注册进行复制后,您将无法再取消注册(涉及到生存期这一话题)。之所以会这样,是因为我们要预制尽可能多的信息,以便针对同一组属性将某一工作分担给多个连接。这样可以节省大量的计算时间。 virtual void GetLifetimeReplicat

额外说明

[Eigen中文文档] 概述(总目录)

概述 英文原文链接 这是 Eigen3 的API文档,你可以下载它以便于离线阅读。 以下是该中文文档目录,分为四部分: 入门 对于第一次接触Eigen,学习Eigen最好的方法就是阅读该文档,这可以让你学会如何使用Eigen编写你的代码。 然后,快速参考

额外说明

spring boot中使用generator插件自动生成代码

#使用方法:使用generator插件可以帮助我们生成model,mapper等文件,因而简化开发流程,加快开发速度,以下是使用方法: ##在pom.xml中添加插件 <! - 代码自动生成插件 - > <! - 使用完必须注释掉下面这个插件

额外说明

HTTP报错序号以及对应错误原因最全总结(1XX、2XX、3XX、4XX、5XX)

跑程序的时候总会在前台看到各种各样的报错,每次遇到不一样的报错号码又要去查,今天打算总结一下,当然还是主要借鉴了cutbug的博客:HTTP Response Status Code – HTTP响应代码中文详解,毕竟我暂时遇到的错误还是比较少的,不足以

额外说明

C++虚析构函数

#include <iostream> using namespace std; // 多态成立的三个条件: // 1,,要有继承 // 2,要有函数重写(C++语言指的是虚函数重写) // 3,要有基类指针(基类引用)指向派生类对象 或 要有父类指针

额外说明

Windows下安装Redis

Redis本身不支持Windows系统,一般都是安装在Linux使用。 但微软的技术人员做了技术支持让我们得以在Windows上使用Redis。 二.Windows安装及使用Redis github源码地址:https://github.com/micr

额外说明

(Java)十进制转化为二进制

package test; //辗转相除法来做 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; /** * 十进制

额外说明

Linux命令(三)touch命令与rm命令

本篇文章主要介绍Linux命令行下如何对文件进行创建和删除操作。 一、touch命令。 touch命令有两个功能:一是创建新的空文件,二是改变已有文件的时间戳属性。 具体命令如下:touch 文件名 具体说明: 如果一次想创建多个文件,则每个文件名用空格

额外说明

详解python取按某个维度取最大值 & torch.max(X,dim=1),torch.mean(X,dim=1)

torch.max(X,dim=1)是对行取最大值 dim=1,表面上感觉时对列取最大值,测试一下: X = torch.tensor([[1.0, 1.0], [-1.0, -1.0]]) result,indice

ads via 小工具