閱讀341 返回首頁    go 阿裏雲 go 技術社區[雲棲]


模擬登陸知乎

模擬登陸知乎


模擬登陸的前提:

1、了解正常登陸的流程

2、了解正常登陸時用到的參數

3、理順出登陸流程,識別登陸時所需要的參數

4、構造登陸時需要的參數


首先填寫好帳號和密碼、填好驗證碼後,打開瀏覽器自帶的調試器Network-All,點擊登陸,查看name中的內容。


7416e457ff8187d8ff3718858aa87b6b6dcede85


我們可以看到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字段的值),所以我們把這個值獲取到就可以啦。

dcbcd6f26f28b78e6df5f336d213540f5d0ab964

獲取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後麵的一串數字為時間戳(別問我怎麼知道的,我在網頁源代碼中看到的)。


b127e75b2001c087b3ea91bef96a9782726c9f5e

為了避免本地獲取的時間與服務器端的時間不同步,所以此處時間戳timestamp的值取網頁中的值。

b6f58b4c584820bf738171d92abaa058c77f3f51


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

877a7e37ae73d9dd5fc0c41273c7b472101543de

在瀏覽器中我們可以看到驗證碼的是根據其所在的水平方向和垂直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

  上一篇:go  快速搭建phpwind論壇係統
  下一篇:go  學 Kotlin,看這一篇就夠了