一、数据接口分析
主页地址:某巢
1、抓包
通过抓包可以发现在登录时,网站首先请求captcha/querySlideImage/来获取滑块验证码的图片,然后请求captcha/checkCode/接口来验证滑块验证码。滑块验证码校验成功后,请求noshiro/getPublicKey来获取PublicKey,然后发送/passport/login请求来登录。
2、判断是否有加密参数
2.1、请求参数是否加密?
(1)querySlideImage
这个接口是用来获取滑块验证码的,虽然这个接口不携带参数,但是这个接口的路径中包含了一个随机加密值(下文简称为img_url_code
)。
(2)checkCode
这个接口是用来校验滑块验证码的,同样路径中也有img_url_code
,但是可以发现此处的img_url_code
与querySlideImage接口请求图片时携带的一致。同时,这个接口还携带了参数(下文简称为img_params
)。
(3)login
此接口是登录接口,通过查看“载荷”可以发现,此接口有两个加密参数password
和verifyCode
,其中verifyCode
参数是滑块验证码校验成功后接口返回的,所以不需要关心。
2. 请求头是否加密?
无
3. 响应是否加密?
无
4. cookie是否加密?
无
二、加密位置定位
1、img_url_code
通过添加XHR断点,然后点击“登录”按钮获取滑块验证码,断点断到之后,进行跟栈。然后就可以发现img_url_code
的生成位置。
2、img_params
因为这个请求参数,是一整个加密字符串,所以我们可以通过hookJSON.stringify
。运行hook代码后,滑动滑块验证码,发现可以断到,然后进行跟栈,可以发现加密位置。可以发现网站是在此处对传入的参数中的data
使用JSON转换为字符串,然后进行加密,且此处类似于AES的ECB模式加密。
再次向上跟栈,可以发现上述的方法的传参中有三个属性sign
、track
、aesKey
。其中track
可以看出来就是滑动滑块时的轨迹,aesKey
是在获取滑块验证码的接口响应中,sign
的生成就在函数调用的上方。
3、password
通过查看启动器,然后点击submitFn
进入,可以发现加密位置。
三、扣代码大致思路
1、第一步
先将img_url_code
的生成方法扣出,此方法就是一个生成随机字符串的方法。然后将img_url_code
拼接在路径上,发送请求获取滑块验证码。
2、第二步
拿到滑块验证码的响应后,除了两个图片的路径需要保存以外,路径中的img_url_code
以及响应中的checkId
、clientIp
、key
、pointY
也需要保存。
3、第三步
请求滑块验证码的图片,并获取到缺口的x值,然后结合pointY
生成一组轨迹列表,然后生成sign
。
通过观察就可以发现,sign
的生成是将clientIp
、checkId
、img_url_code
以及轨迹列表进行相加,然后使用MD5进行加密生成sign
。
3、第四步
将上一步生成的data
使用JSON转成字符串,然后使用aesKey
进行AES的ECB模式加密。
4、第五步
滑块验证码验证成功之后,就可以请求getPublicKey接口,获取PublicKey,然后将密码进行RSA加密,加密之后请求login接口即可。