python使用requests庫提交multipart/form-data請求的方法詳解
前言
今天滲透測試的時候,發(fā)現(xiàn)一個接口可以越權遍歷出用戶的敏感信息,然后想編寫python腳本將所有信息都給dump下來。當我查看請求數(shù)據(jù)的時候,是如下這樣的。不同于之前的請求數(shù)據(jù)是json可以直接使用data然后封裝成字典就可以進行發(fā)送請求

這里的content-type是 multipart/form-data
multipart/form-data
Multipart/form-data其實就是上傳文件的一種方式。我對它的翻譯是 “多部分表單數(shù)據(jù)” ;在生活中其實經常用到,比如說,在寫郵件時,向郵件后添加附件,附件通常使用表單添加,也就是用multipart/form-data格式上傳到服務器。
http協(xié)議本身的原始方法其實并不支持multipart/form-data請求,它是由post方法來組合實現(xiàn)的
- multipart/form-data與post方法的不同之處(請求頭,請求體)
- multipart/form-data的請求頭必須包含一個特殊的頭信息:Content-Type,且其值也必須規(guī)定為multipart/form-data,同時還需要規(guī)定一個內容分割符用于分割請求體中的多個post的內容,如文件內容和文本內容自然需要分割開來,不然接收方就無法正常解析和還原這個文件了。
multipart/form-data的請求體也是一個字符串,不過和post的請求體不同的是它的構造方式,post是簡單的name=value值連接,而multipart/form-data則是添加了分隔符等內容的構造體,格式如下:
------WebKitFormBoundaryA0Srut8TBztAofvx Content-Disposition: form-data; name="grant_type" password ------WebKitFormBoundaryA0Srut8TBztAofvx
其中第一行是自定義的分割符,需要與請求頭中規(guī)定的分割符相同。
其實根據(jù)前言中的例子,可以很容易看出,這個請求體是多個類似的部分組成的:每一個部分都是以–加分隔符開始的,然后是該部分內容的描述信息,然后一個回車,然后是描述信息的具體內容;如果傳送的內容是一個文件的話,那么還會包含文件名信息,以及文件內容的類型。最后會以–分割符–結尾,表示請求體結束。
Python 發(fā)送 multipart/form-data
如下,我們要模擬post如下的數(shù)據(jù)包,那我們如何發(fā)送post的數(shù)據(jù)攜帶以下紅色框中的參數(shù)了?

1. 重要代碼如下
data = {"id":(None,'899')}
requests.post(xx,files=data)2. headers中的Content-Type需要注釋掉,發(fā)送請求的時候會被自動加上,否則會報錯

編寫的python requests請求腳本如下

運行然后使用proxychains抓取流量如下,成功模擬的請求發(fā)送

再次提醒:Content-Type需要注釋掉!很重要!!1
補充知識:multipart/form-data 參數(shù)轉碼
比如請求參數(shù)是:
--e0ed233c-3202-47c6-9c96-f9181e308 Content-Disposition: form-data; name="id" Content-Transfer-Encoding: binary Content-Type: application/json; charset=UTF-8 Content-Length: 13 234545878 --e0ed233c-3202-47c6-9c96-f9181e308 Content-Disposition: form-data; name="type" Content-Transfer-Encoding: binary Content-Type: application/json; charset=UTF-8 Content-Length: 1 1 --e0ed233c-3202-47c6-9c96-f9181e308--
也就是說,有2個 key -> id 和 type
fields={
"id": '234545878',
"type": '1'
}
直接這樣發(fā)請求,會失敗。??
encode一下就能發(fā)請求了。??
from requests_toolbelt.multipart.encoder import MultipartEncoder
multipart_data = MultipartEncoder(
fields={
"id": '1653302392217',
"read_duration_list": read_duration_list,
"now": now,
"type": '1'
}
)
header['Content-Type'] = multipart_data.content_type
header['accept'] = 'application/json'
總結
到此這篇關于python使用requests庫提交multipart/form-data請求的文章就介紹到這了,更多相關python提交multipart/form-data請求內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
把JSON數(shù)據(jù)格式轉換為Python的類對象方法詳解(兩種方法)
本文通過兩種方法給大家介紹了把JSON數(shù)據(jù)格式轉換為Python的類對象,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-06-06
python使用redis模塊來跟redis實現(xiàn)交互
這篇文章主要介紹了python使用redis模塊來跟redis實現(xiàn)交互,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-06-06
python使用pika庫調用rabbitmq參數(shù)使用詳情
這篇文章主要介紹了python使用pika庫調用rabbitmq參數(shù)使用詳情,文章通過展開文章主題分享了三種方式,具有一定的參考價值,需要的朋友可以參考一下2022-08-08
用pandas劃分數(shù)據(jù)集實現(xiàn)訓練集和測試集
這篇文章主要介紹了用pandas劃分數(shù)據(jù)集實現(xiàn)訓練集和測試集,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07

