Python如何利用Har文件进行遍历指定字典替换提交的数据详解


Posted in Python onNovember 05, 2020

利用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)

总结

到此这篇关于Python如何利用Har文件进行遍历指定字典替换提交的数据的文章就介绍到这了,更多相关Python用Har文件遍历指定字典替换提交的数据内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
浅谈Python基础之I/O模型
May 11 Python
python中强大的format函数实例详解
Dec 05 Python
对python模块中多个类的用法详解
Jan 10 Python
Python批量生成幻影坦克图片实例代码
Jun 04 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
Aug 17 Python
基于Python fminunc 的替代方法
Feb 29 Python
Python+redis通过限流保护高并发系统
Apr 15 Python
jupyter notebook tensorflow打印device信息实例
Apr 20 Python
使用python matploblib库绘制准确率,损失率折线图
Jun 16 Python
Pycharm github配置实现过程图解
Oct 13 Python
python跨文件使用全局变量的实现
Nov 17 Python
Python爬虫实战之爬取携程评论
Jun 02 Python
Python word文本自动化操作实现方法解析
Nov 05 #Python
Python自动化办公Excel模块openpyxl原理及用法解析
Nov 05 #Python
Python中用xlwt制作表格实例讲解
Nov 05 #Python
如何利用pycharm进行代码更新比较
Nov 04 #Python
python产生模拟数据faker库的使用详解
Nov 04 #Python
Django配置跨域并开发测试接口
Nov 04 #Python
Python基于Serializer实现字段验证及序列化
Nov 04 #Python
You might like
PHP正则验证Email的方法
2015/06/15 PHP
PDO::setAttribute讲解
2019/01/29 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
如何让easyui gridview 宽度自适应窗口改变及fitColumns应用
2013/01/25 Javascript
jQuery实现鼠标滑过Div层背景变颜色的方法
2015/02/17 Javascript
javascript 实现map集合
2015/04/03 Javascript
jQuery搜索框效果实现代码(百度关键词联想)
2021/02/25 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
javascript将json格式数组下载为excel表格的方法
2017/12/22 Javascript
微信小程序上传图片实例
2018/05/28 Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
2019/04/29 Javascript
vue-router两种模式区别及使用注意事项详解
2019/08/01 Javascript
在weex中愉快的使用scss的方法步骤
2020/01/02 Javascript
jQuery弹框插件使用方法详解
2020/05/26 jQuery
详解JavaScript之ES5的继承
2020/07/08 Javascript
用Python编写一个国际象棋AI程序
2014/11/28 Python
Python字符串和文件操作常用函数分析
2015/04/08 Python
Python实现图片转字符画的示例代码
2017/08/21 Python
在Python中使用gRPC的方法示例
2018/08/08 Python
pyqt5实现登录界面的模板
2020/05/30 Python
Python使用统计函数绘制简单图形实例代码
2019/05/15 Python
详解Python3除法之真除法、截断除法和下取整对比
2019/05/23 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
2019/12/04 Python
opencv resize图片为正方形尺寸的实现方法
2019/12/26 Python
HTML5单页面手势滑屏切换原理
2016/03/21 HTML / CSS
人力资源作业细则
2014/03/03 职场文书
战友聚会策划方案
2014/06/13 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
应届生简历自我评价
2015/03/11 职场文书
元旦晚会主持词开场白
2015/05/28 职场文书
千与千寻观后感
2015/06/04 职场文书
光荣之路观后感
2015/06/12 职场文书
导游词之安徽巢湖
2019/12/26 职场文书
总结python多进程multiprocessing的相关知识
2021/06/29 Python
Java8 CompletableFuture 异步回调
2022/04/28 Java/Android