大家好,我是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客户端
作者简介
我是TheWeiJun,有着执着的追求,信奉终身成长,不定义自己,热爱技术但不拘泥于技术,爱好分享,喜欢读书和乐于结交朋友,欢迎扫我微信与我交朋友💕
分享日常学习中关于爬虫及逆向分析的一些思路,文中若有错误的地方,欢迎大家多多交流指正💕
原文地址: 某美滑块验证码别乱捅!一不小心就反爬了。
微信搜公众号:逆向与爬虫的故事;给我一个关注!
原文链接:某云滑块验证码别乱捅!一不小心就反爬了。