我拥有一个受欢迎的网站,该网站允许人们输入电话号码并获取有关该电话号码的信息,例如电话运营商的名称。这是一项免费服务,但每次查询都要花钱,因此我们在网站上展示广告来帮助您支付费用。为了确保人们不会滥用它,我们有一个验证码,并使用IP地址将查询数量限制为每月30个。

但是无论如何,我们一直在看到滥用行为。我们会突然从所有不同的IP地址中发出大量查询,以进行查询(每分钟数百个),并确保验证码正确。因此,我不断更改验证码-我已经尝试过使用单词,数学方程式,reCAPTCHA等验证码。当我这样做时,它会在24小时左右的时间内停止“攻击”,然后再次开始。

我知道人们可以使用OCR和其他方法来绕过验证码,但是我不明白为什么它们来自许多不同且不相关的IP地址。

也许他们是在欺骗IP地址?如果是这样,他们将无法从查询中获取结果,对吗?在这种情况下,也许目标是试图从经济上伤害我们,而不是仅仅希望获得数据?

如果他们没有欺骗IP地址,那么也许他们已经入侵了许多不同的IP地址。计算机,并从中执行查询吗?这对我来说没有意义,因为我们看到的IP地址数量庞大(每分钟数百个事务,并且每个IP地址最多30个查询,而且很长一段时间),而且该数据确实没那么有价值。

因此,我试图了解他们的动机以及他们如何实现这一目标,以便能够进行适当的反击。

评论

评论不作进一步讨论;此对话已移至聊天。

#1 楼

有趣的问题。我想知道是否可以通过强制用户的Web浏览器解决加密问题(使用在其Web浏览器中运行的javascript)来解决这个“难”但对于您的站点来说“容易”的解决方案。 “难以解决”是指用典型的台式机或笔记本电脑的资源解决大约10秒钟的问题。这个问题类似于比特币矿工在开采新区块时解决的问题,但是规模当然要简单得多。

您的合法用户不会注意到其中的区别,因为脚本在填充时会逐渐消失删除您网站上的表格。但是,这将大大降低滥用者的速度,并迫使他们分配更多的资源,并迫使他们重新使用他们用来自动将这些信息发布到您网站的任何工具。

评论


这个概念比加密货币早几年,并且是比特币的灵感来源。 en.wikipedia.org/wiki/Hashcash

– Ghedipunk
19年12月18日在16:22

这可能被浏览器视为恶意软件,因此被阻止。

–桅杆
19/12/18在22:33

@桅杆,不,不是。我知道有一些合理的大型网站可以做到这一点而没有任何问题(除非没有Javascript才能访问)。

–马克
19/12/18在22:59

如果它来自僵尸网络,这真的有帮助吗?是的,僵尸网络将需要更多的计算工作,但是由于他已经进行了速率限制,因此僵尸网络中的每个ip时间增加到300s,而不是30 *(无论验证码破解时间是多少)。

– KillianDS
19/12/19在9:31

Cloudflare带有这样的服务。强烈推荐。

–安德斯
19/12/19在11:38

#2 楼


租用僵尸网络和验证码农场。
为什么?
有人想要您的数据。盗窃比买便宜。
怎么办?
偷东西便宜,但不是免费的。进行这些攻击需要“他们”(最终想要数据的人,而不是僵尸网络或验证码农场的人)的钱。使攻击您的成本超过数据价值。


识别模式以识别垃圾邮件发送者。


返回合法外观,但虚假数据到垃圾邮件发送者。


经过一定数量的有效响应后,开始将虚假数据与有效数据进行散布。然后,他们必须采取额外的步骤来验证您的数据。这些额外的步骤会花费额外的钱。
如果他们不对其进行验证,那么他们的数据就没那么有用了,也就是说价值更低。他们也许仍然可以使用或出售它,但是它的价值不高,因此再次攻击您的成本要高于返回的价值。

评论


这并不能真正解决问题。僵尸网络所有者仍然需要花费大量时间才能认识到您与他一起玩,并且他将继续向您的网站发送垃圾邮件。而且,如果您的虚假数据太明显,那么僵尸程序将在检测到虚假数据后立即停止该IP地址的僵尸程序。

–Luc H
19/12/20在17:11

您是对的,最好阻止攻击。这很容易/便宜,足以在其他建议之上实施。所有的建议都可以克服,但要付出代价。如果使用其他方法,则会增加价格。但是您是对的,它不会立即停止OP的成本。

– Zach Mierzejewski
19/12/20在19:17

您如何处理可能给合法用户虚假数据的事实?

– DjangoBlockchain
19/12/20在20:46



#3 楼

您所做的CAPTCHA错误。

CAPTCHA的想法是使计算机难以解决(很难读到“几乎是不可能的”),但对于人类来说却很容易做到。一个静态图像,例如要求输入4,则计算机将根据指示反复输入4,不会出现任何问题。问题已经解决,无需重新设计轮子,如下所示:



CC-BY-NC 2.5,Randall Munroe,xkcd.com / 2140 /

评论


评论不作进一步讨论;此对话已移至聊天。

–Rory Alsop♦
19/12/23在16:31

#4 楼

如果您可以设置一个简单的“在此图片中键入数字”验证码并将其粘贴24小时,则说明您的敌人是业余爱好者。您知道这种涉及定制代码的原始设备会使它们减速24小时。这可能很有趣:)
我会大量使用样式表来隐藏页面代码中的信息:从两种意义上讲,第一种是隐藏验证码,第二种是隐藏信息性答案。为了以可悲的方式误导刮板。
我会在服务器端编写一些代码来创建假冒的答案,乍一看似乎是可信的,但是以不容易确认的方式成为电话。此外,请使用随机种子或MD5来确保相同的输入始终给出相同的语音答案。
在CAPTCHAs上存在误导性:
例如,保留您使用的最后一个CAPTCHA系统,但使用样式表将其隐藏。跟随另一个被Javascript混淆的验证码;也许甚至还有另一个具有不同键的reCaptcha。
现在,抓取工具将不会意识到样式表会抑制第一个CAPTCHA。它将很乐意解决验证码并使用错误的密钥返回答案。知道了但是,就像破解Enigma一样,您无法清楚地看到已经破坏了代码。
误解答案:
正常显示答案,并附带一个样式表。样式表对普通人隐藏了此结果;刮板不会注意到此纸张具有“隐藏”属性。您在这里提出的答案是假的。然后提出真实的结果。对于奖励积分,请在图形中显示结果,以使其无法抓取。
如果您遥测(解决了错误的CAPTCHA)这是一项不符合条件的查询,那么甚至不必费心从服务提供商那里购买该查询结果。在服务提供商通常需要的时间范围内插入睡眠(t +随机),然后发送假答案。
看起来很正常
攻击者会相信一切正常,只会检查查询是否成功,而不是结果的质量。幸运的是,您的攻击者不会在每次查询时记录日志,而只是将答案转储到数据库中。攻击者可能需要很长时间才能意识到您已经毒化了数据,到那时,整个数据库将被破坏,不知道哪些条目是有效的,哪些是毒害的(请参阅使假数据看起来合法的重要性?)即使攻击者在每个条目上都打上了时间戳,这还是一个错误的搜寻!每天必须手动检查几个条目来确定数据何时变坏。
还有另一件事。缓存真实答案,如果僵尸网络查询在缓存中,请始终从缓存中给出正确答案。因此,疑难解答工具会使用浏览器访问您的真实网站,并要求提供测试号码213-456-7890。隐藏将起作用,并且其行为将类似于真实查询,因此您将计算出真实答案并将其返回。接下来,抓取工具将告诉僵尸网络请求213-456-7890。看看机器人是否得到了不同的结果。您将检测到机器人查询。如果您现在给出的答案是假的,则抓取工具知道夹具已安装好,并且会在中断检测结果时进行迭代。因此,由于您在缓存中拥有真正的答案,因此即使在隐藏字段中也要给出答案。现在,抓取工具很困惑:僵尸网络似乎可以正常工作。

为什么以及如何
显然有人发现您的数据很有价值。他们会从您的来源获得它,但是他们不想为此付费,所以他们在抓捕您。

他们实际上可能是一个竞争对手的网站,可以做与您相同的事情,当他们从访问者那里得到查询时,就会向您生成查询。本质上,这是使用您的服务但张贴他们的广告的方案。您自己知道其价值。您可以通过在每个竞争对手的站点上进行晦涩难懂的查询来进行测试,并查看日志中弹出了哪些查询。

有无数种方法来解决验证码问题。在竞争对手网站为您的客户提取您的数据的示例中,他们可能只是将您的验证码传递给了他们的客户。还有一些方法可以诱骗用户为您执行验证码,例如“解决使验证码获得免费色情内容”,或者通过提供出于某种原因需要验证码的无关服务,例如匿名公告栏。每当有人发帖时,它都会向您发送查询并获取其发帖人来解决您的验证码。在第三世界中也有CAPTCHA在本质上解决奴隶制问题。

