温馨提示:阅读本文章大约需要10分钟
验证码、http请求、js逆向分析
先说背景,几天前有同学遇到一个不常见的验证码,通常我们见到的验证码多是在X轴横向移动,如下图图一所示,但是这个验证码有点不一样,它不仅可以在X轴移动,也可以在Y轴移动,如下图二所示。网页相关链接为:http://www.gkzj.com:81/login.html。大家可以自行测试。


根据上述背景所描述的,影刀现有的验证码自定义指令集就不太适用了,移动滑块只会在X轴,那么用纯影刀的方式就需要自己写一个流程了,这里主要的逻辑是调用验证码识别指令,返回缺口的纵坐标、横坐标的位置后,确认可移动滑块在屏幕中的位置坐标,然后经过两个坐标的相加得出移动的轨迹,再调用按下鼠标、移动鼠标、松开鼠标就可以了,思路确认,上代码~

不过需要注意的是,验证码返回的缺口坐标要考虑你自己的屏幕缩放比例进行除法运算,然后得到你屏幕实际的坐标值。
虽然经典思路可以解决这个问题,但是总有点“一力降十会”的感觉,这个验证码背后的逻辑是什么我们不得而知,有没有更加好玩的方法呢?本着这个想法,我们分析下页面元素,F12打开开发者模式查看下这个验证码是怎样的工作原理。
打开谷歌浏览器自带的网络监听,刷新下页面我们发现这个验证码图片是从一个后台接口返回的,如下图所示。

我们点击“启动器”选项发现这个验证码图片的js调用都指向了一个叫“anti-bot-js.js”js文件。

我们单击文件名进行跳转就进入到了这个文件调试环境,如图所示:

到这思路就清晰很多了,这个js的函数名竟然没有进行混淆!!!打开百度翻译,一个一个的看每个函数的含义,最终定位到这个函数,如下图所示,这不明显的是验证程序嘛(有点出乎意料的顺利~~)

里面的一些参数名也没有加密,老方法,开始打断点,故意拖错验证码看看他的逻辑是怎样的。打断点分析发现,标出来的位置发起了一次get请求,同时拼接传递了两个参数x,y。很明显,参数也没有加密,原来的未知参数t就是你拖拽后滑块的x坐标,e就是拖拽后滑块的y坐标。

再结合调试过程中出现的变量,基本上到这已经真相大白了,这里函数的作用是获取你拖拽后滑块的坐标位置,然后通过get请求返回给网站的服务器,服务器去处理你拖拽后的坐标是否跟我给你发送的缺口位置的坐标基本上一致,如果一致,就给你返回个参数“1”告诉前端网页通过了验证可以放行,否则就给你返回个参数“0”告诉前端网页没有通过验证,然后给你返回个重新生成的验证码。我们回到网络监听,验证下我们的想法。

果然,发起了个验证请求,那么接下来思路就简单了,我是不是不用拖拽滑块,只需要给他发起个http请求,请求里面带上x,y坐标就可以了呢?思路成立,上代码~

不算打印日志,三行代码搞定,这里注意仍然要换算下你的DPI,比如我的屏幕缩放比时150%,那么验证码识别后的结果我就除1.5,另外这里是字符串类型,别忘记转换下。接下来我们验证下是否可行。
随便输入一个账号密码,如果我没有通过验证会这样提示:

我这里运行下代码再看看~,如下图所示,返回结果是1,证明我们通过了验证,这时候我们点击登录,就会提示我们的账号密码错误,至此用一种取巧的办法突破该验证码。

后来在另外一个交流群,有一个刀友提供了图片识别的思路,这个验证码或许有更多的方法突破,欢迎大家评论区补充。