首页 > 其他分享 >api/BlastModule

api/BlastModule

时间:2023-05-25 21:26:01浏览次数:40  
标签:index string .. list len api BlastModule payload

1、介绍

四种爆破模式

(1)sniper

  • 样本中可以设置一个或多个待测参数点,记为x={x1,x2,..xn}
  • 只需要设置一个payload集合,记为y={y1,y2,...ym}
  • 测试过程是从唯一的payload集合中,逐个取出,对参数点x1替换。然后依次对参数点x2,..xn替换。
  • 总的测试请求个数是n*m

(2)battering_ram

  • 样本中可以设置一个或多个待测参数点,记为x={x1,x2,..xn}
  • 只需要设置一个payload集合,记为y={y1,y2,...ym}
  • 测试过程是从唯一的payload集合中,逐个取出,对参数点x1,x2...xn同时替换。
  • 总的测试请求个数是m

(3)pitchfork

  • 样本中可以设置一个或多个待测参数点,记为x={x1,x2,..xn}
  • 需要设置对应待测参数点个数的,即n个payload集合,记为y={y1,y2,..yn},此时y1表示一个payload集合。这些集合内各自的payload个数分别记为m1,m2,..mn,可能是不等的,记m_min为最小长度
  • 测试过程是同时从y1,y2...yn中取出相同索引的payload,对参数点x1,x2...xn分别同时替换。索引从0到m_min递增,逐次操作。
  • 总的测试请求个数是m_min

(4)cluster_bomb

  • 样本中可以设置一个或多个待测参数点,记为x={x1,x2,..xn}
  • 需要设置对应待测参数点个数的,即n个payload集合,记为y={y1,y2,..yn},此时y1表示一个payload集合。这些集合内各自的payload个数分别记为m1,m2,..mn,可能是不等的
  • 测试过程是完全交叉组合,由各个payload集合每次各自取出一个payload,遍历所有情况。
  • 具体来说,通过进制算法进行实现:
    • 假设一个n位的数,对应n个集合和n个待测参数点
    • 初始时,各位上为0
    • 各位上允许的最大数为对应(m1-1),(m2-1)...(mn-1)
    • 设定左侧为低位,右侧为高位
    • 循环操作:
      • 每次是最低位+1
      • 然后从低位到高位逐位判断,是否超出各位上允许的最大数。如果超出,则当前位设为0,下一位+1。这样依次判断到次高位
      • 最高位单独判断,如果其超出位上允许的最大数,则结束循环操作
      • 如果最高位未溢出,则本次+1是合法的,取出各位上的值,作为各集合的索引取出payload,分别替换各参数点
    • 实际的循环操作,是从各位都是0开始,因此是先默认合法,直接取出payload替换,然后再+1进行判断是否溢出
    • 进制算法需要注意是需要提前检查各位上允许的最大数不能是0,即m1,m2..mn都不能是0,或者说设置的各payload集合不能存在为空
  • 总的测试请求个数是m1*m2*..*mn

2、代码

"""
sniper模式
样本中可以设置一个或多个待测参数点,记为x={x1,x2,..xn}
只需要设置一个payload集合,记为y={y1,y2,...ym}
测试过程是从唯一的payload集合中,逐个取出,对参数点x1替换。然后依次对参数点x2,..xn替换。
总的测试请求个数是n*m
"""
from api import RadixModule


def sniper(s: str, index_list: list[int], payload_list_list: list[list[str]]):
    result = list()
    payload_list = payload_list_list[0]
    if s != '' and len(index_list) > 0 and len(index_list) % 2 == 0:
        for i in range(int(len(index_list) / 2)):
            for j in range(len(payload_list)):
                last_index = 0
                string = ''
                for k in range(int(len(index_list) / 2)):
                    string = string + s[last_index: index_list[2 * k]]
                    last_index = index_list[2 * k]
                    if i == k:
                        string = string + payload_list[j]
                    else:
                        string = string + s[last_index: index_list[2 * k + 1]]
                    last_index = index_list[2 * k + 1]
                else:
                    string = string + s[last_index:]
                result.append(string)
    return result


"""
battering_ram模式
样本中可以设置一个或多个待测参数点,记为x={x1,x2,..xn}
只需要设置一个payload集合,记为y={y1,y2,...ym}
测试过程是从唯一的payload集合中,逐个取出,对参数点x1,x2...xn同时替换。
总的测试请求个数是m
"""