评论


好主意。您可能希望通过将其随机放置在视口之外或将其放置在另一个元素下,从而间接隐藏它,而不是仅在假答案上将其设置为隐藏,因为这将更难检测。

–烧烤
19年12月21日在16:56

#5 楼

为什么?
在合法和地下市场中,与电话号码,姓名和电子邮件地址相关的数据都非常有价值。

如何?
听起来好像有人在使用僵尸网络从您那里挖掘数据。这可能意味着从几十个分布在全球的IP到数千个IP之间的连接。
我个人不知道它们如何处理reCapchas,除了使用来自提供capcha解决服务的站点的人工之外。所有这些都以一种或另一种方式使他们付出了金钱。

解决方案?免责声明:我不是安全专家。
一些免费服务在经过一定数量的查询后会使用排队系统。假设您不希望系统过载,那么您一次最多可以允许30个请求(或系统可以轻松管理的并发请求数量)。在队列已满时发出的请求会得到一条消息,说明服务器正忙,或者要么稍后再试,要么自动排队。
此解决方案并非没有问题,因为您的合法客户端有时会必须等待送达,特别是在高峰时段或在攻击期间。

您提到更改capcha方法可以暂时阻止攻击。也许有一种方法可以将每个访问者的capcha方法与每个请求随机地交替使用?至少,攻击者必须重写一些方法。在最佳情况下,其成功的攻击将除以您采用的不同方法的数量。

评论


在检测滥用和更改响应的同一线程上,请考虑使用看起来合理的垃圾数据进行响应。您需要确保该请求是可疑的。我很好奇,如果时间安排,源IP或请求没有保持可以打开的某些独特质量。

– blackboxlogic
19/12/19在14:21

不幸的是,如果没有适当的方法将僵尸程序与合法用户分开,则此解决方案和注释中的“裤子”解决方案都会将僵尸网络活动变为DOS攻击。我不确定是否将一种攻击转变为另一种攻击是最好的方法。

–贾罗德·克里斯特曼(Jarrod Christman)
19/12/19在15:06



OP等许多信息服务通过电子邮件传递您的数据。他们可能会避免这种情况,但可以让您对限制向域的交付进行评分。

–内森·高斯(Nathan Goings)
19/12/19在21:13

不是安全专家,但是我非常确定安全性的三个要素:机密性,完整性和可用性。所提议的解决方案使最后一句话有些震惊。

–凯文
19/12/20在19:43

我喜欢你袭击的原因。我可以看出您是否是离岸短信/电话诈骗者,掌握有关您所拨打电话号码的信息可能非常有价值。

– Mark Biernacki
19/12/20在20:08

#6 楼

他们的动机可能仅仅是他们自己在构建类似的服务并需要数据。您的服务可能就是他们发现并需要抓取的数据源之一。

您是否尝试过限制请求的速率?您说您每分钟获得数百分钟(假设使用相同的IP地址),那么您是否无法记录这些请求,在合理的时间段内检测到重复访问者,然后暂时禁用某个时间段的IP?

您还可以在表单中添加“蜜罐”表单元素。 Honeypot表单元素对geniune用户是隐藏的,但是会被机器人自动填充。这些字段中包含数据的任何请求都将被自动丢弃甚至被禁止。

评论


在这种情况下,好像OP的网站是专门针对的对象(因为他们绕过验证码),并且蜜罐表单仅与通用的bot真正兼容(例如那些在许多不同网站上探查评论表单的bot)。如果攻击者专门针对您的网站,则通常是通过手动查看您的网站代码并编写脚本来提交表单或执行操作来实现此目的,并且会考虑蜜罐表单。

– JonasCz-恢复莫妮卡
19年12月19日在16:58

#7 楼

不要使用一个验证码解决方案,而是全部使用它!

既然您已经有多个不同的验证码,为什么不每两个小时甚至每个请求一次(随机)旋转它们呢?即使从理论上讲,攻击者都已将其全部破解,但他们需要检测验证码的类型本身就是解决计算机问题的另一种验证码(虽然完全不影响人类)。

还可能包括一些愚蠢的问题,例如诸如“您再次查找什么电话号码”之类的验证码等。越随机的内容对于机器人越难做到。

尤其是如果您使用不同的学科(图像识别,阅读数字,数学,一般知识)知识,等等)后尘者将很难跟进。

您不需要完美地胜过它们,您只需要使其不再值得他们浪费时间。

编辑:这还需要定期添加新的验证码类型

评论


