【问题标题】:How can I prevent bulk vulnerability scanning without using a CAPTCHA component?如何在不使用 CAPTCHA 组件的情况下防止批量漏洞扫描?
【发布时间】:2023-04-02 19:06:01
【问题描述】:

如何防止表单被 XSSME、SQLinjectMe(这两个是免费的 Firefox 插件)、Accunetix Web Scanner 等大型漏洞扫描程序扫描?

这些“网络漏洞扫描程序”可以捕获包含所有字段的表单副本,并在几分钟内发送数千个测试,在字段中引入各种恶意字符串。

即使您对输入进行了很好的清理,服务器中的响应速度也会有所延迟,有时如果表单发送电子邮件,您将在接收方邮箱中收到数千封电子邮件。我知道减少此问题的一种方法是使用 CAPTCHA 组件,但有时这种组件对于某些类型的表单来说太多了并且会延迟用户响应(例如登录/密码表单)。

有什么建议吗?

在此先感谢,对不起我的英语!

【问题讨论】:

  • 非常感谢安迪,拼写检查器真是个奇迹! ;)

标签: security


【解决方案1】:

嗯,如果这是一个主要问题,您可以添加服务器端提交率限制器。当有人提交表单时,将一些关于他们的 IP 地址和提交表单的时间的信息存储在数据库中。然后,每当有人提交表单时,检查数据库以查看自该 IP 地址上次提交表单以来是否已经“足够长”。即使是像 10 秒这样相当短的等待也会严重减慢这种自动探测的速度。该数据库可以每天/每小时/每天自动清除,您无需长时间保留数据。

当然,可以访问僵尸网络的人可以避开这个限制器,但如果您的网站受到大型僵尸网络的攻击,您可能会遇到比这更大的问题。

【讨论】:

  • 进行此类攻击的人很可能会使用僵尸网络
  • 是的,一个使用 Firefox 插件的僵尸网络。不知怎的,我对此表示怀疑。
【解决方案2】:

除了其他人提供的限速解决方案之外,您可能还想在敏感页面和表单上实施一些日志记录或审核,以确保您的限速确实有效。它可能很简单,例如记录每个 IP 的请求计数。然后,您可以向自己发送每小时或每天的摘要以密切关注事情,而无需反复检查您的网站。

【讨论】:

    【解决方案3】:

    你能做的只有这么多......“有志者事竟成”,你希望用户做的任何事情都可以被自动化和滥用。你需要在开发的时候找到一个中间值,并加入一些可能使它更难被滥用的东西。

    您可以做的一件事是使用哈希在表单上签名,例如,如果表单用于向其他用户发送消息,您可以这样做:

    hash = md5(userid + action + salt)
    

    那么当你真正处理你会做的响应时

    if (hash == md5(userid + action + salt))
    

    这可以防止滥用者注入 1000 个用户 ID 并轻松向您的系统发送垃圾邮件。它只是攻击者跳过的另一个循环。

    我喜欢听听其他人的技巧。验证码应该用于注册等入口点。上面的方法应该用于对特定事物的操作(消息传递、投票等)。

    您也可以创建一个标记系统,并且用户在 X 时间内执行 X 次可能看起来可疑的任何操作都会标记用户,并让他们进行验证码(一旦他们输入验证码,他们就不再被标记)。

    【讨论】:

    • 好主意,但不确定这是否有助于反弹17,因为他有点暗示他没有“用户”。
    • 好吧,如果他没有用户......那么我能看到他真正保护他的网站的唯一方法是要求用户验证他们的会话并在会话之上实施一个标记系统。因此,如果新用户访问该页面,他们必须在第一个操作时输入验证码,如果他们通过了验证,则他们会通过验证。如果用户做了一些看起来像是滥用的事情,他们会被标记并必须通过另一个验证码。
    【解决方案4】:

    这个问题与其他关于验证码的问题并不完全相同,但我认为如果您还没有阅读它们,那么阅读它们是值得的。 “Honey Pot Captcha”听起来可能对你有用。

    【讨论】:

    • 蜜罐验证码基本上是人类用户看不到的隐形字段,但漏洞扫描程序可以。这是一个很好的方法。我会考虑一下。谢谢。
    【解决方案5】:

    回顾我为我的案例定制的所有答案,每个答案都有一点点:

    我再次检查了已知漏洞扫描程序的行为。他们一次加载页面,并根据收集到的信息开始提交它,使用恶意脚本更改字段的内容,以验证某些类型的漏洞。

    但是:如果我们在表格上签名呢?如何?使用存储在 Session 对象中的随机内容创建隐藏字段。如果该值被提交超过 n 次,我们只需再次创建它。我们只需要检查它是否匹配,以及它是否不只是采取我们想要的动作。

    但我们可以做得更好:为什么我们要随机更改字段的名称,而不是更改字段的值?是的,随机更改字段名称并将其存储在会话对象中可能是一个更棘手的解决方案,因为表单总是不同的,漏洞扫描程序只加载一次。如果我们没有为具有存储名称的字段输入输入,那么我们就不会处理表单。

    我认为这可以节省大量 CPU 周期。我正在使用问题中提到的漏洞扫描程序进行一些测试,并且效果很好!

    嗯,非常感谢你们所有人,正如之前所说,这个解决方案是用每个答案的一点点提出的。

    【讨论】:

      猜你喜欢
      • 2013-03-07
      • 2014-10-06
      • 2016-01-11
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      相关资源
      最近更新 更多