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 相关文章推荐
linux下python抓屏实现方法
May 22 Python
Python写的一个定时重跑获取数据库数据
Dec 28 Python
python下读取公私钥做加解密实例详解
Mar 29 Python
Python爬虫之xlml解析库(全面了解)
Aug 08 Python
对python内置map和six.moves.map的区别详解
Dec 19 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
Jan 22 Python
Python 虚拟空间的使用代码详解
Jun 10 Python
使用python 写一个静态服务(实战)
Jun 28 Python
python将时分秒转换成秒的实例
Dec 07 Python
python 使用while循环输出*组成的菱形实例
Apr 12 Python
windows支持哪个版本的python
Jul 03 Python
Python通过m3u8文件下载合并ts视频的操作
Apr 16 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中用数组的方法设置cookies
2011/04/21 PHP
php 广告调用类代码(支持Flash调用)
2011/08/11 PHP
php 变量引用与变量销毁机制详细介绍
2016/12/05 PHP
php异步:在php中使用fsockopen curl实现类似异步处理的功能方法
2016/12/10 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
EXT中xtype的含义分析
2010/01/07 Javascript
再谈querySelector和querySelectorAll的区别与联系
2012/04/20 Javascript
jquery中获取id值方法小结
2013/09/22 Javascript
原始XMLHttpRequest方法详情回顾
2013/11/28 Javascript
jQuery实现跟随鼠标运动图层效果的方法
2015/02/02 Javascript
JavaScript 变量、作用域及内存
2015/04/08 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
详解ECMAScript6入门--Class对象
2017/04/27 Javascript
nodejs socket实现的服务端和客户端功能示例
2017/06/02 NodeJs
npm配置国内镜像资源+淘宝镜像的方法
2018/09/07 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
2018/09/14 Javascript
Javascript实现秒表倒计时功能
2018/11/17 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
Python 面向对象 成员的访问约束
2008/12/23 Python
python实现DES加密解密方法实例详解
2015/06/30 Python
在CMD命令行中运行python脚本的方法
2018/05/12 Python
对python requests的content和text方法的区别详解
2018/10/11 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
python获取当前文件路径以及父文件路径的方法
2019/07/10 Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
2020/04/28 Python
Django 权限管理(permissions)与用户组(group)详解
2020/11/30 Python
兰蔻俄罗斯官方网站:Lancome俄罗斯
2019/12/09 全球购物
Python面试题:如何用Python来发送邮件
2016/03/15 面试题
大三学习计划书范文
2014/05/02 职场文书
领导班子党的群众路线对照检查材料
2014/09/25 职场文书
2015年推普周活动总结
2015/03/27 职场文书
中国文明网2015年“向国旗敬礼”活动网上签名寄语
2015/09/24 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书
详解thinkphp的Auth类认证
2021/05/28 PHP
Redis过期数据是否会被立马删除
2022/07/23 Redis