本篇文章给大家分享的是有关在Python利用Har文件实现遍历并指定字典替换提交的数据的方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
成都创新互联公司从2013年成立,是专业互联网技术服务公司,拥有项目成都网站制作、成都做网站、外贸营销网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元新林做网站,已为上家服务,为新林各地企业和个人服务,联系电话:13518219792利用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下可以看到所有请求的地址及参数 可以删除一些不必要的请求让程序更快运行 pd 设置上传数据 字段名:值 或者 字段名:字典 if=xxx 如果内容是xxx那就记录 可多个用||隔开 ifnot=xxx 如果内容不是xxx哪就记录 可多个用||隔开 ifend=xxx 如果内容是xxx那就记录并结束 可多个用||隔开 out=xx.txt 输出记录到文件 see=on|off 查看每次尝试破解响应 Current request method have: GET/POST *且目前不支持http请求头带 RFC 标识 (RFC-eg: ':method':'POST')可以检查是否有 md5=XXX 将 指定字段名的值进行md5加密再暴力破解 一般=password||passwd||pwd ... th=5 设置5个线程同时运行 版本警告: 《!》: 切勿用作违法使用,仅供渗透测试,如非法使用该工具与作者无关。 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() #系统存储 kPMd5={}; #用户参数设定 pds=[]; ifC=[];# 最小优先级 ifN=[];# 其二优先级 ifE=[];# 较大优先级 otFile=""; ascMD5=[]; testsee="off"; see="off"; th=0; #因为我不太喜欢指令的参数化模块 所以我直接写了个硬代码 注: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)>%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文件实现遍历并指定字典替换提交的数据的方法-创新互联
文章源于:http://cdweb.net/article/cdsgji.html其他资讯