写在前面
本人没有深入钻研过前端技术,JS属于亚文盲水平,这篇分析的目的是分享解决解决问题的思路。
- 提出假设,证明它或推翻它,如果推翻,就再提出一个新的假设。该走的弯路,一米都不能少
- 抛开所有不可能的,剩下的,不管多么匪夷所思,那都是事实
- 坚信JS是纯客户端逻辑,理论上一定可破解,需要的是时间和耐心
- 凡是不能杀死你的,最终都会让你更强
问题描述
智联招聘企业端登陆,输入验证码后,点击验证按钮,抓包获得以下请求
https://passport.zhaopin.com/chk/verify?callback=jsonpCallback&MmEwMD=12quxKHKjs0Ueapv9t.fUcurtt8lkuPKNW.iigEyOYlrTOxwONa0ImcCQ8gvRZic3MnqU1WUPdIESozanNi1FCB38raqp0l5vVLXlYgSCIWxh6rR.3q0lK304tlBMH49LDm8FUL4hkfboCm_lhWv9qO7coH_FfFRY1fC8xIZ7_NljGkOJvIWaaUFwhGF2SVwN58UkzX6GuABWNvbUzzVVq5Kzj45tS_p4U2fo.re9LOuwPpp99H5bLKIgmNsI_RALV39ujuLsqhbHTJAgCtQeZzOkhMbjJKciuKPp97TkbIpDpGr_ZqTBghcjRgr_gz1CkGCCoUTn24dIPfVB0tTDenbTTuOot.rT_RmTiIsA0zY5ac445PXgJZXaXHxrV_ASY0
问题:如何构建MmEwMD参数?
初步分析
查看智联招聘login页面的相关JS文件,分析query param的构建方法
scripts/chk/captcha.js
从上图中我们可以看到调用JQuery的$.ajax方法来发送请求,发送的url只有 callback
一个query param,并没有看到 MmEwMD
的踪迹,说明不是在zhilian自己的JS文件中加这个参数,猜测是给JQuery加了 prefilter
或者 beforeSend
之类的钩子
构建本地JS Debug环境
-
通过
wget
抓取html和相关资源文件wget --mirror --page-requisites --adjust-extension --no-parent --convert-links --directory-prefix=sousers https://passport.zhaopin.com/org/login
-
使用python启动simple web server
python -m SimpleHTTPServer 8081
-
访问本地login页面
http://localhost:8081/org/login.html
-
智联招聘使用的JQuery版本是1.7.1,我们从官网下载非min版本方便debug。下载完成后放到script目录下,然后修改login.html中include script代码
http://code.jquery.com/jquery-1.7.1.js
Debug JQuery
// Do send the request // This may raise an exception which is actually // handled in jQuery.ajax (so no try/catch here) xhr.send( ( s.hasContent && s.data ) || null );
从 scripts/chk/captcha.js
的 $.ajax
入手一路debug进去,直到上面这行代码,我们inspector xhr对象发现,并没有任何JQuery的钩子,此时,我们怀疑xhr (XMLHttpRequest) 被hook了。
验证方法如下:
在浏览器console中执行以下代码
var xhr = new window.XMLHttpRequest(); xhr.open('POST','/hello',true); xhr.send('abc');
出现了以下请求,说明在当前页面中的xhr肯定被hook了,同时解除对JQuery的怀疑。
POST http://localhost:8081/hello?MmEwMD=1zXMRFfiFy00rBpdSoJ2cJ4EvS6mQ1dvl5jZLrqB…oRVu5t.x8Y3GVQLmqdG.lmuE2snbEk.YH