当前位置:w88优德官网网文章中心网站开发其他 → WebClient模拟登陆CSRF的教程

WebClient模拟登陆CSRF的教程

减小字体 增大字体 作者:admin  来源:www.cuoxin.com  发布时间:2015-12-3 23:55:05
一般我们都是利用WebRequest这个类来向服务器进行数据的POST,不过很多情况下相应的服务器都有验证,看你是不是登陆,是不是来自同一个域,这些都简单,我们可以更改其属性来达到欺骗服务器。不过如果服务器做了CSRF控制,那我们怎么办?不熟悉CSRF的可以问下G哥此为何物,这里简单介绍下。CSRF常规来讲是在表单页里放一个隐藏域,然后在表单提交的时候服务器验证POST过来的NAVEVALUE里面是不是包含此域,同时如果包含验证其值。问题来了,在这种情况下我们POST到服务器的数据怎么写,虽然我们可以查看HTML来得知这个NAME是什么以及它的VALUE是什么,但是这个VALUE一般情况下每刷一次都是会发生变化的。那好了在我们POST的时候怎么来得到它呢?网上常见的那些WebRequest方法肯定不行,因为它们都是用这个类先获得一个Stream,在这个Stream里面写入我们要POST到服务器的数据,可这个时候我们还不知道这个CSRF的值呢,POST过去肯定出错。理论上来讲我们要先GET一次,然后自己办法解析GET到的这个HTML,得到CSRF的值,可是接下来我们再去WebRequest.Creat打算去POST的时候,此时相当于又重新访问了一遍,它的CSRF值已经变了,看来此路不通啊。好在我们还有WebClient可以利用,WebClient可以让我们保持一个实例即可,而WebRequest只有通过静态方法创造出来,不能通过变化URL来达到使用同一个的目的,此处可能也是在NET4里微软推出全新HttpClient的目的,用来一统HTTP访问接口的江湖。好了,我们现在需要做的就是继承WebClient,重写相应方法,代码如下:public class CookieAwareWebClient : WebClient    {        public string Method;        public CookieContainer CookieContainer { get; set; }        public Uri Uri { get; set; }
        public CookieAwareWebClient()            : this(new CookieContainer())        {        }
        public CookieAwareWebClient(CookieContainer cookies)        {            this.CookieContainer = cookies;            this.Encoding = Encoding.UTF8;        }
        protected override WebRequest GetWebRequest(Uri address)        {            WebRequest request = base.GetWebRequest(address);            if (request is HttpWebRequest)            {                (request as HttpWebRequest).CookieContainer = this.CookieContainer;                (request as HttpWebRequest).ServicePoint.Expect100Continue = false;                (request as HttpWebRequest).UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.5 Safari/537.36";                (request as HttpWebRequest).Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";                (request as HttpWebRequest).Headers.Add(HttpRequestHeader.AcceptLanguage, "zh-CN,zh;q=0.8,en;q=0.6,nl;q=0.4,zh-TW;q=0.2");                (request as HttpWebRequest).Referer = "some url";                (request as HttpWebRequest).KeepAlive = true;                (request as HttpWebRequest).AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;                if (Method == "POST")                {                    (request as HttpWebRequest).ContentType = "application/x-www-form-urlencoded";                }            }            HttpWebRequest httpRequest = (HttpWebRequest)request;            httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;            return httpRequest;        }
        protected override WebResponse GetWebResponse(WebRequest request)        {            WebResponse response = base.GetWebResponse(request);            String setCookieHeader = response.Headers[HttpResponseHeader.SetCookie];
            if (setCookieHeader != null)            {                //do something if needed to parse out the cookie.                try                {                    if (setCookieHeader != null)                    {                        Cookie cookie = new Cookie();                         cookie.Domain = request.RequestUri.Host;                        this.CookieContainer.Add(cookie);                    }                }                catch (Exception)                {
                }            }            return response;        }    }可以看出,其实最关键的还是利用好CookieContainer这个类。接下来就是如何使用了,我们需要首先访问一次登陆页面,拿到HTML然后正则也好替换也好,拿到这个CSRF的VALUE,然后再将其POST相应的服务器。var cookieJar = new CookieContainer();            CookieAwareWebClient client = new CookieAwareWebClient(cookieJar);
            // the website sets some cookie that is needed for login, and as well the 'lt' is always different            string response = client.DownloadString("url for get");            string regx = "<input type=\"hidden\" id=\"lt\" name=\"lt\" value=\"(?<PID>\\S+?)\" />";            // parse the 'lt' and cookie is auto handled by the cookieContainer            string token = Regex.Match(response, regx).Groups[1].Value;            string urlforlogin = "url for login";            string postData =                string.Format("username={0}&password={1}<={2}", "user", "pass", token);            client.Method = "POST";                        response = client.UploadString("url for login", postData);
            client.Method = "GET";到此我们就可以结束,后期就是变化不同的URL去DownloadString了,俗称爬虫,接下来就可以根据不同的业务做不同的数据分析了。

本文引用网址:
在下列搜索引擎中搜索“WebClient模拟登陆CSRF的教程”的相关信息:
谷歌搜索 百度搜索 360搜索 雅虎搜索 搜狗搜索 搜搜搜索 必应搜索 有道搜索
你可能还喜欢以下文章
  • 1王梦溪未经处理雅照120P完整艳...
  • 2合肥艳照门视频 合肥艳照门全套...
  • 3如何做爱真人示范图片 男女ML常...
  • 4王梦溪未经处理照曝光 王梦溪口...
  • 5怎么做爱舒服?真人示范做爱姿...
  • 1女性18岁身份证号大全 成年女人...
  • 2DEDE"模板文件不存在,无法解...
  • 3帝国cms搜索表单制作语法-帝国...
  • 44月20日免费送QQ号,5位QQ,6位...
  • 5织梦dedecms 忘记管理员后台密...
  • 1什么姿势女的最爽?最刺激的做...
  • 2兰州警花王梦溪裸照全集视频 王...
  • 3合肥艳照门事件 合肥艳照门全套...
  • 4中国女大学生的淫靡生活
  • 5嫩白少妇与猛男户外疯狂车震遭...
  • 1linux服务器在运行210天左右宕...
  • 2通过组策略和注册表关闭win7 U...
  • 3基于反向代理的Web缓存加速现代...
  • 4解决configure: error: OpenSS...
  • 5如何做服务器安全维护?有哪些...
  • 赞助商广告

    图片文章导读