如何模擬登陸添加了CSRF保護的網站


上次寫了篇文章,內容是如何利用WebClient模擬登陸CSRF控制的網站,回復中有人還是不理解,現在另開一篇,打算說說用Python如何來登陸。

開寫之前,先說下為什么webrequest不行,常規情況下,我們在利用webrequest的時候,都是如下的形式:

 1 string url = "loginurl";
 2 StringBuilder sb = new StringBuilder();
 3 sb.Append("username=un");
 4 sb.Append("&password=up");
 5 sb.Append("&service=sv");
 6 HttpWebRequest requestget = (HttpWebRequest)WebRequest.Create(url);
 7 byte[] postData = Encoding.UTF8.GetBytes(sb.ToString());
 8 using (Stream stream = requestget.GetRequestStream())
 9 {
10     stream.Write(postData, 0, postData.Length);
11 }
12 WebResponse reponse1 = requestget.GetResponse();
13 StreamReader sr2 = new StreamReader(reponse1.GetResponseStream(), Encoding.UTF8);
14 string html2 = sr2.ReadToEnd();

可關鍵是我們POST過去的數據並沒有服務器所認可的CSRF值,在GetResponse處就會報錯,要是我們在上面第六行后面添加如下代碼:

1 WebResponse reponseget = requestget.GetResponse();
2 StreamReader sr = new StreamReader(reponseget.GetResponseStream(), Encoding.UTF8);
3 string html = sr.ReadToEnd();
4 string regx = "<input type=\"hidden\" id=\"lt\" name=\"lt\" value=\"(?<PID>\\S+?)\" />";
5 string token = Regex.Match(html, regx).Groups[1].Value;
6 sb.Append("&lt=" + token);

先獲得其值,並加入到postdata的stringbuild中,其它不變,當執行到GetRequestStream的時候,會報System.Net.ProtocolViolationException的錯誤,此時如果你重新create一個httpwebrequest又會導致csrf值失效。這些就是在模擬登陸具有CSRF保護網站時碰到的問題,所以才有第一篇文章重寫WebClient來達到。

今天碰巧在寫Python代碼,就想利用Python看看怎么來做這樣帶保護的模擬登陸,簡單說來,代碼如下:

 1 from urllib.parse import urlencode
 2 url = 'somurl'
 3 r,c = h.request(url,'GET')
 4 sc = c.decode('utf-8')
 5 import re
 6 regx = r'<input type="hidden" id="lt" name="lt" value="(\S+?)" />';
 7 pm = re.search(regx,sc)
 8 csrf = pm.group(1)
 9 body = {'username':'user','password':'pass','lt':csrf,'service':'url'}
10 r,c = h.request(url,'POST',body=urlencode(body))
11 print (c.decode("UTF-8"))

感覺還是滿簡單的。當然我們也還是要利用cookie來達到目的,上面是主要的代碼,大家可以參考下。

變量h的定義如下:

1 h = httplib2.Http('.cache')

可以看到,用的是httplib2這個庫。在Python中推薦用其來代替標准庫的http客戶端。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM