阿里云WAF爬虫检测机制与突破
2022-07-19 16:28:11    96    0    0
alen

        已经闲下来半年没写过博客了,之前有弄一个小工具遇到了阿里云waf拦截的问题,所以特地研究了下阿里云的waf爬虫检测机制.在此记录下来为遇到有相同或类似问题的同学提供一点思路.

 

一.绕不开的405
        不知道大家有没有遇到这种情况,就是去抓取一个App的接口数据或小程序的接口数据的时候会遇到405的问题,如果是有搞过爬虫的同学肯定直接上三板斧"检查请求参数或签名","行为模拟","代理ip",然而发现没啥用,为什么我们屡试不爽的黄金手段竟然不起作用了?而且最神奇的是并不是所有的都不行,比如我当时遇到的问题是:使用curl命令请求阿里云被拦,使用charles做代理可以请求通过,使用fiddler做代理被拦,在openwrt内ssh执行curl可以请求通过.这到底是什么神奇的问题呢?

是他是他就是他:

 

二.到底是什么问题呢?

        遇到这样神奇的问题我一度准备放弃了.各种手段用尽依旧无解.我的openwrt能请求通过证明不是我的公网ip被封了,为了验证这个问题我也特地使用代理ip伪造请求发现确实不行.各种谷歌都搜不到想要的答案.后面我特地去阿里云官网看了阿里云waf的介绍,看到他们能识别爬虫.难道阿里云这么牛掰竟然能识别到我的爬虫?


 

三.浅析阿里云WAF爬虫识别

        阿里云爬虫防护是阿里云waf里面的一个比较强大的功能,在里面稍微配置下就能很有效的防范一些普通的爬虫了,他能通过很简便的设置就能实现地区ip封锁,爬虫识别,以及请求行为识别,人机验证等.特别是他里面的爬虫识别机制可以很好的识别相关编程语言的通用网络请求方法,如果请求方没有特殊操作的情况下他们能将爬虫请求识别限制到编程语言级别(具体为什么请听我后面娓娓道来),那常用的三板斧根本无法逃过他的火眼金睛.
        经过我好长时间的搜索,终于在一个不起眼的地方找到一篇文章介绍Https指纹加密算法的,终于让我茅塞顿开:https://www.1024sou.com/article/62481.html

 

四.神奇的Https Client Hello会话

        相信大家都还记得https的三次握手和四次挥手协议,这个机制保证了https的通讯稳定安全,下面我们来看看https的握手协议图:

        

第一次握手的clientHello报文协议中携带了客户端的ssl协议版本,Cipher支持的加密套件列表以及SSLExtention SSL的扩展内容集合,在不同的编程语言以及不同的工具中这些参数是不一定完全相同的,只需要基于这些报文信息按照一定的算法hash之后预生成一个指纹码,这样就能比较精准的识别请求的客户端或者编程语言了!

 

五.什么是ja3指纹算法

        ja3 是一种对传输层安全应用程序进行指纹识别的方法,TLS 及其前身 SSL 用于为常见应用程序和恶意软件加密通信,以确保数据安全,因此可以隐藏在噪音中。要启动 TLS 会话,客户端将在 TCP 3 次握手之后发送 TLS 客户端 Hello 数据包。此数据包及其生成方式取决于构建客户端应用程序时使用的包和方法。服务器如果接受 TLS 连接,将使用基于服务器端库和配置以及 Client Hello 中的详细信息制定的 TLS Server Hello 数据包进行响应。由于 TLS 协商以明文形式传输,因此可以使用 TLS Client Hello 数据包中的详细信息来指纹和识别客户端应用程序.这个是ja3在github上的地址,大家感兴趣的话可以去看看:https://github.com/salesforce/ja3

 

六.斗智斗勇,伪造签名绕过爬虫检测

        好了,到此为止事情已经明了了,阿里云能识别出爬虫或编程语言主要是因为他们已经将市面上大部分的客户端还有编程语言的网络请求库的https指纹预采集并录入到自己的爬虫数据库了,一旦网站所有者开启定向的工具或编程语言屏蔽,这样无论怎么样通过普通的方法都是无法绕过他的检测的.

        既然我们知道他是通过使用https的client hello协议里的报文生成的指纹,那么我们只需要在发起请求前微调cipher里的参数,就可以实现改变https指纹,来达到突破阿里云waf爬虫检测的目的了!下面我就以java里的netty请求框架来说明如何调整:

通过我们手动设置netty的ciphers来改变客户端指纹,经过实测可以完美突破waf的爬虫检测,然后在配合行为模拟以及代理ip基本可以无视waf了!
下面打个广告:https://github.com/monkeyWie/proxyee 这个是我参与开发的一个开源的java网络请求代理工具,可以实现代理请求,抓包以及突破waf等功能


        一点思考:既然爬虫识别是基于https指纹的,那这个指纹技术还可以用在哪些方面呢?自从前段时间我看到深信服的网络设备监听员工的上网记录之后我有了新的想法,我们都知道要监测https的协议必须是走代理转发模式,类似于中间人模式,这个模式下要获取http数据包的内容必须解包才行,流程就是用户发起请求->深信服解包请求->深信服发起请求->目标站点->响应->深信服->用户,在这个过程中涉及到数据包的加解密,这个过程会改变https指纹,只要我们用特定的已经预录指纹的工具发送探测请求到服务器,服务器拿到的指纹跟之前预录入的不相同就证明我们的通讯被监听了!

Pre: docker 安装gitlab

Next: 解决openwrt内核版本不一致,报错: cannot find dependency kernel (= 5.10.92-1-c53444f191b9b4a8400709ce9706b407)

96
Sign in to leave a comment.
No Leanote account? Sign up now.
0 comments
Table of content