动机
闲来无聊,想找点东西玩玩。正好校园网的帐号总是不够用,往届的帐号不注销,所以刷一刷帐号,顺便熟悉一下网络相关的编程。
找资料
刷帐号和刷课的逻辑是类似的,就在网上找刷课的博客,选了一篇作为参考。
动手
看网页源码
要想刷帐号,最重要的是先找到与网站进行交互的方法。包括url、method、表单信息。幸好之前有html的基础,不然看起来也是要爆炸。
从网页源码中定位找到了要传输的表单信息,用户名 <input class="input" name="username" id="username" style="border: none; font-size: 16px; display: none;" tabindex="0" type="text" tipinfo="Username" value="">,密码 <input name="pwd" class="input" id="pwd" type="password" style="border: none; display: none;" tabindex="0" tipinfo="Password" value="">,提交按钮 <a id="loginLink" tabindex="-1" onclick="this.className='loginButtonHKClicked_1';doauthen();"> <div id="loginLink_div"></div> </a>。
提交按钮这个地方不是用的form表单,而是用javascript创建的XMLHttpRequest向如武器发送请求。所以再重点看一下这个doauthen()函数,里面的具体逻辑就是获取各种参数信息,将这些信息拼起来之后发送给服务器。发送给服务器的核心逻辑如下:
|
|
AuthInterFace是javascript的一个函数对象
|
|
波折
- 一开始尝试直接将网页代码下载下来,然后将对应的表单信息写成固定的,结果发现服务器不给我响应。
- 然后就想知道为啥不给我响应,就和正常的网页请求进行对比,使用chrome浏览器的审查元素功能,里面有个“network”标签,能在每次网络请求之后将所有的请求信息记录下来。
- 比对正常的网页和我下载的本地网页,发现了一个问题,正常网页的表头信息有一个referer和origin,而下载的本地网页中没有referer,origin值为null。在网上查到说服务器发现origin不是服务器的地址时会拒绝跨网服务。
- 然后,直接改用java发送http请求,用的httpclient。在使用HttpPost的时候,设置referer和origin
httpPost.setHeader("referer","http://210.77.16.21/eportal/index.jsp?wlanuserip=0bc386d9e643d188b011a0d00c9b5c40&wlanacname=5fcbc245a7ffdfa4&ssid=&nasip=2c0716b583c8ac3cbd7567a84cfde5a8&mac=53ba540bde596b811a6d5617a86fa028&t=wireless-v2&url=2c0328164651e2b4f13b933ddf36628bea622dedcc302b30"); httpPost.setHeader("origin","http://210.77.16.21");
总结
犹豫了这么久,终于把这玩意做出来了。其实最麻烦的地方就在审查html源码,找到url和action,然后找到所有的参数信息。其次就是对网络编程不是很熟悉,这次也是直接在网上找的demo。最后就是在真正发送请求的时候,有一个跨网服务的问题,还好比对了请求信息,找到的问题所在,不然也能卡死。
这玩意还可以做的更加高端一些,现在只是有一些固定猜测的密码,对所有的帐号进行尝试。以后可以弄一个密码字典,对密码进行暴力破解,不过比较耗时,暂时没有需求。