首頁  >  文章  >  運維  >  採用詞法分析擷取網域名稱和IP

採用詞法分析擷取網域名稱和IP

王林
王林轉載
2019-12-25 13:08:103414瀏覽

採用詞法分析擷取網域名稱和IP

背景

在分析日誌的時候發現有些日誌中參數包含其他的URL,例如:

採用詞法分析擷取網域名稱和IP

提取請求參數中的URL(xss.ha.ckers.org),再對比威脅情報資料庫,如果命中黑名單直接標黑。如果不在黑名單,也不在公司的白名單裡可以先做個標記,後續著重分析。

提取URL

關於URL的提取網路上有很多文章,大部分都是使用正規表示式,方法簡單但是不太準確。我在這裡提供一個方法:採用詞法分析,提取網域和IP。想法借鑒了這篇文章:https://blog.csdn.net/breaksoftware/article/details/7009209,有興趣的可以去看看,事實證明跟著大神確實漲姿勢。

原文是用C 版本,這裡我用Python寫了一個類似的,供大家參考。

常見的URL分類

採用詞法分析擷取網域名稱和IP

觀察可以見得:IP形式的URL結構最為簡單:4個小於255的數字被.分割;domain形式比較複雜,但是它們有共通點:都具有頂級域名.com。

定義合法字元:

採用詞法分析擷取網域名稱和IP

頂級網域清單:

採用詞法分析擷取網域名稱和IP

網域形式擷取:如www.baidu.com

採用詞法分析擷取網域名稱和IP

採用詞法分析擷取網域名稱和IP

IP形式擷取:如192.168.1.1。

採用詞法分析擷取網域名稱和IP

while (i < len(z) and z[i].isdigit()):
                i = i + 1
                ip_v1 = True
                reti = i            if i < len(z) and z[i] == &#39;.&#39;:
                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] == &#39;.&#39;:
                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] == &#39;.&#39;:
                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] == &#39;:&#39;:
                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處理代碼段添加判斷:判斷後綴是否是頂級域名:

採用詞法分析擷取網域名稱和IP

結果測試

測試資料:

採用詞法分析擷取網域名稱和IP

運行結果:

採用詞法分析擷取網域名稱和IP

##這只是初步的版本,如果有BUG歡迎大家指正。

結束語

以前只顧著悶著頭的寫程式碼,忽略了事後的思考和總結。現在試著改變一下,一邊工作,一邊提煉和總結,遇到感覺不錯的,嘗試寫成工具開源出來,與大家共勉。

程式碼傳送門:

https://github.com/skskevin/UrlDetect/blob/master/tool/domainExtract/domainExtract.py

#相關文章教學推薦:

web伺服器安全性

以上是採用詞法分析擷取網域名稱和IP的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:freebuf.com。如有侵權,請聯絡admin@php.cn刪除