花溪九尾 xray重复漏洞去重
起因
因为有朋友使用花溪九尾
的过程中发现在报告中存在重复漏洞,今天回学校收拾东西,晚上终于有空来解决这个问题了
为什么会出现重复漏洞,按理说使用集合存储crawlergo
爬取到的URL,不重复的URL出现了重复的漏洞,猜测是因为对于不同的URL同一个poc
也适用
例如(只是举例:http://www.baidu.com
和 http://www.baidu.com/index.php
如果存在备份文件泄露 www.zip
,则对于上面两个站点都会检测出
http://www.baidu.com/www.zip
从而出现了重复漏洞
解决办法
因为不能修改xray
的逻辑,只能在花溪九尾
中使用代码去重
先查看漏洞格式如图:
很明显是python dict
,整理一下如图
很容易得出去重的解决思路:在获得一个target
的漏洞列表后,判断每一个漏洞详情的request
的md5
值,是否在该target
的md5
集合中出现,这样会出现两种结果,若出现过,则不将该漏洞详情添加到漏洞报告里,若未出现,更新md5
集合,并将该漏洞详情添加到漏洞报告里
判断标准
判断标准:以漏洞详情中的request
是否一致来决定是否为重复
代码实现
先获取漏洞列表
pattern = re.compile(r'<script class=\'web-vulns\'>webVulns.push\((.*?)\)</script>')
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()
target
的md5
集合
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="<script class=\'web-vulns\'>webVulns.push({})</script>".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~