立即加星标
每月看好文
一、前言介绍
二、网站分析
1、抓包分析,打开我们本次分析的网站,故意触发滑块验证码,先不滑动。然后查看请求流程如下:
2、此刻我们能够看到滑块的http协议接口以及缺口图和背景图,我们可以从http请求的response中查看响应体进行确定。截图如下所示:
总结:观察上图,我们能够看到bg、front参数的value值分别对应截图中的背景图和缺口图。在这个接口中,我们甚至看到了sliderWidth滑块距离,我以为这个滑块如此简单,这个地方其实是混淆视线的。没有任何作用,且听我后面实战分析。
3、然后我们分析这个接口请求,是否需要逆向分析,截图如下:
4、然后拖动验证码缺口,直接拖动到正确位置,查看请求体和响应体,截图如下:
三、参数分析
1、我们多次刷新滑块接口和验证接口,对上面截图中的五个参数初判断分析如下:
cb 一个随机值,长度11位字符。
i 加密值,具体什么加密,不清晰。
k 加密值,具体什么加密,不清晰。
token 上一个接口返回的参数。
captchald 固定值,和版本有关,可忽略。
总结:我们可以忽略token、captchald参数,只需要逆向分析cb、i、k即可完成对滑块算法的还原,接下来我们开始堆栈分析进行断点调试吧。
2、直接分析验证码接口,查看堆栈,定位js加密位置,截图如下所示:
3、打好断点后,再次触发验证码接口,查看xhr请求接口,截图如下:
4、此时加密参数已经生成,我们能够看到this.encrypt(e)的返回值就是我们想要的数据,经过回溯堆栈,我们确定加密位置如下:
总结:简单确认一下加密方式,i参数应该是AES-CBC模式加密,K参数应该是RSA加密,然后我们再确定下cb参数11位也是随机生成的,接下来进入算法还原环节。(附上cb参数的定位截图)
四、算法还原
1、确定i参数加密位置后,分析js代码,转换Python代码如下:
def encrypt_aes_cbc(self, text):
self.key: str = self.generate_random_string(16)
self.iv: str = self.generate_random_string(16)
# 使用AES算法和CBC模式创建加密器
cipher = AES.new(self.key.encode(), AES.MODE_CBC, self.iv.encode())
# 计算要添加的填充字节数
padding_length = 16 - (len(text) % 16)
# 添加填充字节,使用PKCS7填充
padded_text = text.encode() + bytes([padding_length] * padding_length)
# 对文本进行加密
ciphertext = cipher.encrypt(padded_text)
# 将加密结果转换为Base64字符串
encrypted_base64 = base64.b64encode(ciphertext).decode('utf-8')
return encrypted_base64
2、确定k参数加密位置后,分析js代码,转换Python代码如下:
def rsa_encrypt(self):
msg = f"{self.key}{self.iv}"
pub_obj = Cipher_pkcs1_v1_5.new(RSA.importKey(self.rsa_public_key))
encrypted = pub_obj.encrypt(msg.encode())
return base64.b64encode(encrypted).decode()
3、确定cb参数加密位置后,分析js代码,转换Python代码如下:
def generate_random_string(self, length):
# 定义包含英文大写字母和数字的字符集
characters = string.ascii_lowercase + string.digits
# 从字符集中随机选择length个字符并拼接起来
random_string = ''.join(random.choice(characters) for _ in range(length))
return random_string
4、到此第一步请求的接口我们已经还原完成,发送请求,看看能不能拿到验证码的响应,截图如下:
5、接下来分析verify接口,来看看验证接口的i,k加密是如何生成的,截图如下:
6、我们确定i参数的入参如上,然后用Python还原加密算法如下:
7、上面接口入参中,最重要的是distanceX坐标、points轨迹数据,继续用Python还原如下:
8、到这里整个流程就结束了,我们把代码封装完成后,和以往一样,发送20次请求,来看看通过率如何,截图如下:
总结:滑动成功率还是挺高的,19/20=95%;如果想要追求更高的通过率的话,可以进一步优化下图像识别和轨迹模拟这两方面。
五、思路总结
回顾整个分析流程,本次重点主要概括为以下几点:
往期推荐
某美滑块验证码别乱捅!一不小心就反爬了。
深入探索Go语言net/http包源码:从爬虫的视角解析HTTP客户端
探秘迷雾背后:逆向短视频弹幕系统的奇妙之旅
数据解码:挑战不常见爬虫逆向分析,揭开数据迷雾的面纱
DX滑块验证码别乱捅!一不小心就反爬了。
END
作者简介
点分享
点收藏
点点赞
点在看