起因
因為有朋友使用花溪九尾的過程中發現在報告中存在重復漏洞,今天回學校收拾東西,晚上終於有空來解決這個問題了
為什么會出現重復漏洞,按理說使用集合存儲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~
