Rumah > Operasi dan penyelenggaraan > Keselamatan > 采用词法分析提取域名和IP

采用词法分析提取域名和IP

王林
Lepaskan: 2019-12-25 13:08:10
ke hadapan
3558 orang telah melayarinya

采用词法分析提取域名和IP

背景

在分析日志的时候发现有些日志中参数中包含其他的URL,例如:

10fb0251c88e1486b149ab5acc073d9.png

提取请求参数中的URL(xss.ha.ckers.org),再对比威胁情报数据库,如果命中黑名单直接标黑。如果不在黑名单,也不在公司的白名单里可以先做个标记,后续着重分析。

提取URL

关于URL的提取网上有很多文章,大部分都是是使用正则表达式,方法简单但是不太准确。我这里提供一种方法:采用词法分析,提取域名和IP。思路借鉴了这篇文章:https://blog.csdn.net/breaksoftware/article/details/7009209,有兴趣的可以去看看,事实证明跟着大神确实涨姿势。

原文是用C++版本,这里我用Python写了一个类似的,供大家参考。

常见的URL分类

5b36de3537cb80aa493384f6e1d907b.png

观察可以见得:IP形式的URL结构最为简单:4个小于255的数字被.分割;domain形式比较复杂,但是它们有共性:都具有顶级域名.com。

定义合法字符:

06c48f2cc418ff91f9e64fb440a3e5b.png

顶级域名列表:

3.jpg

域名形式提取:如www.baidu.com

d16eed0b47f886148f3ecff76ae583d.png

6b17cde8d3dbf3dbca0a39f7379f356.png

IP形式提取:如192.168.1.1。

bf4e4015d2185fcd055d3a4011827bf.png

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
Salin selepas log masuk

混合形式提取:如1234.com。
扫描前半部分1234,符合IP形式的特征,但是发现代码会报异常,所以需要IP处理代码段添加判断:判断后缀是否是顶级域名:

0344cd5e302d2497f4bb5bf6063c760.png

结果测试

测试数据:

03ae44d8ab2c65074724a79eadbd999.png

运行结果:

577b7721a4faf9a46454455b9e8b43c.png

这只是个初步的版本,如果有BUG欢迎大家指正。

结束语

以前只顾着闷着头的写代码,忽略了事后的思考和总结。现在尝试着改变一下,一边工作,一边提炼和总结,遇到感觉不错的,尝试写成工具开源出来,与大家共勉。

代码传送门:

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

相关文章教程推荐:web服务器安全

Atas ialah kandungan terperinci 采用词法分析提取域名和IP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan