Chinaunix首页 | 论坛 | 博客
  • 博客访问: 402674
  • 博文数量: 69
  • 博客积分: 3005
  • 博客等级: 中校
  • 技术积分: 900
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-07 11:31
文章分类

全部博文(69)

文章存档

2011年(2)

2010年(7)

2009年(32)

2008年(28)

我的朋友

分类: 系统运维

2009-11-20 13:28:51

   西安交大外网验证分析
                                    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) |
给主人留下些什么吧!~~

chinaunix网友2009-11-26 21:47:35

什么动动

chinaunix网友2009-11-22 11:08:41

为什么状态老是网络正常为未验证啊?

chinaunix网友2009-11-21 22:21:04

膜拜

chinaunix网友2009-11-20 17:58:14

晕,这样卡住回复2遍,该死的网络啊,万恶的noc...

chinaunix网友2009-11-20 17:53:24

wangqx 到此膜拜大牛,留名