背景
在分析日志的時候發現有些日志中參數中包含其他的URL,例如:
提取請求參數中的URL(xss.ha.ckers.org),再對比威脅情報數據庫,如果命中黑名單直接標黑。如果不在黑名單,也不在公司的白名單里可以先做個標記,后續著重分析。
提取URL
關于URL的提取網上有很多文章,大部分都是是使用正則表達式,方法簡單但是不太準確。我這里提供一種方法:采用詞法分析,提取域名和IP。思路借鑒了這篇文章:https://blog.csdn.net/breaksoftware/article/details/7009209,有興趣的可以去看看,事實證明跟著大神確實漲姿勢。
原文是用C++版本,這里我用Python寫了一個類似的,供大家參考。
常見的URL分類
觀察可以見得:IP形式的URL結構最為簡單:4個小于255的數字被.分割;domain形式比較復雜,但是它們有共性:都具有頂級域名.com。
定義合法字符:
頂級域名列表:
域名形式提取:如www.baidu.com
。
IP形式提取:如192.168.1.1。
while (i < len(z) and z[i].isdigit()): i = i + 1 ip_v1 = True reti = i if i < len(z) and z[i] == '.': i = i + 1 reti = i else: tokenType = TK_OTHER reti = 1while (i < len(z) and z[i].isdigit()): i = i + 1 ip_v2 = True if i < len(z) and z[i] == '.': i = i + 1 else: if tokenType != TK_DOMAIN: tokenType = TK_OTHER reti = 1while (i < len(z) and z[i].isdigit()): i = i + 1 ip_v3 = True if i < len(z) and z[i] == '.': i = i + 1 else: if tokenType != TK_DOMAIN: tokenType = TK_OTHER reti = 1while (i < len(z) and z[i].isdigit()): i = i + 1 ip_v4 = True if i < len(z) and z[i] == ':': i = i + 1 while (i < len(z) and z[i].isdigit()): i = i + 1 if ip_v1 and ip_v2 and ip_v3 and ip_v4: self.urls.append(z[0:i]) return reti, tokenType else: if tokenType != TK_DOMAIN: tokenType = TK_OTHER reti = 1
混合形式提取:如1234.com。
掃描前半部分1234,符合IP形式的特征,但是發現代碼會報異常,所以需要IP處理代碼段添加判斷:判斷后綴是否是頂級域名:
結果測試
測試數據:
運行結果:
這只是個初步的版本,如果有BUG歡迎大家指正。
結束語
以前只顧著悶著頭的寫代碼,忽略了事后的思考和總結。現在嘗試著改變一下,一邊工作,一邊提煉和總結,遇到感覺不錯的,嘗試寫成工具開源出來,與大家共勉。
代碼傳送門:
https://github.com/skskevin/UrlDetect/blob/master/tool/domainExtract/domainExtract.py
相關文章教程推薦:web服務器安全