標籤:
1.工作需求
有很多事項,每個事項分為:名稱、種類。時間等,需要把每個事項逐個輸入到網頁中並提交。
如果用人肉操作的話,流程就是先登入到網站後台,點擊“添加”——>輸入各項內容——>點擊“儲存”。然後重複這個動作100遍。
2.設想的解決辦法
對手工“登入”、“添加”、“儲存”的全過程進行抓包,擷取整個流程提交的資料,然後將其POST到伺服器。
3.具體操作
3.1 抓取並分析操作時的資料
使用Chrome瀏覽器,開啟所需登入的頁面:http://222.000.36.113/ ,並輸入帳號與密碼:
然後按下鍵盤的F12,瀏覽器彈出“開發人員工具”的介面,選擇"Network":
然後將滑鼠移回登入視窗,點擊“登陸”。然後“開發人員工具”介面會出現POST和GET的檔案與資料,找出登入對應的檔案,點選Header標籤。
此時在Form Data裡面能看到POST到伺服器的參數(純文字密碼,汗):
登入進去之後,點擊“添加”按鈕,出來一個表單介面,讓填寫內容。開始填寫各項內容ing(只是內容一部分):
辛苦填完之後,點擊“儲存”。內容就儲存在了伺服器中。
此時在“開發人員工具”裡面就能看到點擊“儲存”按鈕後,瀏覽器的行為:
這次POST的資料類型和登入時的不同了(見紅色方框)。
登入時是Form Data,而提交時卻是Request Payload。
(這一點在之後的操作中難倒了我。我不會用Python的Requests模組提交這些資料。因為我不知道如何加上Cookie)
以上就是登入+提交的全程。
3.2編程實現
3.2.1 類比登入擷取Cookie
經過我多次實驗,發現提交這些資料需要用到Cookie。i所以先類比登入擷取Cookie:
import httplibimport urllib#定義要求標頭reqheaders={‘Content-type‘:‘application/x-www-form-urlencoded‘,‘Accept‘:‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8‘,‘Host‘:‘222.000.36.113‘,‘Origin‘:‘http://222.000.36.113‘,‘Referer‘:‘http://222.000.36.113/login_loginOut.fdo‘,‘User-Agent‘:‘Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36‘,}#定義post的參數reqdata={‘tnnd‘:‘abcdef‘,‘tmmd‘:‘mimaqqq‘}
#對請求參數進行編碼data=urllib.urlencode(reqdata)#串連到伺服器conn=httplib.HTTPConnection(‘222.143.36.113‘)#提交登入的post請求conn.request(‘POST‘, ‘/login_loginIn.fdo‘, data, reqheaders)#列印伺服器返回要求標頭中設定的cookieprint(res.getheader(‘Set-Cookie‘))
3.2.2類比提交
所需提交的Request Payload屬於 Multipart-Encoded 格式,在Python的文檔裡有記載:
http://docs.python-requests.org/en/latest/user/quickstart/#post-a-multipart-encoded-file
文檔中的操作方法是:
url = ‘http://httpbin.org/post‘files = {‘file‘: open(‘report.txt‘, ‘rb‘)}r = requests.post(url, files=files)r.text
其中 report.txt 裡面就是的Request Payload 下方的一長串字元內容。
(可是我按照文檔進行操作的時候不成功,是因為伺服器需要Cookie而我沒加上?那麼Requests這個方法怎麼加上Cookie呢?)
於是我使用了多年前滲透測試中的一個技巧:
a.先把瀏覽器提交過程中所有POST的內容全部抓了下來,儲存為“1.txt”。用的是WSockExpert。
b.使用NC,“nc 222.000.36.113 80 < 1.txt”,把txt的內容全部提交到目標伺服器。
經測試,此方法可行。但要注意兩點:
一是Cookie要有效。可以由類比登入的步驟中擷取。
二是1.txt 的編碼格式為UTF-8,不然提交的內容全是亂碼!
(第二條當時百思不得其解,最終人肉測試了出來。最後才發現response headers寫的是charset=UTF-8,忽略了,汗)
那就用Python來調用NC吧:
import osos.system("nc 222.000.36.113 80 < 1.txt")
剩下的工作,就是將各個事項匯總到一起,然後用Python將對應的事項內容替換到1.txt的那一套格式裡面,逐個提交100次!
PS:
如何用Python提交這個Request Payload。調用NC太不優雅了。
Python結合NC.exe 實現類比登入&批量填表