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


本文摘自PHP中文网,作者V,侵删。

背景

在分析日志的时候发现有些日志中参数中包含其他的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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

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处理代码段添加判断:判断后缀是否是顶级域名:

0344cd5e302d2497f4bb5bf6063c760.png

结果测试

测试数据:

03ae44d8ab2c65074724a79eadbd999.png

运行结果:

577b7721a4faf9a46454455b9e8b43c.png

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

结束语

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

代码传送门:

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

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

以上就是采用词法分析提取域名和IP的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

centos下无法解析域名怎么办

centos 查看ip的方法(图文)

linux查看本机ip和端口号的命令是什么?

centos7下wget不能解析主机域名

linux不能ping通网关和其他ip段的地址

centos无法解析域名

nginx设置仅允许个别ip访问的方法

centos查看不到ip地址怎么办

centos7下如何自动获取ip地址

linux中配置ip提示文件夹权限不够的解决方法有哪些

更多相关阅读请进入《词法分析》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...