繁体   English   中英

渗透测试:字符串的数据边界

[英]Pentesting: Data boundaries for Strings

我们已经从第 3 方供应商处进行了渗透测试。 观察结果之一是没有数据边界。 我们的应用程序中有数百万个领域。 除了偶尔对少数字段进行业务逻辑相关的约束外,没有对 String 类型字段进行验证。

笔测试揭示了与许多字符串字段相关的问题,在这些字段中可以插入数值或负值,并且应用程序正在处理相同的内容而没有任何问题。

我的问题是,这是一个有效的测试吗? 除非企业特别要求,否则为什么有人会禁止在字符串字段中使用诸如“100”之类的数值? 如果这是一个有效的问题,这意味着必须测试每个 String 属性的非数字值,这非常疯狂。 正确的方法应该是什么?

这个答案有点晚了,但希望它对您或其他人仍然有帮助。

这个发现与输入验证有关,并且绝对是一个有效的测试。 这是OWASP Foundation 推荐实施的控制措施之一。

当这个未经处理的值传递给下游组件时,通常会出现风险,例如数据库、用户界面或易受攻击的功能。

这是一个仓促的例子:

async function chargeUser(userId: number, currency: string) {
    const amount = (await User.getUser(userId)).amountDue;
    return await api.chargeUser(user.id, amount + currency);
}

上面的 Typescript 函数获取用户 ID 和货币,然后调用 API 以向用户收取当前订阅的费用。 让我们做几个假设:

  • API 需要格式为“100USD”或“100”的金额。
  • API 允许对退款收取负费用。
  • 如果不包括货币,API 将假定为美元。
  • 如果币种未知,API 调用将失败并出现错误。
  • 用户当前有 100 美元的应付款项。

在正常情况下,员工会从 UI 发出请求,指定向用户收费的货币。他们无法控制向用户收取的费用:

{"userId": 1, "currency": "USD"}

正如预期的那样,这将导致向用户收取 100 美元的费用。

但是,攻击者可以利用 Javascript 的松散类型和缺乏输入验证来向用户收取超出应付款的费用:

{"userId": 1, "currency": 10000}

由于 100 + 10,000 是 10,100,如果省略,API 假定货币,这将导致向用户收取 10,100 美元。

同样,攻击者可以改为执行以下操作:

{"userId": 1, "currency": -100100}

由于 100 - 100,1000 是 -100,000 并且 API 支持负数,这将导致用户将 100,000 美元存入他们的银行账户。

由于渗透测试是有时间限制的,并且渗透测试人员通常无法访问您的后端代码或对您的应用程序拥有与您的团队相同水平的深入了解,因此通常无法确定可能发生这种情况的每个潜在实例,因此确保对所有字段进行正确输入验证的广泛建议。

来自用户的任何输入,针对所有字段,针对所有请求, 都应始终尽可能得到最大程度的验证

由于您有大量共享相似验证逻辑的字段,您可能希望实现一个负责验证的共享函数,可能根据模式。 有关可能的解决方案,请参阅:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM