花溪九尾 xray重复漏洞去重


起因

因为有朋友使用花溪九尾的过程中发现在报告中存在重复漏洞,今天回学校收拾东西,晚上终于有空来解决这个问题了

为什么会出现重复漏洞,按理说使用集合存储crawlergo爬取到的URL,不重复的URL出现了重复的漏洞,猜测是因为对于不同的URL同一个poc也适用

例如(只是举例:http://www.baidu.comhttp://www.baidu.com/index.php

如果存在备份文件泄露 www.zip,则对于上面两个站点都会检测出

http://www.baidu.com/www.zip

从而出现了重复漏洞

解决办法

因为不能修改xray的逻辑,只能在花溪九尾中使用代码去重

先查看漏洞格式如图:

很明显是python dict ,整理一下如图

很容易得出去重的解决思路:在获得一个target的漏洞列表后,判断每一个漏洞详情的requestmd5值,是否在该targetmd5集合中出现,这样会出现两种结果,若出现过,则不将该漏洞详情添加到漏洞报告里,若未出现,更新md5集合,并将该漏洞详情添加到漏洞报告里

判断标准

判断标准:以漏洞详情中的request是否一致来决定是否为重复

代码实现

先获取漏洞列表

pattern = re.compile(r'')

for report in reportList:
    tempReport="{}\\{}".format(config.Xray_temp_report_path,report)
    with open(tempReport,'r',encoding='utf-8') as f:
        temp=f.read()
        result=pattern.findall(temp)
        resultList+=result

resultList则为漏洞列表

读取漏洞报告模板

context=""
with open("{}\\modelFile.html".format(config.Root_Path),'r',encoding='utf-8') as f:
    context+=f.read()

targetmd5集合

requestMd5Set=set()

接着遍历漏洞列表resultList

for result in resultList:
    tempResultDict=eval(result)
    tempDetailRequest=tempResultDict["detail"]["request"]
    tempRequestMd5=hashlib.md5(tempDetailRequest.encode('utf-8')).hexdigest()

此处的tempResultDict=eval(result)即将str转化为dict

tempRequestMd5为该漏洞的md5

if tempRequestMd5 not in requestMd5Set:
    requestMd5Set.add(tempRequestMd5)
    result="".format(result)
    context+=result

if判断,为真则更新集合,并写入漏洞报告,与之前的解决思路一致

最后将报告从内存写入文件,清理临时报告

with open("{}\\{}.html".format(config.Xray_report_path,filename),'w',encoding='utf-8') as f:
    f.write(context)
cleanTempXrayReport()

测试

扫描命令:

python3 scan.py -a http://testphp.vulnweb.com/

之前扫描该网站漏洞报告显示有一百多个,包含重复漏洞,更新去重代码后漏洞数量降为97,扫描结果如图:

虽然同一个URL会有同名的漏洞,但是其检测poc不同

例如95号的漏洞,漏洞类型为:baseline/server-error

96号漏洞,漏洞类型也为:baseline/server-error

但可以看出其request不同,则可以判断为不同漏洞,成功实现目标

End~

相关