某云滑块验证码别乱捅!一不小心就反爬了。
2023-11-7 20:3:51 Author: mp.weixin.qq.com(查看原文) 阅读量:11 收藏

大家好,我是TheWeiJun。在过去的两个月里,我一直在思考如何为大家呈现更有趣、有价值的内容。今天,我终于迎来了新的更新!本文将带你探索某云滑块验证码背后的奥秘,让你了解它的工作原理、应用场景以及相关技术。希望这篇文章能够为你带来新的见解和启发。感谢大家的支持,欢迎阅读!
特别声明:本公众号文章只作为学术研究,不作为其他不法用途;如有侵权请联系作者删除。

立即加星标

每月看好文

 目录

一、前言介绍
二、网站分析
三、参数分析
四、算法还原
五、思路总结

一、前言介绍

大家有没有想过,每次在网上注册账号或者登录时,那个熟悉的滑块验证码是如何识别我们是人而不是机器的呢?就像玩游戏一样,你需要在滑块上轻轻滑动,就能通过验证。但你可曾想过,这个看似简单的滑块背后,蕴含着怎样的科技奥秘?在本文中,我们将揭开滑块验证码的神秘面纱,一起探索它的工作原理,了解它是如何巧妙地识别真人身份的。在这个有趣的旅程中,我们将一窥技术背后的精妙,带你进入一个充满挑战和创新的数字世界。快来和我一起探索吧!

二、网站分析

1、抓包分析,打开我们本次分析的网站,故意触发滑块验证码,先不滑动。然后查看请求流程如下:

2、此刻我们能够看到滑块的http协议接口以及缺口图和背景图,我们可以从http请求的response中查看响应体进行确定。截图如下所示:

总结:观察上图,我们能够看到bg、front参数的value值分别对应截图中的背景图和缺口图。在这个接口中,我们甚至看到了sliderWidth滑块距离,我以为这个滑块如此简单,这个地方其实是混淆视线的。没有任何作用,且听我后面实战分析。

3、然后我们分析这个接口请求,是否需要逆向分析,截图如下:

4、然后拖动验证码缺口,直接拖动到正确位置,查看请求体和响应体,截图如下:

总结:结合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%;如果想要追求更高的通过率的话,可以进一步优化下图像识别和轨迹模拟这两方面。


五、思路总结

回顾整个分析流程,本次重点主要概括为以下几点:

  • AES CBC算法还原实现
  • 滑块缺口位置坐标定位
  • 滑块数组轨迹模拟生成
  • RSA算法及公钥还原实现

本篇分享到这里就结束了,欢迎大家关注下期文章,我们不见不散☀️☀️✌️

往期推荐

某美滑块验证码别乱捅!一不小心就反爬了。

深入探索Go语言net/http包源码:从爬虫的视角解析HTTP客户端

探秘迷雾背后:逆向短视频弹幕系统的奇妙之旅

数据解码:挑战不常见爬虫逆向分析,揭开数据迷雾的面纱

DX滑块验证码别乱捅!一不小心就反爬了。

如果想要获得更多精彩内容可以关注我朋友:

END

作者简介

我是TheWeiJun有着执着的追求,信奉终身成长,不定义自己,热爱技术但不拘泥于技术,爱好分享,喜欢读书和乐于结交朋友,欢迎扫我微信与我交朋友💕
分享日常学习中关于爬虫及逆向分析的一些思路,文中若有错误的地方,欢迎大家多多交流指正💕

点分享

点收藏

点点赞

点在看


文章来源: https://mp.weixin.qq.com/s?__biz=MzIzMTIzNTM0MA==&mid=2247492508&idx=2&sn=b68bc75cb311b703338561b431a0a9ec&chksm=e8a5e9ffdfd260e9ccc7824b1971f5b9c89ef71bb94ec774c4d72887aac0f87c1c020f9185aa&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh