XSStrike源码阅读(2)——四种模式

版权声明:本文为博主原创文章,转载请联系博主 https://blog.csdn.net/he_and/article/details/84660755

1.bruteforcer模式

功能介绍

根据用户提供的payloads文件去暴力测试每一个参数,以此来确定是否存在xss漏洞(说起来也就是一个两层循环)。

具体实现

XSStrike3.0 bruteforcer.py源码如下:

import copy
from urllib.parse import urlparse, unquote

from core.colors import run, good, bad, green, end
from core.requester import requester
from core.utils import getUrl, getParams, verboseOutput

def bruteforcer(target, paramData, payloadList, verbose, encoding, headers, delay, timeout):
    GET, POST = (False, True) if paramData else (True, False)
    
    #输出此次扫描目标的相关信息:主机地址,url,以及参数字典(都是在verbose模式下才输出)
    host = urlparse(target).netloc  # Extracts host out of the url
    verboseOutput(host, 'host', verbose)
    url = getUrl(target, GET)
    verboseOutput(url, 'url', verbose)
    params = getParams(target, paramData, GET)
    if not params:
        print('%s No parameters to test.' % bad)
        quit()
    verboseOutput(params, 'params', verbose)
    for paramName in params.keys():
        progress = 1
        paramsCopy = copy.deepcopy(params)
        for payload in payloadList:
            print ('%s Bruteforcing %s[%s%s%s]%s: %i/%i' % (run, green, end, paramName, green, end, progress, len(payloadList)), end='\r')
            if encoding:
                payload = encoding(unquote(payload))
            paramsCopy[paramName] = payload
            response = requester(url, paramsCopy, headers,
                                 GET, delay, timeout).text
            if encoding:
                payload = encoding(payload)
            if payload in response:
                print('%s %s' % (good, payload))
            progress += 1
    print ()

其中涉及到两个相对重要的函数:

getparams

先上源码:

def getParams(url, data, GET):
    params = {}
    if '=' in url:
        data = url.split('?')[1]
        if data[:1] == '?':
            data = data[1:]
    elif data:
        if core.config.globalVariables['jsonData'] or core.config.globalVariables['path']:
            params = data
        else:
            try:
                params = json.loads(data.replace('\'', '"'))
                return params
            except json.decoder.JSONDecodeError:
                pass
    else:
        return None
    if not params:
        parts = data.split('&')
        for part in parts:
            each = part.split('=')
            try:
                params[each[0]] = each[1]
            except IndexError:
                params = None
    return params

该函数的主要功能就是将需要测试的参数都转换成一个字典返回。但是读者可能也知道参数有四种形式:get参数,post参数(a=b形式),post参数(json形式),path(路径中也可能存在xss)
当然,如果是json或者path,在xsstrike.py中就已经进行了处理,并作为data参数传了过来,所以直接赋值给params就行。

requester

使用requests库去请求服务器,于此同时设置了一些头信息

2.singleFuzz模式

主要功能

waf探测,fuzz测试

具体实现

1.waf探测部分

waf探测其实思想很简单,就是发起一个一定会触发waf的恶意请求,获取到这个请求的返回内容,然后利用已知waf的特种去匹配返回内容,如果匹配到某种或多种waf的特征,就取最佳匹配的那一个。这里获取最佳匹配是有一个小小的算法的:

我们以http请求的返回状态码、返回文本、返回头信息这三个基本信息作为判断waf的依据,例如:

360
上面是360web防火墙的特征,如果网站装有360web防火墙的话,我们的恶意数据在被其拦截过后,它会返回给我们一个响应,而这个响应的状态码(status_code)为403,返回的http头中会有X-Powered-By-360wzb,页面中会出现/wzws-waf-cgi/字样,然后我们给这三个特征分别加权,code权重为0.5,page权重为1,headers权重为1,这样当匹配到疑似多种waf特征的时候,我们只取权重最高的那一个作为我们最后的判断结果。

2.fuzz测试

fuzz测试大家应该都知道,一般用于检测waf的过滤情况或相关特性。方法就是使用相关的各种payloads去挨个测试每个参数,具体方法当然是带着这些payloads去请求,如果请求没有被拦截就说明fuzz通过,否则就是这个payloads被waf屏蔽了。
在这款工具中,作者考虑到fuzz测试由于请求频率过高很容易被waf 屏蔽掉ip,所以也是采用了一定的延时策略。而且采用了在payloads被waf拒绝掉后,间隔一定时间再发起正常请求这种方式来判断waf是否屏蔽了使用者的ip。
fuzz测试的一些payloads也是放在了config.py中:

fuzzes = (  # Fuzz strings to test WAFs
    '<test', '<test//', '<test>', '<test x>', '<test x=y', '<test x=y//',
    '<test/oNxX=yYy//', '<test oNxX=yYy>', '<test onload=x', '<test/o%00nload=x',
    '<test sRc=xxx', '<test data=asa', '<test data=javascript:asa', '<svg x=y>',
    '<details x=y//', '<a href=x//', '<emBed x=y>', '<object x=y//', '<bGsOund sRc=x>',
    '<iSinDEx x=y//', '<aUdio x=y>', '<script x=y>', '<script//src=//', '">payload<br/attr="',
    '"-confirm``-"', '<test ONdBlcLicK=x>', '<test/oNcoNTeXtMenU=x>', '<test OndRAgOvEr=x>')

3.scan模式

主要功能

猜你喜欢

转载自blog.csdn.net/he_and/article/details/84660755