爬虫&反爬&反反爬&风控
基于反爬系统和浏览安全体系
相比逆向更加有亲和力,逆向只有最后一刻才能得到成就感
所有反爬的手段只有两个
- 鉴权阻止进入(开发端拦截)
- 高频组织数据大面积泄露 / 防止服务器崩溃(风控层面)
app 和 web 整体的思想和逻辑是不变的
最开始的本质只是采集数据 >>> 因为我们在获取数据的时候 人为采集太费时间
采集数据 (招投标 工商信息。外卖 等等) 转变>>>> 采购 | 抢票 | 模拟登录 | 自动渗透| 刷票| 黄牛| >>> 转变鉴权时期 (没有意识到数据的价值)
协议采集 逆向成本高 资源低 性能好 >让采集成本高 第一优先级 鉴权 高频拦截
真机采集 逆向成本低 资源高 性能低 > 高频拦截
web自动化 指纹浏览器 rpc rpa
app 真机 改机 沙箱 群控 rpc
所谓的反爬的原理 就是利用 浏览器和协议爬虫脚本之间的区别去拦截流量
密码学
明文 ——> 加密——> 密文——> 解密——> 明文
密码学的研究领域可分为密码编码学(cryptography)和密码分析学(cryptanalysis)两个分支
类似于反爬与爬虫 前者负责加密 后者负责加密
举个例子
1 |
|
这就完成了 bccba 到 23321的过程
常用加密算法
- 对称加密算法: AES 、DES、 3DES、
- 国密 SM1234
- 非对称加密算法:RSA、DCC、DSA
- 哈希摘要算法:MD5、Sha系列、
基于GRPC的反爬虫
PB的技术实现。序列化和反序列化
https://github.com/protocolbuffers/protobuf
原理就是读取 proto文件从而解析 获取里面的pack 和 message
进而创建一个数据载荷。然后把这个数据载荷去发送
要明白攻击者的方式。这很重要。没有攻击何谈防御?
一、鉴权绕过
以web为例 常见的鉴权绕过有以下几种
- 攻击者以鉴权去猜测实现逻辑和原理
- 适用场景:鉴权很容易,基本一眼或者是hook一下就能搞出来的逆向,常见:base64 md5 hash等
- 对抗方法:提升加密的强度,把简单的加密更换掉(des)
- 攻击者通过JS逆向,复现前端的加密,改写为爬虫程序能够运行加密方法(即,纯算,在爬虫圈使用纯算绕过强校验鉴权)
- 适用场景:防御者使用的加密简单且标准,通常为标准的AES等算法,或者虽然是防御自设算法,但是算法长度很短(纯逻辑仅几百或者几十行)
- 对抗方式:提升鉴权的加密强度,使用魔改标准算法或者更强的自研算法
- 攻击者通过JS逆向,将前端的核心加密代码剥离出来,利用Node 或者其他引擎模拟执行JS
- 适用场景:防御者的加密较为复杂,但是代码相对来说容易读懂,能够大致或者相对容易找到核心代码,并且扣除玻璃代码部分相对容易。
- 对抗方式:增加反渗透能力(包括但不局限于:控制台检测,JS代码混淆,逻辑VMP,wasm,鼠标指纹融合)
- 攻击者通过JS逆向和开发能力,将前端的大部分核心函数全部获取,利用Node去模拟执行——补环境。
- 适用场景:JS执行引擎的时候,不管难度如何,只要锁定核心代码,直接执行即可。
- 对抗方式:在鉴权的时候,加入设备指纹,环境指纹(1.可以对抗补环境,2. 可以为后续流量风控收集数据)
- 攻击者使用RPA/RPC/指纹浏览器/自动化/真机/进行实时采集。指纹与真实浏览器相差无几。
- 适用场景:逆向难度高,破解鉴权难度大,数据量小,且需求为一次性需求。
- 对抗方式:利用大数据风控与业务侧相结合。增加对方采集成本,比如账号 IP 、
整个Web主流的手段路径就是这些 冷门的暂时不记录了。逆向是挖洞绕过门,反爬是造门。防止大部分进入就行了。永远记住,反爬只是拦截流量 而不是锁死流量。
少部分进入 再通过风控分析 逐步封死
APP端:算法方面能精通且能稳定爬取已经是人中龙凤。更多的还是针对设备指纹方面的对抗,大部分都是基于对端的hook以及防护检测。
二、鉴权引入方式
Cookie | Header | params-get | params-post | |
---|---|---|---|---|
持久性 | 自由设置 | 仅支持一次请求 | 仅支持一次请求 | 仅支持一次请求 |
兼容性 | 良好 | 优秀 | 优秀 | 优秀 |
自由度 | 高 | 低 | 低 | 低 |
长度限制 | 4k | 64k | 2k | 理论上无限制 |
业务对接 | 方便 | 一般 | 一般 | 较差 |
某些引入方式很简单 不同公司和业务选型不同 可以同时选择多种
某些头部尤其是国外设计。会多种整合到一起。
三、设备指纹挖掘和设计
挖掘路线
- 工作量大 推进难度大 也是最能体现价值的地方对于特性的挖掘越深入,兼容性就会处理的越好。最后的 结果就越好,整体难度防守就高。
在鉴权检测中渗入设备指纹的主要目的
- 对抗补环境(主要功能)
- 为大数据流量风控提供数据基础(主要功能 )
- 为加密提供更多的原始数据,增加破解难度
植入设备指纹的注意事项
- 多版本浏览器的兼容性
- 低端 配置客户端的执行效率与兼容性
- 需要对指纹进行合理的分配(即合理搭配植入的方式)
植入常见方式(通常下面几个方式会综合出现)
- 将植入的指纹以明文加密形式传输给解密服务器
- 将植入的指纹以映射压缩的形式传输给解密服务器
- 将植入的指纹以破坏性压缩(hash 等摘要算法)再加密或者直接传输给解密服务器
- 将指纹合法性提前计算,并传输给解密服务器
关于语言特性问题
这部分严格来说,不算设备指纹,但是一般情况下,在攻击者视角与设备指纹的拦截成都是类似的,所以勉强可以划分进来。在某些不同浏览器 中有众多神奇的特性,可以用来判断段明文来源是否符合浏览器特征
四、TLS检测的具体设计
tls检测设计
- 不同网络环境下,不同的浏览器/系统,都对应着不同的tls指纹,但是 所有的请求库在没有进行过魔改过下 即改底层请求的逻辑与监测点,几乎都是一致的。
黑名单检测
- 通过简单实验,将市面上大部分常用的请求库的特征都测试出来,然后封禁入黑名单即可。检测到黑名单就直接杀掉
白名单检测(web)
难度MAX级别
目前为止没有产品能实现,但是海外防火墙对此方向的识别的精度就非常高。改检测方案的实现难度与工作量非常大。从三个步骤来说
- 进行大量的的人工测试,将大部分系统(主流系统)/浏览器(大版本即可)/网络环境(含不同运营商)/ 平台(微信浏览器等) 指定拦截规则。
- 进行灰度测试,结合现有风控系统/ 设备指纹(UA,显卡,机器性能,网络状态..)进行策略分析,判断误杀率
- 调整拦截方案,重复进行灰度测试,直到误杀率降低至可接受范围。进而上线
- 紧盯各个版本浏览器的状态,随时判断误杀情况,避免造成生产事故。
白名单检测 (APP)
由于IOS/ 安卓 发送请求时。Tls指纹不会发生改变,所以白名单很好设置。只需要把开发时设置的请求库Tls指纹设置为白名单。一般就不会出现明显异常。但是移动端爬虫还是谨慎点。策略非必要不上
五、请求拦截引入设计
特点
- 有点类似于无感验证码引入的感觉(其实就是无交互式的验证码 即无感验证码)
优与劣
优势
- 易于集成,可以通过简单的配置和嵌入代码块快速集成到现有代码中,无需参与业务代码
- 维护方便,可由专人维护,减少业务
- 维护成本低,只需要维护单JS即可
- 低耦合,符合代码规范
- 灵活性良好,业务修改与拦截无关
劣势
- 与业务代码难以绑定,安全性 会在一定程度大打折扣,可以结合验证码
- 可操作内容有限,无法与页面元素与其他参数鉴权所融合。
适用范围
- 业务范围广
- 所有业务均有安全性规范
- 安全性要求不高
六、关于鉴权总结
概念明晰
描述反爬领域实现异常拦截的一种形式, 所谓鉴权就是鉴定权限。通过客户端传输过来的密文进行分析,确定本次请求是否合理的一种防止,而这个方式的整个过程被称之鉴权检测过程。换言之,鉴权是一个动词,针对于密文进行但请求合法性检测的整个过程。他是一个整体概念
关于数据流量风控与鉴权的关系
不再是单一请求,而是整体请求。 在鉴权没有办法拦截的情况而采集的一种更加强力的措施(真机对抗),所以通过鉴权过程,虽然是合法的内容,但是会留下很多设备指纹。利用这种痕迹,从宏观再去进行身份识别,确定哪些请求是同一个身份。再去拦截这个身份的过程。所以她和鉴权还是有一点差距的。反爬的目的不是拦截所有请求,而是过滤乃至增加对方的成本。彻底拦截是不显示的一件事。
一个正常的鉴权系统的要求
- 兼容性(业务要求满足)
- 加密方案(魔改算法/自研算法/实验室算法)
- 反渗透方案(混淆,测试拦截,格式化检测)
- 性能
- 设备指纹 环境的挖掘
- 鉴权检测系统
- 蜜罐埋点设计
- 格式与传值内容规范
- 传值多样性 接口多样性