어떻게 WebClient를 이용하여 CSRF가 제어하는 사이트에 시뮬레이션하여 로그인합니까
15231 단어 client
CSRF에 익숙하지 않은 분들은 G 형이 왜 그런지 여쭤봐도 돼요. 여기 간단하게 소개해 드릴게요.CSRF는 일반적으로 폼 페이지에 숨겨진 도메인을 놓고 폼이 제출될 때 서버가 POST에서 온 NAVEVALUE에 이 도메인이 포함되어 있는지 검증하는 동시에 값을 검증합니다.
문제가 생겼다. 이런 상황에서 우리가 서버에 포스팅한 데이터는 어떻게 쓰는가. HTML을 보면 이 NAME가 무엇인지, 그리고 그 VALUE가 무엇인지 알 수 있지만, 이 VALUE는 일반적인 상황에서 매번 닦을 때마다 변한다.그럼 됐어. 우리 포스트 할 때 어떻게 얻지?
인터넷에서 흔히 볼 수 있는 웹 Request 방법은 틀림없이 안 될 것이다. 왜냐하면 그들은 모두 이 종류로 먼저 하나의 Stream을 얻고 이 Stream에 우리가 서버에 포스팅해야 하는 데이터를 기록하기 때문이다. 그러나 이때 우리는 이 CSRF의 값을 몰랐기 때문이다. 포스팅은 과거에 틀림없이 잘못되었을 것이다.이론적으로 말하자면 우리는 먼저 GET를 한 번 한 다음에 스스로 GET가 도착한 이 HTML을 해석하여 CSRF의 값을 얻어야 한다. 그러나 다음에 우리는 다시 WebRequest에 간다.Creat가 POST에 가려고 했을 때, 이때 다시 방문한 셈이다. CSRF 값이 바뀌었기 때문에 이 길은 통하지 않는 것 같다.
다행히도 우리는 WebClient를 이용할 수 있다. WebClient는 우리로 하여금 하나의 실례를 유지하게 할 수 있다. 그러나 WebRequest는 정적 방법을 통해서만 만들어지고 URL을 바꾸어 같은 목적을 달성할 수 없다. 이곳도 NET4에서 마이크로소프트가 새로운 HttpClient를 내놓은 목적일 것이다. 이것은 HTTP 접근 인터페이스의 강호를 통일하는 데 사용될 것이다.
자, 우리가 지금 해야 할 일은 WebClient를 계승하고 해당하는 방법을 다시 쓰는 것입니다. 코드는 다음과 같습니다.
1 public class CookieAwareWebClient : WebClient
2 {
3 public string Method;
4 public CookieContainer CookieContainer { get; set; }
5 public Uri Uri { get; set; }
6
7 public CookieAwareWebClient()
8 : this(new CookieContainer())
9 {
10 }
11
12 public CookieAwareWebClient(CookieContainer cookies)
13 {
14 this.CookieContainer = cookies;
15 this.Encoding = Encoding.UTF8;
16 }
17
18 protected override WebRequest GetWebRequest(Uri address)
19 {
20 WebRequest request = base.GetWebRequest(address);
21 if (request is HttpWebRequest)
22 {
23 (request as HttpWebRequest).CookieContainer = this.CookieContainer;
24 (request as HttpWebRequest).ServicePoint.Expect100Continue = false;
25 (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";
26 (request as HttpWebRequest).Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
27 (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");
28 (request as HttpWebRequest).Referer = "some url";
29 (request as HttpWebRequest).KeepAlive = true;
30 (request as HttpWebRequest).AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
31 if (Method == "POST")
32 {
33 (request as HttpWebRequest).ContentType = "application/x-www-form-urlencoded";
34 }
35 }
36 HttpWebRequest httpRequest = (HttpWebRequest)request;
37 httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
38 return httpRequest;
39 }
40
41 protected override WebResponse GetWebResponse(WebRequest request)
42 {
43 WebResponse response = base.GetWebResponse(request);
44 String setCookieHeader = response.Headers[HttpResponseHeader.SetCookie];
45
46 if (setCookieHeader != null)
47 {
48 //do something if needed to parse out the cookie.
49 try
50 {
51 if (setCookieHeader != null)
52 {
53 Cookie cookie = new Cookie();
54 cookie.Domain = request.RequestUri.Host;
55 this.CookieContainer.Add(cookie);
56 }
57 }
58 catch (Exception)
59 {
60
61 }
62 }
63 return response;
64 }
65 }
사실 가장 중요한 것은 쿠키 컨테이너를 잘 이용하는 것이다.다음은 어떻게 사용하는지입니다. 우리는 먼저 로그인 페이지를 방문하여 HTML을 받은 다음에 정규든 바꾸든 이 CSRF의 VALUE를 받은 후에 그에 상응하는 서버를 포스팅해야 합니다.
1 var cookieJar = new CookieContainer();
2 CookieAwareWebClient client = new CookieAwareWebClient(cookieJar);
3
4 // the website sets some cookie that is needed for login, and as well the 'lt' is always different
5 string response = client.DownloadString("url for get");
6 string regx = "<input type=\"hidden\" id=\"lt\" name=\"lt\" value=\"(?<PID>\\S+?)\" />";
7 // parse the 'lt' and cookie is auto handled by the cookieContainer
8 string token = Regex.Match(response, regx).Groups[1].Value;
9 string urlforlogin = "url for login";
10 string postData =
11 string.Format("username={0}&password={1}<={2}", "user", "pass", token);
12 client.Method = "POST";
13 response = client.UploadString("url for login", postData);
14
15 client.Method = "GET";
여기서 우리는 끝낼 수 있다. 후기는 서로 다른 URL을 바꾸어 DownloadString에 가는 것이다. 속칭 파충류라고 하는데 다음은 서로 다른 업무에 따라 서로 다른 데이터 분석을 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Web] HTTP란 무엇인가 - 1Hypertext는 쉽게 말해 하이퍼링크가 들어간 텍스트, 한 문서에서 다른 문서로 즉시 접근할 수 있는 텍스트라고 이해하면 된다. Hypertext가 쓰인 기술 중 가장 중요한 두 가지가 바로 HTML과 HTTP이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.