ホームページ >運用・保守 >安全性 >字句解析を使用してドメイン名と IP を抽出する

字句解析を使用してドメイン名と IP を抽出する

王林
王林転載
2019-12-25 13:08:103457ブラウズ

字句解析を使用してドメイン名と IP を抽出する

背景

ログを分析したところ、一部のログ パラメーターに他の URL が含まれていることがわかりました。例:

字句解析を使用してドメイン名と IP を抽出する

# #リクエストパラメータ内のURL(xss.ha.ckers.org)を抽出し、脅威インテリジェンスデータベースと比較し、ブラックリストにヒットした場合はブラックリストに登録されます。ブラックリストまたは会社のホワイトリストにない場合は、最初にマークを付けて、後で分析に集中できます。

URL の抽出

インターネット上には URL の抽出に関する記事が数多くありますが、そのほとんどは正規表現を使用しており、方法は単純ですがあまり正確ではありません。ここでは、字句解析を使用してドメイン名と IP を抽出する方法を提供します。このアイデアは次の記事から借用しています:

https://blog.csdn.net/breaksoftware/article/details/7009209. 興味がある場合は、ご覧ください。マスターに従うことが事実によって証明されました。本当に姿勢が良くなります。

元のテキストは C バージョンですが、参考までに Python で同様のものを書きました。

一般的な URL 分類

字句解析を使用してドメイン名と IP を抽出する

観察によると、URL 構造の IP 形式は最も単純です。255 未満の 4 つの数値が除算されます。; ドメイン形式の比較 複雑ですが、これらには共通点があります。それは、すべてのトップレベル ドメイン名が .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 など。

IP フォームの特性に準拠する 1234 の前半をスキャンしますが、コードが例外を報告することが判明したため、サフィックスが であるかどうかを判断するために IP 処理コード セグメントを追加する必要があります。トップレベル ドメイン名:

字句解析を使用してドメイン名と IP を抽出する

結果テスト

テスト データ:

字句解析を使用してドメイン名と IP を抽出する

実行結果:

字句解析を使用してドメイン名と IP を抽出する

これは暫定版です。バグがある場合は修正してください。

結論

以前は、頭を下げてコードを書くことだけに集中して、その後の考え方やまとめを無視していました。今はそれを変えようと仕事をしながら推敲してまとめていて、いいなと思ったものを見つけたらツールとして書いてオープンソースにしてみんなと共有するようにしています。

コード ポータル:

https://github.com/skskevin/UrlDetect/blob/master/tool/domainExtract/domainExtract.py
## 推奨関連記事チュートリアル:

Web サーバーのセキュリティ

以上が字句解析を使用してドメイン名と IP を抽出するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はfreebuf.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。