Web 抓取是一种古老且仍然常用的数据提取技术。Akamai Bot Manager 和其他供应商试图减轻抓取可能导致的问题。他们的目标是阻止诸如 DDoS 或欺诈性身份验证尝试之类的攻击。出于教育目的,我们的目标是绕过 Akamai。
爬虫不是他们的主要目标,但无论如何都可能会阻止他们的内容。区分好的和坏的机器人不是一件容易的事。让我们看看他们是怎么做的以及如何做的,并学习如何绕过 Akamai Bot Manager!
什么是机器人检测软件
Bot 检测,也称为 Web 应用防火墙 (WAF) 或反爬虫保护,是一组对 Bot 进行分类和检测的技术。
过去,措施涉及检测高负载 IP 和检查标头。这使得防御系统能够阻止大部分的抓取流量。
随着这些技术的发展,抓取世界也在发展。许多爬虫试图绕过这些措施,导致机器人检测行业变得更好。
多年后,反抓取软件开始包括被动和主动方法。被动,如存储 IP 和僵尸网络并为每个请求识别它们。主动监控浏览器和用户活动,或将浏览历史记录提供给机器学习程序。
根据官方白皮书(第 13 页),Akamai 已在 2016 年进行行为分析。从那时起,他们一直在发展,所有机器人检测软件供应商也是如此。他们现在为网站所有者提供了一个机器人评分模型来微调他们的阻止攻击性。
Akamai Bot Manager 有什么作用?
Akamai Bot Manager 的主要目标是在最危险、最狡猾的机器人削弱客户信任之前阻止它们。这涵盖了各种各样的操作,包括网络抓取。
为了实现他们的目标,他们采取了多种行动。他们维护一个bot 目录,应用AI 来检测新型 bot,并且由于它们存在于许多大流量站点中,因此他们获得了集体智慧。
所有这些安全措施也适用于更具侵略性的攻击:DDoS、虚假帐户创建或具有网络钓鱼意图的复制站点。区分目的是一个关键方面。
机器人管理的两个关键方面是:
- 区分人类和机器人。
- 区分好机器人和坏机器人。
并非所有的机器人都是恶意的。没有人愿意将 Google 排除在外,他们也在抓取和抓取。那么,他们是怎么做到的呢?
Akamai Bot Manager 如何工作?
如上所述,他们使用各种各样的技术。在我们深入技术实施之前,我们将解释其中的一些。当然,还要学习如何绕过它们。
这些是绕过 Akamai Bot Manager 的活动部件:
- 僵尸网络。维护已知机器人的历史数据并提供给他们的系统。相同的 IP 范围、用户代理命名中的常见错误或类似模式。其中任何一个都可能泄露僵尸网络。一旦识别并记录下来,阻止该模式就会让人感到安全。没有人会那样浏览。
- 知识产权。阻止 IP 听起来像是最简单的方法。没那么简单。IP 不会经常更改所有权,但使用它们的人会经常更改。攻击者可能会使用属于普通 ISP 的 IP,掩盖其来源和意图。普通用户可能会在一周后获得该 IP 地址。到那时,它应该可以无障碍地访问内容。
- 验证码。区分人类和机器人的最佳程序,对吧?再次,一个有争议的。通过在每个会话中使用 CAPTCHA,一个站点会赶走多个用户。没有人愿意每隔一个请求就解决一次。作为一种防御策略,只有在流量可疑时才会出现验证码。
- 浏览器和传感器数据。注入一个 javascript 文件,该文件将监视并运行一些检查。然后将所有数据发送给服务器进行处理。稍后我们将看到它是如何完成的以及要发送什么数据。
- 浏览器指纹识别。与僵尸网络一样,常见的结构或模式可能会暴露您的身份。爬虫可能会改变并掩盖他们的请求。但有些细节(浏览器或硬件相关)很难隐藏。Akamai 将利用这一点。
- 行为分析。比较网站上的历史用户行为。检查模式和常见操作。例如,用户可以不时直接访问产品。但是,如果他们从不访问类别或搜索页面,则可能会触发警报。
刮擦检测不是黑色或白色。Akamai Bot Manager 结合了上述所有内容以及其他一些内容。然后,根据站点的设置,它会决定是否阻止用户。机器人检测服务混合使用服务器端和浏览器端检测技术。
如果我们想跳过 Akamai Bot Manager,我们必须首先了解它是如何使用它们的。或者面对“拒绝访问页面”:
我们只能猜测 Akamai 如何进行服务器端检测。但是我们可以看看他们的客户端。
Akamai 的 Javascript 挑战解释
正如我们在上图中看到的,脚本触发了一个带有巨大负载的 POST 请求。如果我们想绕过 Akamai Bot Detection,了解此有效负载至关重要。这并不容易。
反混淆挑战
您可以在此处下载该文件。要实时查看它,请访问KICKZ并在 DevTools 上查找该文件。
首先,在JavaScript Deobfuscator上运行内容。这会将奇怪的字符转换为字符串。然后,我们需要用这些字符串替换对初始数组的引用。
他们不使用直接名称声明变量或对象键来使事情变得更难。他们使用间接方式:用相应的索引引用该数组。
我们还没有找到可以确定更换过程的在线工具。但您可以执行以下操作:
_acxj
从生成的代码中剪切变量。
- 创建一个文件并放置该变量。
- 然后将其余代码放在另一个变量中。
- 替换(不完美)对数组的所有引用,请参见下面的代码。
- 审查,因为其中一些会失败。
var _acxj = ['csh', 'RealPlayer Version Plugin', 'then', /* ... */];
const code = `var _cf = _cf || [], ...`;
const result = code
.replace(/[_acxj[(d+)]]/g, (_, i) => `.${_acxj[i]}`)
.replace(/_acxj[(d+)]/g, (_, i) => JSON.stringify(_acxj[i]));
由于这是一种笨拙的尝试,因此需要进行一些手动调整。适当的替换需要更多细节和例外情况。下载我们的最终版本以查看其外观。
为了节省您的时间,我们已经这样做了。原始文件经常更改。这个结果现在可能不一样了。但它会帮助您了解哪些数据以及它们如何将 id 发送到服务器。
Akamai 的传感器数据
相关