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