alarm2016-06-03 faceyejinmo
注:此方法仅适用于拥有 default6.aspx 页面的正方教务系统,即无验证码的页面
我们打开 http://教务网站/default6.aspx ,可以看到此页面登录不需要验证码,也就是说我们只需要模拟登陆,成功获取到 cookie ,便可一步步的走下去抓出所有所需的数据。
首先使用抓包工具分析,得出POST出去的数据(精力有限此部分不做介绍,可使用浏览器自带的F12或WireShark抓包分析)
在登录的POST分析中,有两个值值得我们关注: __VIEWSTATE 以及 ASP.NET_SessionId
其中 __VIEWSTATE 隐藏在网页中,使用正则即可轻松获取
而 ASP.NET_SessionId 则由服务器生成,当我们请求数据的时候,直接提取 ASP.NET_SessionId 即可
首先我们添加所需引用:
using System; using System.IO; using System.Net; using System.Text; using System.Text.RegularExpressions;
打开首页获取 cookie 及 __VIEWSTATE 核心部分代码:
string cookie = string.Empty;
string __VIEWSTATE = string.Empty;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"http://" + HOST_IP + "/default6.aspx");
request.CookieContainer = new CookieContainer();
request.Referer = @"http://" + HOST_IP + "/default6.aspx";
request.Accept = "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.Headers["Accept-Language"] = "zh-CN,zh;q=0.";
request.Headers["Accept-Charset"] = "GBK,utf-8;q=0.7,*;q=0.3";
request.UserAgent = "User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1";
request.KeepAlive = true;
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
Regex regResult__VIEWSTATE = new Regex("name=\"__VIEWSTATE\" value=\"(.+?)\"");
MatchCollection mcResul__VIEWSTATEt = regResult__VIEWSTATE.Matches(retString);
Match mc__VIEWSTATEt = mcResul__VIEWSTATEt[0];
__VIEWSTATE = mc__VIEWSTATEt.Groups[1].Value;
cookie = "ASP.NET_SessionId=" + response.Headers["Set-Cookie"];
Regex regResultSessionId = new Regex("ASP.NET_SessionId=(.+?); path=/");
MatchCollection mcResulSessionId = regResultSessionId.Matches(cookie);
Match mc = mcResulSessionId[0];
cookie = mc.Groups[1].Value;
myStreamReader.Close();
myResponseStream.Close();
if (string.IsNullOrEmpty(cookie) || string.IsNullOrEmpty(__VIEWSTATE))
return ReturnResult("Login Error");
当我们成功获取 cookie 及 __VIEWSTATE 便可进行模拟登陆操作
其中我们需要对所需POST的数据进行格式化操作
string postDataStr = string.Format("__VIEWSTATE={0}&tname=&tbtns=&tnameXw=yhdl&tbtnsXw=yhdl%7Cxwxsdl&txtYhm={1}&txtXm={2}&txtMm={2}&rblJs=%D1%A7%C9%FA&btnDl=%B5%C7+%C2%BC", __VIEWSTATE.Replace("+", "%2B").Replace("=", "%3D").Replace("/", "%2F"), username, password);
模拟登陆操作核心部分代码:
string postDataStr = string.Format("__VIEWSTATE={0}&tname=&tbtns=&tnameXw=yhdl&tbtnsXw=yhdl%7Cxwxsdl&txtYhm={1}&txtXm={2}&txtMm={2}&rblJs=%D1%A7%C9%FA&btnDl=%B5%C7+%C2%BC", __VIEWSTATE.Replace("+", "%2B").Replace("=", "%3D").Replace("/", "%2F"), username, password);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://" + HOST_IP + "/default6.aspx");
request.Method = "POST";
request.Referer = "http://" + HOST_IP + "/default6.aspx";
request.Host = HOST_IP;
request.Headers["Origin"] = "http://" + HOST_IP;
request.Headers["Upgrade-Insecure-Requests"] = "1";
request.Accept = "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
request.Headers["Accept-Language"] = "zh-CN,zh;q=0.8";
request.Headers["Accept-Charset"] = "GBK,utf-8;q=0.7,*;q=0.3";
request.Headers["Cookie"] = cookie;
request.UserAgent = "User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1";
request.KeepAlive = true;
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postDataStr.Length;
Stream myRequestStream = request.GetRequestStream();
StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312"));
myStreamWriter.Write(postDataStr);
myStreamWriter.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (!response.ResponseUri.ToString().EndsWith(username))
return ReturnResult("username or password error.");
如果一切顺利,此时我们已经成功登录,服务器已将此 cookie 标记为有效登录状态,我们只要带着此 cookie 请求数据便可一路绿灯
需要注意的是, [Referer] 标头,此标头代表着网页的跳转源是哪里,通过此地址来做出一些浏览限制
篇幅有限,请点此下载完整代码
此完整代码为CGI程序,具体用法自行百度吧 = =
无非就是传参返回数据了。。。