广州网站开发公司排名,衡水网站建设培训学校,威海做网站的公司有哪些,什么是网页设计规范逆向目标
目标#xff1a;某验四代滑块验证码#xff0c;w 参数逆向主页#xff1a;aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v加密算法#xff1a;RSA、AES
通讯流程 验证码流程分析
进入网页后#xff0c;打开开发者人员工具进行抓包#xff0c;点击滑动拼图验证#xff0c…逆向目标
目标某验四代滑块验证码w 参数逆向主页aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v加密算法RSA、AES
通讯流程 验证码流程分析
进入网页后打开开发者人员工具进行抓包点击滑动拼图验证此时还未点击按钮开始验证抓到了一个名为 load?captcha_idxxx 的包Query String Parameters 包含了一些参数 captcha_id验证码 id固定值由 adaptive-captcha-demo.js 文件生成后文分析challenge动态变化由 gtc4.js 文件生成后文分析client_type表示 web 端risk_type验证码类型例如滑块为 slide无感为 ailang语言callbackgeetest_ 时间戳主要作用是防止缓存。
响应预览中返回的关键内容如下相较于三代底图未做混淆 bg背景图片地址captcha_type验证码类型gct_pathgct4 文件路径lot_number后续生成 pow_msg、w 的关键参数payload后续 verify 请求接口需要的参数datetimeISO 8601扩展格式的日期后续生成 pow_msg 的关键参数process_token后续 verify 请求接口需要的参数slice滑块图片地址。
点击按钮开始验证弹出滑块验证码滑动滑块抓包到 verify?captcha_idxxxQuery String Parameters 同样包含了一些参数 captcha_id与 load 接口请求头中的 captcha_id 一致client_type表示 web 端lot_numberload 接口返回的risk_type与 load 接口中的一致表示验证码类型payloadload 接口返回的process_tokenload 接口返回的w加密参数由轨迹、滑动时间、滑动距离、userresponse、device_id、pow_msg 等参数加密得到callbackgeetest_ 时间戳主要作用是防止缓存。
响应预览中返回的内容如下result 值为 fail 即校验失败success 为校验通过通过后携带 seccode 下的参数进行后续业务请求 逆向分析
captcha_id 参数
全局搜索 captcha_id跟进到 gt4.js 文件中 进去后在第 307 行打上断点刷新页面即会断住此时 captcha_id 参数的值已经生成同时 challenge 参数定义在下一行 向上跟栈到 value即 adaptive-captcha-demo.js 文件中会发现其是个固定值实际上这个值是每个网站不一样是管理员在极验后台申请得到的 challenge 参数
前面提到challenge 参数定义在 captcha_id 参数的下一行在 gt4.js 文件的第 309 行打下断点 可以看到challenge 参数的值由 uuid 函数生成扣出即可。
w 参数
从 verify?captcha_idxxx 接口的堆栈处跟栈进去 打下断点滑动滑块断住后向上跟栈到 s 处如果做过某验三代滑块的话第 6249 行有个很熟悉的东西\u0077: r\u0077 即字母 w 的 Unicode 值r 即 w 参数的值 r 参数定义在第 6237 行e 也是跟三代类似的参数r 是将 i 参数和转为字符串的 e 参数加密得到的 向上跟栈找到 e 参数中各部分定义生成的位置跟到 $_BHIH 中_ 中先生成了四个键值对 passtime 和 track 是熟悉的滑动时间和轨迹setLeft 为识别出来的缺口距离userresponse 定义在 19593 行 a 为 setLeft 参数的值t[$_GDFCG(1909)] 为定值 1.0059466666666665 JavaScript
复制代码
a / t[$_GDFCG(1909)] 2
接着跟到 $_BCFj 中e 定义在第 6201 行下面几行定义了 e 中的 device_id、lot_number、pow_msg、pow_sign device_id 同一个网站是固定值lot_number 是 load 响应返回的控制台打印一下 pow_msg、pow_sign 的结果 pow_msg 很明显是由几部分组成的pow_sign 经过加密向上跟栈到 init 中分别定义在第 5837 行和第 5838 行为 d 字典的键根据键名取值 d 定义在第 5835 行这部分还原一下就很明显了 JavaScript
复制代码
var c t[toDataURL]()[replace](data:image/png;base64,, ) , _ new w[default][MD5]()[hex](c); a[options][deviceId] _; var h a[options] , l h[powDetail] , p h[lotNumber] , f h[captchaId] , d v[default](p, f, l[hashfunc], l[version], l[bits], l[datetime], )
跟进到 v[default] 中函数定义在第 6945 行于 6978 行打下断点 pow_msg 由 _ h 得到_ 定义在第 6960 行 JavaScript
复制代码
_ i | r | n | s | t | e | o |;
il[version]rl[bits]nl[hashfunc]sl[datetime]tf, h[captchaId]ep, h[lotNumber]o
h 定义在第 6269 行跟进去是 16 位随机数字符串pow_sign 为 p就是 pow_msg 经过 MD5 加密得到的 至此这四个也分析完了还差以下这部分 em 等定值就不分析了注意 kqg51557244628这个参数值和三代滑块中一样每隔几个小时会改变向上跟栈到 $_BCFj 中在第 6207 行打下断点此时 e 中这个值还未生成 下一行打下断点下步断点即执行完 n[$_CBHIE(791)](e); 后这个参数值就生成了证明是 n[$_CBHIE(791)] 方法生成的跟进去 跳转到第 5766 行在第 5779 行打下断点此时的 n 中还未生成此参数 执行了 _gct(n) 后即生成 可见其生成位置在 _gct 方法中跟进去后到 gct4.js 文件和三代大差不差 可以将值导出至此 e 就分析完了接着回到第 6238 行跟进到加密函数 d[$_CBHHO(84)] 中定义在第 11669 行d[$_DIEHS(177)](c) u 即 r 参数的值c 为一个大数组u 明显也经过加密了所以 r 参数的值就是数组 c 加密后再加上 u 得到的 先跟进到 u其定义在第 11705 行解混淆后如下 JavaScript
复制代码
u new l[default]()[encrypt](i);
所以 u 是 i 经过加密后得到的i 定义在第 11702 行 JavaScript
复制代码
i (0,d[$_DIEIq(103)])()
跟进到 d[$_DIEIq(103)] 中定义在第 852 行又是熟悉的 16 位随机数 i 是随机数跟进到加密函数 l[($_DIEHS(84))] 中在第 12725 行于 12741 行打下断点可以看到这里就是个 RSA 加密扣代码或者直接引库即可 回到 c 参数c 参数的值为一个大数组其定义在第 11705 行解混淆后内容如下 JavaScript
复制代码
var c s[a][symmetrical][encrypt](e, i);
e 之前分析完了i 为随机数两个参数已经分析完了跟进到加密方法中在第 12174 行于 12186 行打下断点控制台打印一下混淆部分内容很熟悉的东西这里就是 AES 加密iv 为初始向量加密模式为 CBC对各类加密算法不熟悉的可以阅读 K 哥文章 【爬虫知识】爬虫常见加密解密算法 c 参数最后又被 d[$_DIEHS(177)] 函数加密跟进后定义在第 547 行直接扣下来改改即可 结果验证