def battering_ram(s: str, index_list: list[int], payload_list_list: list[list[str]]):
    result = list()
    payload_list = payload_list_list[0]
    if s != '' and len(index_list) > 0 and len(index_list) % 2 == 0:
        for j in range(len(payload_list)):
            last_index = 0
            string = ''
            for k in range(int(len(index_list) / 2)):
                string = string + s[last_index: index_list[2 * k]]
                string = string + payload_list[j]
                last_index = index_list[2 * k + 1]
            else:
                string = string + s[last_index:]
            result.append(string)
    return result


"""
pitchfork模式
样本中可以设置一个或多个待测参数点,记为x={x1,x2,..xn}
需要设置对应待测参数点个数的,即n个payload集合,记为y={y1,y2,..yn},此时y1表示一个payload集合。这些集合内各自的payload个数分别记为m1,m2,..mn,可能是不等的,记m_min为最小长度
测试过程是同时从y1,y2...yn中取出相同索引的payload,对参数点x1,x2...xn分别同时替换。索引从0到m_min递增,逐次操作。
总的测试请求个数是m_min
"""


def pitchfork(s: str, index_list: list[int], payload_list_list: list[list[str]]):
    result = list()
    # 获取最小长度的payload_list
    min_len = len(payload_list_list[0])
    for i in range(1, len(payload_list_list)):
        if len(payload_list_list[i]) < min_len:
            min_len = len(payload_list_list[i])

    if s != '' and len(index_list) > 0 and len(index_list) % 2 == 0:
        for j in range(min_len):
            last_index = 0
            string = ''
            for k in range(int(len(index_list) / 2)):
                string = string + s[last_index: index_list[2 * k]]
                string = string + payload_list_list[k][j]
                last_index = index_list[2 * k + 1]
            else:
                string = string + s[last_index:]
            result.append(string)
    return result


"""
cluster_bomb模式
样本中可以设置一个或多个待测参数点,记为x={x1,x2,..xn}
需要设置对应待测参数点个数的,即n个payload集合,记为y={y1,y2,..yn},此时y1表示一个payload集合。这些集合内各自的payload个数分别记为m1,m2,..mn,可能是不等的
测试过程是完全交叉组合,由各个payload集合每次各自取出一个payload,遍历所有情况。
具体来说,通过进制算法进行实现:
假设一个n位的数,对应n个集合和n个待测参数点
初始时,各位上为0
各位上允许的最大数为对应(m1-1),(m2-1)...(mn-1)
设定左侧为低位,右侧为高位
循环操作:
每次是最低位+1
然后从低位到高位逐位判断,是否超出各位上允许的最大数。如果超出,则当前位设为0,下一位+1。这样依次判断到次高位
最高位单独判断,如果其超出位上允许的最大数,则结束循环操作
如果最高位未溢出,则本次+1是合法的,取出各位上的值,作为各集合的索引取出payload,分别替换各参数点
实际的循环操作,是从各位都是0开始,因此是先默认合法,直接取出payload替换,然后再+1进行判断是否溢出
进制算法需要注意是需要提前检查各位上允许的最大数不能是0,即m1,m2..mn都不能是0,或者说设置的各payload集合不能存在为空
总的测试请求个数是m1*m2*..*mn
"""


def cluster_bomb(s: str, index_list: list[int], payload_list_list: list[list[str]]):
    # 返回结果,list[str]
    result = list()

    # 进制算法,获取索引组合的list
    list_len_list = list()
    for i in range(len(payload_list_list)):
        list_len_list.append(len(payload_list_list[i]))
    index_list_list: list[list[int]] = RadixModule.radix_by_plural_list(list_len_list=list_len_list,
                                                                        low_in_left_flag=True)
    # 根据进制算法结果,替换payload
    for i in range(len(index_list_list)):
        # 样本切割后的元素遍历,逐个拼接
        string = ''
        last_index = 0
        for j in range(int(len(index_list)/2)):
            string = string + s[last_index: index_list[j*2]]
            string = string + payload_list_list[j][index_list_list[i][j]]
            last_index = index_list[2*j + 1]
        else:
            string = string + s[last_index:]
        result.append(string)
    return result


def blast(mode: int, s: str, index_list: list[int], payload_list_list: list[list[str]]):
    if mode == 0:
        return sniper(s=s, index_list=index_list, payload_list_list=payload_list_list)
    elif mode == 1:
        return battering_ram(s=s, index_list=index_list, payload_list_list=payload_list_list)
    elif mode == 2:
        return pitchfork(s=s, index_list=index_list, payload_list_list=payload_list_list)
    elif mode == 3:
        return cluster_bomb(s=s, index_list=index_list, payload_list_list=payload_list_list)


