某学习平台验证码参数逆向分析
这是某学习平台进行签到时所需要完成的验证码,以防止脚本工具自动签到
先清理一下请求,然后战术性试错,发现在完成滑动后会发送一个请求到服务器,现在查看一下这个请求中包含了什么参数
可以发现有比较多的参数,除去明显为常量的参数,剩下的参数有captchaId, token, textClickArr以及iv,_则明显为精确到毫秒的unix时间戳
这里盲猜textClickArr为滑动滑块的x轴距离,经过数次滑动证明,该参数的值与滑动距离为正比,最小值为-8,最大值为272,所以这里可以到时候训练一个AI模型,识别残缺滑块的位置,然后通过等比缩放计算出x再传回服务器就行
那么现在需要解决的问题就成了如何拿到滑块验证的图片,以及剩下的三个变量参数。
可以从网页请求中发现图片名称也是一个随机变量
以0828E3343B916F70262131FBEC07E198.jpg这张图为例,通过搜索可以发现图片的地址包含在一个请求返回体中,并且返回了验证所需要的token
请求参数中则又附带了captchaId, captchaKey, token, referer, iv参数,这里不多赘述captchaId和referer参数,因为后期调试的时候发现captchaId是在js里面写死的,referer这条url参数是通过cookies合成的,cookies很好获得,所以主要工作是逆向出js代码,解决captchaKey, token和iv参数
好,现在进入逆向工作。这里需要通过逆向分析来获取请求验证码图片所需参数,这里以captchaKey为突破口进行全局搜索,可以轻松在load.min.js中找到captchaKey参数,同时附带了其他请求所需要的参数。但是稍微看了一下load.min.js之后,发现这个网站很狗啊,所有代码全部都被混淆加密了。
先使用工具进行js反混淆,下面是反混淆之后的代码。
再看captchaKey,是通过_0x422ded 这个变量进行赋值的,而_0x422ded 则是由_0x4c771b(_0x4e0309 + _0x11dbad()) 进行赋值,而_0x4e0309是这个函数传入的值,在该函数进行断点,可以发现传入的是unix时间戳,那么剩下的_0x11dbad(),在文件中搜索可以找出函数本体。
_0x11dbad() 函数本体如下,然后试着扒下来多调用几次进行输出,看着有点像uuid,比较随机
接着返回load.min.js,那么现在captchaKey的生成机制清晰了一点,即将unix时间戳和一串随机生成的uuid进行拼接,然后通过_0x4c771b函数进行处理。在以下代码中还可以发现,不仅是captchKey,token和iv也是通过_0x4c771b这个函数进行处理得到的,所以最后一步就是逆向出这个加密函数了。
继续往上扒,_0x4c771b函数由_0x2a7ef0赋值而来
那么再继续往上,得到了_0x2a7ef0函数,但是发现这个函数签名中并没有接收变量。可能是代码里面偷偷使用arguments参数。再把他复制到自己的js中进行运行,并试着传入参数123456。
缺少变量,那就接着扒
还是缺少,继续
这里成功运行了,返回了一个函数,再试着把返回的函数赋值给一个变量再进行调用
非常成功,输出很正常,那么这个加密函数算是被逆向出来了
再尝试验证一下这个函数是否正确调用,利用抓包工具进行数据重写,把这个内部加密函数进行全局变量赋值
和刚刚扒下来的函数输出一模一样,那么这一步算是成功了
再返回去进行参数的分析,观察发现captchaKey为unix时间戳与随机uuid进行拼接再通过加密函数进行加密,token为unix时间戳+captchaId+type+captchaKey字符串拼接再通过函数加密,然后与字符:和加了300000的unix时间戳进行拼接,iv则为captchaId+type+unix时间戳+随机uuid然后函数加密。这样所有的参数都出来了。
思路有了,参数也都逆向出来了,直接js写代码开干,把url拼接起来
url生成成功,请求也成功了,没有提示非法参数。
到这里就已经基本结束了。
万事俱备,只差炼丹,后面只需要把代码转移到python,批量获取图片,进行数据标注,训练一个AI识别的模型,计算滑块移动位置,再将数据打包发送回验证服务器,然后就可以完成带验证码的自动签到了!