yaklab-逻辑漏洞


一、会话固定漏洞

会话固定漏洞是指网站或应用程序在用户登录时分配的会话标识符(Session ID)是固定不变的,而不是在每次会话中都重新生成。攻击者可以利用这个固定的会话标识符,轻松地接管用户的会话,执行未经授权的操作,甚至冒充合法用户。

靶场链接:https://yaklang.com/Yaklab/vulinbox/mall/01unsafe-sessionid

1.1 示例代码

// 登陆功能
{
    // 省略部分信息
    Handler: func(writer http.ResponseWriter, request *http.Request) {
        // 省略部分逻辑
        // 假设验证通过,返回登录成功消息
        response := struct {
            Id      uint   `json:"id"`
            Success bool   `json:"success"`
            Message string `json:"message"`
        }{
            Id:      user.ID,
            Success: true,
            Message: "Login successful",
        }
        var sessionID = "fixedSessionID"
        // 设置固定的会话标识符
        http.SetCookie(writer, &http.Cookie{
            Name:    "sessionID",
            Value:   sessionID,
            Path:    "/",
            Expires: time.Now().Add(15 * time.Minute),
        })
        // 返回登录成功信息
        writer.Header().Set("Content-Type", "application/json")
        err = json.NewEncoder(writer).Encode(response)
        if err != nil {
            writer.WriteHeader(http.StatusInternalServerError)
            return
        }
        writer.WriteHeader(http.StatusOK)
        return
    },
    RiskDetected: true,
},

1.2 攻击示例

攻击者可以利用固定的会话标识符,在不知晓用户密码的情况下直接将固定的会话ID注入到请求中,绕过登录验证,获取用户的登录状态和权限。攻击者可以在不登录的情况下访问用户的个人信息、执行关键操作,或者冒充用户进行各种恶意操作。

  • 模拟admin用户正常登录

访问首页点击登录,模拟admin用户登录,admin/admin。

登录成功后会跳转到admin用户个人主页。

http://127.0.0.1:8787/mall/user/profile?id=1

可以查看我的订单等信息:

网站为用户设置了cookie,其中sessionID字段是用户的会话ID,如果这个会话ID每次设置是固定的(或者是永久有效的),那么其他任何拿到这个固定会话ID的用户,在不知道admin的密码的情况下都可以登录admin的账户。

  • 攻击者利用获取泄漏的sessionID之后登录网站

初始状态下攻击者不用登录任何账号。

攻击者添加窃取到的SessionID:

成功访问访问到admin用户主页:

注意:直接带着cookie访问mall/shop/index是不行的。因为cookie中的sessionID是针对用户的。

此外网站还存在水平越权漏洞,可以看到id=2,root用户下的个人信息。

1.3 防御措施

1.随机生成会话标识符: 在用户登录成功后,应该使用随机生成的会话标识符,并在每次会话中更新会话标识符,而不是使用固定的会话标识符。

2.设置安全的 Cookie 属性: 在设置 Cookie 时,应该使用 HttpOnlySecure 属性,使得 Cookie 只能通过 HTTP 请求访问(防止通过xss漏洞获取cookie),以及仅在使用 HTTPS 连接时才能传输(防止cookie明文传输被窃取)。

3.定期更新会话标识符: 应该定期更新会话标识符,例如在用户登录后、密码修改后、用户权限变更后等关键操作之后更新会话标识符,以降低攻击者获取固定会话标识符的机会。

4.加强会话管理: 对于敏感操作,应该实施额外的会话管理措施,如双因素认证、会话超时机制等,以提高系统的安全性。

通过以上防御措施,可以有效地防止会话固定漏洞的利用,保护用户的信息安全和系统的稳定性。

二、价格篡改漏洞

价格篡改漏洞是指攻击者可以在前端页面中篡改商品价格,并在提交订单时将修改后的价格发送至后端,从而以篡改价格的方式获取商品的更低价格或者执行其他恶意操作。

靶场链接:https://yaklang.com/Yaklab/vulinbox/mall/02unsafe-price

2.1 攻击实现

攻击者可以利用浏览器的开发者工具或者其他网络调试工具,在购物车页面中将某些商品的价格进行篡改,例如将高价商品的价格修改为极低的价格。然后攻击者提交篡改后的订单,将修改后的价格发送至后端,后端可能会无条件地接收并处理这些篡改后的价格,导致订单价格与实际商品价格不符。

2.1.1 提交订单时篡改价格

  • 一开始购物车和我的订单都是空的
  • 购物车加入商品
  • 点击提交订单,抓包

价格改成0。提交数据截获到响应,订单提交成功。

实现了零元购。

2.1.2 加入购物车时选改价格

点击加入购物车

第一个请求和响应:

第二个请求和响应:

篡改商品价格,89->0

购物车中商品的价格为0,后续直接提交订单也实现了零元购。

2.2 防御措施

  1. 价格校验: 在前端页面提交订单前,应该对订单中商品的价格进行校验,确保订单中的价格与后端数据库中的价格一致。
  2. 防篡改机制: 在前端页面和后端接口中应该加入防篡改机制,例如在前端页面对价格进行加密或者签名处理,后端在接收到订单后进行价格解密或者验签,确保订单中的价格没有被篡改。
  3. 双重价格校验: 在后端接收到订单后,应该对订单中的价格进行二次校验,确保订单中的价格与商品的实际价格一致,避免篡改后的价格被接受。
  4. 限制价格修改权限: 对于敏感操作或者需要修改价格的功能,应该限制只有特定的管理员或者权限较高的用户才能执行,避免普通用户对价格进行任意修改。

三、未授权访问漏洞

未授权访问漏洞是指在应用程序中,没有对用户的访问权限进行正确验证和控制,导致攻击者可以通过越权操作或者遍历用户标识符等手段访问敏感信息或执行未经授权的操作。这个漏洞的存在对系统的安全性构成了潜在威胁。

3.1 攻击实现

攻击者可以利用未授权访问漏洞,通过构造恶意请求,直接传递其他用户的ID参数,绕过访问控制逻辑,获取到其他用户的个人信息。攻击者可以通过遍历用户ID等手段,获取到系统中的所有用户信息,甚至可以获取到管理员或特权用户的信息。

用admin/admin账号登录系统,修改id参数为2:

直接水平越权到root用户:

可以越权操作root用户的订单、购物车等个人信息。

3.2 防御措施

  1. 权限验证: 在访问敏感资源或执行敏感操作之前,应该对用户的身份和权限进行严格验证,确保用户具有合法的访问权限。
  2. 最小权限原则: 用户的访问权限应该最小化,即每个用户只能访问其所需的资源和数据,不应该具有无关资源的访问权限。
  3. 参数验证: 对于从客户端接收的参数,应该进行严格的验证和过滤,防止恶意用户通过篡改参数来进行未授权访问。
  4. 敏感数据保护: 对于敏感数据和资源,应该加强访问控制,采用加密、身份认证、访问日志等方式加强保护,防止未经授权的访问和操作。
  5. 错误信息处理: 在程序中对错误信息进行处理时,应该避免将敏感信息返回给客户端,防止攻击者利用错误信息获取系统信息和漏洞利用路径。

通过以上防御措施,可以有效地防止未授权访问漏洞的发生,保障系统的安全性和稳定性。

四、库存量溢出漏洞

库存量溢出漏洞是指在系统中对商品库存量进行管理时,由于缺乏有效的限制或验证机制,导致在购物车或库存管理功能中,攻击者可以通过恶意操作向购物车中添加大量商品,超过系统预期的处理能力和库存容量,从而引发系统性能问题或崩溃。

4.1 攻击实现

攻击者可以利用自动化脚本或手动操作,重复点击加入购物车按钮或频繁调用购物车接口,向购物车中添加大量商品,超过系统处理能力和库存容量。

这可能导致以下问题:

  • 系统性能问题: 大量商品添加到购物车可能导致系统负载急剧增加,影响系统的响应速度和性能。
  • 系统崩溃: 超出系统处理能力的大量请求可能导致系统崩溃或服务不可用。
  • 库存错误: 系统未能及时更新库存信息,可能导致实际库存与系统记录不一致,进而影响后续的订单处理和库存管理。

admin/admin用户登录

这个商品库存是10,但是加入购物车时可以添加和下单超出数量的物品。

并且订单能够提交成功。

也可以用抓包的方式修改:

这个攻击导致攻击者能够下单远超库存量的货物。

并且首页的库存也没有更新,存在严重的逻辑问题。

4.2 防御措施

为防止库存量溢出漏洞的发生,可以采取以下防御措施:

  1. 限制商品数量: 在后端接口中对添加商品数量进行合理限制,例如设置单次添加商品数量上限,或者限制用户添加商品的频率。
  2. 频率限制: 在前端页面或后端接口中设置用户添加商品的频率限制,防止用户连续添加大量商品。
  3. 实时库存更新: 确保系统能够实时更新库存信息,保持库存量与系统记录的一致性。
  4. 监控和报警: 设置系统监控机制,及时发现异常的购物车操作行为,进行预警和处理,防止异常操作对系统造成影响。

通过以上防御措施,可以有效预防库存量溢出漏洞的发生,提升系统的稳定性和安全性。

本文主要介绍yaklab项目中Vulinbox 靶场的逻辑漏洞之购物商城的漏洞案例实践过程。


文章作者: 司晓凯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 司晓凯 !
  目录