模拟登陆知乎
模拟登陆知乎
模拟登陆的前提:
1、了解正常登陆的流程
2、了解正常登陆时用到的参数
3、理顺出登陆流程,识别登陆时所需要的参数
4、构造登陆时需要的参数
首先填写好帐号和密码、填好验证码后,打开浏览器自带的调试器Network-All,点击登陆,查看name中的内容。
我们可以看到captcha.gif?r=3562789056789字样(很明显是加载的验证码),以及email字样,点击email可以看到数据包中的内容:
登陆时请求的URL:https://www.zhihu.com/login/email
登陆时post的参数为:_xsrf、password、captcha、captcha_type、email
下面来一一解释post参数的意义:
_xsrf:了解csrf漏洞的同学肯定会理解_xsrf参数的意义,它是为了给提交的表单添加个难以猜的随机值,用来防止恶意构造的请求被触发后成功执行
password:没错你猜对了,就是登陆密码
capcha:验证码
captcha_type:验证码的类型,这个可以在网页源代码,或者是数据包中看到,这里是固定值cn
email:没错你又猜对了,这个就是登陆帐号
post数据包中的password、captcha_type、email参数可控,那么我们接下来要解决的问题就是获得_xsrf以及capcha的值。
想要定位到一个参数最初出现的位置,那么我们就需要从最初开始访问这个URL开始,从下图中我们可以看到,在第一次请求网站时,响应包中的cookies中设有_xsrf参数,结合burp我们可以观察到,在接下来的流程中,_xsrf的值固定为初始请求回来的值(即图中cookies中_xsrf字段的值),所以我们把这个值获取到就可以啦。
获取xsrf参数值的代码如下:
import re
import requests
r = requests.get(url="https://www.zhihu.com",headers = headers,verify =False)
s= str(r.cookies)
pattern = r'_xsrf=(.*?) for'
_xsrf = re.findall(pattern,s,re.S|re.I)
xsrf = _xsrf[0]
接下来我们要获取的便是captcha的值,在浏览器中(下图)可以看到captcha图片的地址https://www.zhihu.com/captcha.gif?r=xxxxxxxx&type=login&lang=cn,
我们知道r后面的一串数字为时间戳(别问我怎么知道的,我在网页源代码中看到的)。
为了避免本地获取的时间与服务器端的时间不同步,所以此处时间戳timestamp的值取网页中的值。
import re
import requests
r = requests.get(url="https://www.zhihu.com",headers = headers,verify =False)
pattern_captcha_timestmp =r'<script type="text/json" data-name="ga_vars">{"user_created":0,"now":(.*?),'
ss = r.content
_captcha_timestmp = re.findall(pattern_captcha_timestmp,ss,re.S|re.I)
timestamp = _captcha_timestmp[0]
captcha_url =base_url + '/captcha.gif?r=' +timestamp + "&type=login&lang=cn"
print "captcha_url:%s" %captcha_url
获取到captcha的地址后,我们便要把验证码图片读取出来,然后手工输入验证码便可以完成模拟登陆。
读取验证码(请求验证码回来后将其写入本地文件):
session =requests.session()
captcha_f = session.get(captcha_url,headers=headers)
with open ('captcha.jpg','wb') as f:
f.write(captcha_f.content)
f.close

在浏览器中我们可以看到验证码的是根据其所在的水平方向和垂直fang位置的
#!/usr/bin/python
#-*-coding:UTF-8-*-
‘’‘
#coding:gooyii
#date:20170606
’‘’
import requests
import re
#base information
base_url = "https://www.zhihu.com"
login_email = '/login/email'
email = "xxxx"
password = "xxxx"
#base header
headers_base = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,zh-TW;q=0.2',
'Connection': 'keep-alive',
'Host': 'www.zhihu.com',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36',
'Referer': 'https://www.zhihu.com/',
}
r = requests.get(url=base_url,headers = headers_base,verify =False)
#get_xsrf
s= str(r.cookies)
pattern = r'_xsrf=(.*?) for'
_xsrf = re.findall(pattern,s,re.S|re.I)
xsrf = _xsrf[0]
#new headers with xsrftoken
headers_base['X-Xsrftoken'] = '%s' %(xsrf)
headers = headers_base
#get captcha_url
pattern_captcha_timestmp =r'<script type="text/json" data-name="ga_vars">{"user_created":0,"now":(.*?),'
ss = r.content
_captcha_timestmp = re.findall(pattern_captcha_timestmp,ss,re.S|re.I)
timestamp = _captcha_timestmp[0]
captcha_url =base_url + '/captcha.gif?r=' +timestamp + "&type=login&lang=cn"
print "captcha_url:%s" %captcha_url
#write captcha as captcha.jpg
session =requests.session()
captcha_f = session.get(captcha_url,headers=headers)
with open ('captcha.jpg','wb') as f:
f.write(captcha_f.content)
f.close
def location(a,b):
a = 20 * int(a) +2
b = 20 * int(b) +2
if b != 0 :
captcha = "{\"img_size\":[200,44],\"input_points\":[[%s,26.45],[%s,29.45]]}" %(int(a),int(b))
else:
captcha = "{\"img_size\":[200,44],\"input_points\":[[%s,26.45]]}" % (a)
return captcha
#input captcha relate_location
locationa = raw_input("input captcha location 1:")
locationb = raw_input("input captcha location 2:")
captcha = location(locationa,locationb)
url = base_url + "/login/email"
data = {'_xsrf':xsrf,'password':password,'captcha':captcha,'captcha_type':'cn','email':email}
#requests 的session登录,以post方式,参数分别为url、headers、data
content = session.post(url= url,headers =headers,data=data)
print content.text
if "\u767b\u5f55\u6210\u529f" in content.text:
print "login successful !"
最后更新:2017-06-07 01:01:49