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的Django框架中的缓存控制
Jul 24 Python
浅析Python中元祖、列表和字典的区别
Aug 17 Python
Python内置模块hashlib、hmac与uuid用法分析
Feb 12 Python
Python3实现转换Image图片格式
Jun 21 Python
python 接收处理外带的参数方法
Dec 03 Python
linux查找当前python解释器的位置方法
Feb 20 Python
python opencv minAreaRect 生成最小外接矩形的方法
Jul 01 Python
python使用flask与js进行前后台交互的例子
Jul 19 Python
pytorch简介
Nov 11 Python
python爬取youtube视频的示例代码
Mar 03 Python
python - asyncio异步编程
Apr 06 Python
写一个Python脚本下载哔哩哔哩舞蹈区的所有视频
May 31 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版(1)
2006/10/09 PHP
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
PHP+swoole实现简单多人在线聊天群发
2016/01/19 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
2016/01/22 PHP
学习PHP Cookie处理函数
2016/08/09 PHP
php unicode编码和字符串互转的方法
2020/08/12 PHP
JavaScript 异步调用框架 (Part 1 - 问题 &amp; 场景)
2009/08/03 Javascript
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
2011/01/12 Javascript
js实现图片淡入淡出切换简易效果
2016/08/22 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
2016/09/27 Javascript
js数组去重的hash方法
2016/12/22 Javascript
jQuery实现复制到粘贴板功能
2017/02/11 Javascript
Axios学习笔记之使用方法教程
2017/07/21 Javascript
基于Cookie常用操作以及属性介绍
2017/09/07 Javascript
vue.js添加一些触摸事件以及安装fastclick的实例
2018/08/28 Javascript
js实现通过开始结束控制的计时器
2019/02/25 Javascript
微信小程序下拉菜单效果的实例代码
2019/05/14 Javascript
node运行js获得输出的三种方式示例详解
2020/07/02 Javascript
浅谈vue 多个变量同时赋相同值互相影响
2020/08/05 Javascript
JavaScript实现无限轮播效果
2020/11/19 Javascript
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
python基础教程之获取本机ip数据包示例
2014/02/10 Python
Python利用正则表达式匹配并截取指定子串及去重的方法
2015/07/30 Python
Python搭建HTTP服务器和FTP服务器
2017/03/09 Python
Python实现选择排序
2017/06/04 Python
python中利用队列asyncio.Queue进行通讯详解
2017/09/10 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
2018/02/23 Python
Python解决两个整数相除只得到整数部分的实例
2018/11/10 Python
python腾讯语音合成实现过程解析
2019/08/01 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
啤酒销售实习自我鉴定
2013/09/24 职场文书
大学生怎样写好自荐信
2014/02/25 职场文书
2015年国庆晚会主持词
2015/07/01 职场文书
《山中访友》教学反思
2016/02/24 职场文书
TV动画《间谍过家家》公开PV
2022/03/20 日漫
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技