您说检测验证码的类型比解决验证码更难的依据是什么?在我看来,这应该容易得多,因为会有各种类型的元数据会有所不同。

–乔恩·本特利
19/12/19在11:23

您假设机器人是针对特定的验证码类型进行硬编码的,并且只能破解其设计的验证码。您不假定机器人检查以查看显示的验证码并应用适当的过程。

– schroeder♦
19/12/19在12:59

@schroeder如果OP不断修改站点的布局,则需要手动进行硬编码才能解决!更不用说样式表隐藏材料了。

–哈珀-恢复莫妮卡
19/12/19在23:35

#8 楼


因此,我试图了解他们的动机以及他们如何实现这一目标,以便能够进行适当的反击。


还可能使用代理来访问您的服务。只是google for open proxy list会返回一些显示开放代理的站点,这些站点也可以用来屏蔽客户端的ip地址。

我建议在服务器端记录HTTP标头X-Forwarded-ForVia一段时间,然后检查是否可能使用此类代理来滥用您的系统。
请注意,一般来说使用代理服务器是合法的,但是可能会有一些有趣的模式,例如,X-Forwarded-For包含客户端的IP地址,Via包含链中代理的IP(如果有)。如果您看到相同的代理在攻击期内被一遍又一遍地使用。

#9 楼

我不认为这是一个完整的答案。我是说在类似的情况下该怎么做。


记录查询。他们的查询中是否有任何模式?例如,特定国家或地区。如果他们确实在使用结果,则必须有一种模式。如果没有,我会考虑使用数字2。

您说过,当更改验证码类型和技术时,攻击会停止大约24小时。我是这样写的:

当我奋战10分钟的工作时间时,我会伤害对手24小时的工作时间。

所以您要做的就是继续破坏他们的时间并坚持下去。它会使这样做的人感到疲倦,并且您可以确定他们是第一个停止战斗的人。获胜的实际几率是-> 1-(10/1440)

这不是一个真正的解决方案,相反,这是我在进入第3位之前要考虑的事情。

请记住,他们可能会在下个月或六个月后回来,但现在他们知道您一直在反击,而损失却很少。

您甚至可以为他们争取有点困难,例如,一天中有3个以上的查询,要求用户输入2种验证码。排在第十位之后,系统的死忠就更多了,以至于您的真正访客不会意识到这一点。

很遗憾,但是使用了授权。甚至您也可以选择使前n个(n <10)查询异常可用,但超过此数量需要登录。


#10 楼

我制定了联系表格,滥用者已经尝试滥用一年多了,但一直失败。

我的方法包括以下几种组合:


每个必需的字段都会验证它是否触发ajax调用,该调用会检索随机存储在表单验证db表中的新的32-48个字符随机生成的字段名称。然后,在提交表单时,输入的字段名称不是由服务器生成的,或者具有原始字段名称的字段将触发登录db远程IP地址以及他们提交的与表单提交有关的内容。一旦更改了字段名称,任何具有原始字段名称的提交都将被检测为滥用行为,并进行相应的处理。
它们必须在页面上,每个必填字段的显示时间至少为1.3秒,并且所有字段都必须在删除提交按钮禁用属性并至少使用新ajax调用或从先前ajax字段名称调用收到的名称和/或值更改提交输入的名称之前进行验证。在服务器上进行表单验证期间,按钮名称和值必须匹配,否则将检测到滥用并进行相应的处理。
我将所有提交记录到db并用DENY目标标记滥用,一旦他们滥用了我的表单,它们将永久存在被阻止,甚至无法访问表单页面,并且在记录了尝试的访问后被直接重定向到403响应。
在进行一个ajax调用期间,有时我会随机生成一个新字段和值,并在提交前将其附加到表单中并且必须存在,否则提交内容将无法通过验证,将被检测为滥用。
您可以包括蜜罐字段,但不要隐藏将被检测到的字段对象。如果要隐藏字段,请隐藏父对象。您也可以将其绝对放置在远处。进入服务器的任何带有任何类型值的蜜罐字段都将被检测为滥用并以这种方式进行处理。

请确保记录所有提交,以便您监视旨在规避的新模式您的安全。

评论


有目标的攻击者会花时间了解您的验证规则,从而对所有这些信息进行欺骗/复制。在这种情况下,OP似乎要针对专门针对其系统的攻击者,因此,这可能最终只是为了临时利益而进行大量工作

– Conor Mancone
19/12/20在14:09

我确实没有提出或打算这将不是任何永久的银弹。

–丹·斯蒂帕尼亚克(Dan Stepaniak)
19/12/21在0:24