if __name__ == '__main__':
    # 测试
    data = cluster_bomb('abcdefg', index_list=[1, 3, 4, 5], payload_list_list=[['abc', '000'], ['zzz', '111']])
    print(data)

标签:index,string,..,list,len,api,BlastModule,payload
From: https://www.cnblogs.com/wd404/p/17432953.html

相关文章

  • api/RadixModule
    1、介绍进制算法。2、代码"""进制算法,返回一个list,有两大类型1、单个集合从长度为m的单个集合中,一次性选择n个元素,各自索引按序组成list,作为结果list的元素。(1)先按进制计算遍历,获取所有可能的组合(2)标志1,如果为True,表示允许一次选择中,禁止重复选择某一索引(3)标志2,如......
  • api/MarkModule
    1、介绍关于标记的一些函数。2、代码fromapi.PropertiesClassesimportParams"""自动标记@url:str类型,表示url@message:str类型,表示请求报文@name_list:str类型,根据url的直接参数的名称标记其对应的值,name_list参数可以通过空格分隔多个参数名称@text_list:str类......
  • 淘宝API技术文档解析,从入门到实战
    探索淘宝数据的奥秘,淘宝是目前国内最大的B2C电商平台之一,每天都会产生海量的数据。借助淘宝API技术文档,我们可以轻松地获取到这些数据,从而为电商运营和数据分析提供有力支持。1.什么是淘宝API?淘宝API(ApplicationProgrammingInterface)是一组软件API接口,可以让第三方应用程序和淘宝......
  • api/Request
    1、介绍 对应http请求对象。两种设置方法:基于url设置基于请求报文message设置,伴随设置协议类型https_flag2、代码importreimporttimeimportrequestsfromapi.PropertiesClassesimportHeadersfromapi.ResponseClassimportResponsefromapi.UrlClassimport......
  • 淘宝天猫京东1688拼多多商品详情API接口(商品价格监控,商品上传等场景)代码对接
    抓取淘宝商品详情价格接口代码封装如下:请求方式:HTTPS POSTGET公共参数名称类型必须描述key String 是 调用key(必须以GET方式拼接在URL中)API接口 API接口secret String 是 调用密钥api_name String 是 API接口名称(包括在请求地址中)[item_search,item_get,item_search_......
  • express开发api指南--服务器发布
    8.1Linux服务器linux服务器相对简单。一般都自带node环境。没有的话apt-get或者yum安装一下。//查看node版本node-v//把文件除了node-modules文件夹都上传到服务器//以放在opt/express为例cd/opt/expressnpminstall//使用pm2包npminstall-gpm2//在项目文件夹下执......
  • express开发api指南--记录日志
    败笔,目前还是我的败笔。没有找到好的方法去记录。现在只能记录请求的记录,api的返回记录没有记录下来。用的morgan中间件。这个在项目创建时已安装。//首先安装轮询文件流插件和时间处理插件cnpminstall--saverotating-file-streamdayjs//修改app.js//引入插件varrfs=......
  • GitHub API
    GithubAPIGitHubAPI是一个RESTfulAPI,支持HTTP请求和JSON响应。主要用于访问GitHub上的仓库、问题、pullrequest、用户、组织等信息。使用GitHubAPI,你需要遵循以下步骤:1.获取个人访问令牌首先,你需要在GitHub上创建一个个人访问令牌,用于进行API访问。在Git......
  • 基于Qt的音乐播放器(三)通过酷狗音乐的api接口,返回json格式歌曲信息(播放地址,歌词,图片)
    2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票!我的投票地址:点击为我投票文章目录前言1.获取歌曲搜索列表api接口2.获取单个歌曲详细信息包括歌词3.总结前言首先说明,本教程仅供个人学习,研究使用,禁止用于任何的商业和非法用途。(手动狗头)之所以要研究这个,是因为我想......
  • 电商erp系统选品,跨境ERP系统选品,api接口采集数据
    ​  电商ERP系统选品优势:1.自动化选品:电商ERP系统可以根据销售数据、客户反馈、市场趋势等因素,自动化地筛选出热销商品,快速进行选品;2.数据分析功能:电商ERP系统可以对历史销售数据进行分析,得出销售趋势、客户偏好等信息,有利于精细化选品;3.库存管理:电商ERP系统可以管理商......