西安交大外网验证分析
by Echo <>
最早的验证是访问一个网页,填写用户名,密码,然后把QQ挂上,就可以了。这种方法虽然很土,但是实践证明还是可用的。我手机用自带浏览器可以顺利打开这个验证网页。再把手机QQ一登陆,就可以上网了。
后来换了一个验证,界面变了,和图书馆、电信、移动无线网络的认证类似的一个网页,估计是网络设备提供商提供的认证方法。该系统非常垃圾,经常掉线,我用手机登陆两分半钟准时掉线,为此NOC在BBS被骂的狗血喷头。这段时间我很少在宿舍上网,没有分析这个认证方法。
目前的验证过程如下:
1)访问一个外部网页。比如;
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*..Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 570; QQPinyinSetup 612; .NET CLR 2.0.50727; InfoPath.2)
Host:
Connection: Keep-Alive
2)这时服务器会返回如下的验证网页。
和最早的验证差别不大,稍微汉化了一下,以前的那个界面都是英文的。
HTTP请求的状态码是401,HTTP header如下所示:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Fortigate
Content-Length: 1167
Connection: Keep-Alive
Cache-Control: no-cache
Content-Type: text/html
返回的网页里面比较重要的信息是magic码,一个十六位的十六进制字串,后面的登陆过程要使用,比如这个请求的magic码是:0209f2fd1e7462fe。通过正则表达式或者CString的Find方法很容易找到这个magic码。
3)收到验证网页后需要使用用户名和密码还有前面的magic码一起登陆。向服务器发送一个POST请求。如下所示:
POST / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer:
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 570; QQPinyinSetup 612; .NET CLR 2.0.50727; InfoPath.2)
Host:
Content-Length: 93
Connection: Keep-Alive
Cache-Control: no-cache
magic=0209f2fd1e7462fe&username=user&password=pass&4Tredir=
比较重要的是上面的数据部分,有四个字段,第一个是magic码,第二个是用户名,第三个是密码,最后一个是请求的网页。
4)服务器的response header如下所示,可以看出,状态码依然是401,
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Fortigate
Content-Length: 1276
Connection: Keep-Alive
Cache-Control: no-cache
Content-Type: text/html
网页如下:
代码如下:
防火墙上网认证系统保持活动窗口
本窗口用来保持您的认证会话的有效性。
请保持该窗口处于打开状态,打开一个 新的窗口 继续访问。
认证在0秒后自动刷新
断开网络
|
返回的网页中有一段JS代码来定时刷新,时间间隔默认为200秒,保持连接的URL为:
""
注销验证的URL为:
""
这两个都是需要提取的有用信息,前面的服务器和端口目前还没有变化,后面的magic码需要每次提取。提取了这两个有效信息,每隔200秒向发送心跳请求就可以保持连接了。
5)注销验证:GET这个URL就可以注销验证
""
HTTP header如下。
GET /logout?080b0a0a0103041c HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 570; QQPinyinSetup 612; .NET CLR 2.0.50727; InfoPath.2)
Host: 202.117.1.124:1000
Connection: Keep-Alive 至此,一个完整的登陆验证过程结束。
评价:
从上面的分析可以看出,现在的验证系统设计逻辑上是没有问题的。通过浏览器的JS代码控制浏览器自动刷新来保持连接,似乎也没有什么问题,还能跨平台,再仔细想想就有问题了:浏览器的种类远远比操作系统多,他们对JS的支持也参差不齐,有的浏览器出现断线情况也就不足为奇了,反正我手机的浏览器就从来没有正常过。还有一个问题:大多数浏览器都不能最小化到系统托盘,开着一个没有用的网页实在是太碍眼。所以才有了各种验证软件。
验证软件优势如下:
1)可靠。
2)资源占用小。
3)可以最小化到系统托盘。
劣势是跨平台性稍差,后面有我用VS2005实现的一个客户端:AuthXJTU,还不是很完善,但是已经可以使用了。用Java写客户端虽然可以跨平台,但是就为了这么一个破验证开那么大的Java虚拟机,怎么想都不舒服。当然,在Linux下面用Python脚本很容易搞定,所以这不是问题。
验证软件说明
用户,密码:输入用户名和密码
验证:开始验证外网
隐藏:隐藏窗口到系统托盘
保存:保存用户名和密码
删除:删除用户名和密码
注销:停止验证外网
关于:关于本程序
状态说明:
未验证: 刚启动,还没有验证外网
网络正常未验证: 可以上外网,但是没有验证,网络随时会断掉
网络正常验证正常: 正常状态,可以上外网,程序自动验证
网络错误: 发生错误,需要重新启动运行。
AuthXJTU v1.0的源代码见下面链接:
|
文件: |
AuthXJTU.zip |
大小: |
81KB |
下载: |
下载 | |
有什么问题可以给我留言或者发邮件。
阅读(3579) | 评论(6) | 转发(0) |