利用Python对网站是否使用CDN进行“粗暴”的判断_挖低危的清风的博客-程序员秘密

技术标签: python  安全  

什么是CDN?

CDN全称Content Delivery Network即内容分发网络。
其简单说来就是为服务器建立一个缓存机制,它分布在各地不同的服务器中,当我们去访问使用了CDN的服务器域名的时候,它会根据我们的IP地址,选择离我们最近的CDN服务器,为我们提供更为快速的访问体验。
同时他也能隐藏服务器的真实IP,提升攻击门槛。

如何判断CDN?

网上其实也有很多关于如何判断对方网站是否使用了CDN的方法,比如nslookup,或者dig,或者ping,再或者收集一份CDN字典(注:很多CDN再HTTP的返回头中都有标识,只要你够肝,你就可以收集整理很大一部分的CDN标识字典)。
当然我觉得判断CDN最有效的方式其实还是使用全球PING,根据响应IP来进行判断。但是我没有这么多服务器,同时也不想去抓网站API接口来进行判断 :)

那么我是如何对CDN进行粗暴的判断的呢?

一个例子
我们会经常使用socket.getaddrinfo[host,port]这种方式去获取网站的IP

import socket
addr = socket.getaddrinfo('www.baidu.com','http')[0][4][0]
print(addr)

我只是个栗子
另一个例子
那么问题来了,如果我不指定port,我将其设置为None,这个时候,神奇的就来了,如果目标站点使用了CDN的话,那么getaddrinfo就会返回多个IP。

import socket

ip_list = []
addrs = socket.getaddrinfo('www.baidu.com', None)
for item in addrs:
    if item[4][0] not in ip_list:
        ip_list.append(item[4][0])
print(ip_list)

另一个栗子
最后
所以我的“粗暴”判断方式就是利用返回的IP数量来进行判断。(注:误报肯定是有的)

import socket
from threading import Thread, Semaphore

sm = Semaphore(20)
timeout = 5.0
# 超时判断
socket.setdefaulttimeout(timeout)


class ThreadWithReturnValue(Thread):
    def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None):
        Thread.__init__(self, group, target, name, args, kwargs, daemon=daemon)
        self._return = None

    def run(self):
        if self._target is not None:
                self._return = self._target(*self._args,**self._kwargs)

    def join(self):
        Thread.join(self)
        return self._return


def get_ip_list(domain):  # 获取域名解析出的IP列表
    dict = {}
    with sm:
        try:
            addrs = socket.getaddrinfo(domain, None)
            for item in addrs:
                if item[4][0] in dict:
                    dict.get(domain).append(str(item[4][0]))
                else:
                    dict.setdefault(domain, []).append(str(item[4][0]))
            # print('[*] Url: {} IP: {}'.format(domain, dict[domain][0]))
        except Exception as e:
            print('[-] Error: {} info: {}'.format(domain, e))
            pass
        except socket.timeout as e:
            print('[-] {} time out'.format(domain))
            pass
    return dict


def open_url_txt(filename):
    url_list = []
    with open(filename, 'r') as f:
        for l in f:
            url_list.append(l.strip())
    return url_list


def save_info(url, ip, key):
    if key == 1:
        with open('url_ip.csv', 'a+') as f:
            url_info = url + ',' + ip + '\n'
            f.write(url_info)

    else:
        with open('error_info.txt', 'a+') as f:
            f.write(url + ' ' + ','.join(ip) + '\n')



if __name__ == '__main__':
    url_list = open_url_txt('url_list.txt')
    thread_list = []
    for url in url_list:
        t = ThreadWithReturnValue(target=get_ip_list, args=(url,))
        thread_list.append(t)
        t.start()
    for t in thread_list:
        ip = t.join()
        if ip:
            for key in ip:
                if len(ip[key]) > 1:
                    print('[-] The Url: {} Maybe Exist CDN'.format(key))
                    save_info(key, ip[key], 0)
                else:
                    print('[*] Url:{} IP:{}'.format(key, ip[key][0]))
                    save_info(key, ip[key][0], 1)
    print('[*] End Scanner')

运行中

完成扫描的结果

疑似CDN的保存结果

最后的最后
我为什么要写这样一个脚本?其实不论是护网还是挖掘SRC,我们都会面临大量的域名,其中很大一部分都是部署了CDN的,如果我们盲目的使用端口扫描等工具的时候,会浪费我们大量的时间。并且我最近在写一个自己的信息收集框架,所以也算是为自己后面的框架写测试demo吧!
gayhub传送点:
https://github.com/HoldOnToYourHeart/qf_scan/blob/master/cdn_judge.py

以下为测试内容

1.1

<iframe οnlοad="alert(1)"></iframe>

1.2

<iframe src="javascript:alert(1)"></iframe>

1.3

<iframe src="vbscript:msgbox(1)"></iframe>

1.4

<iframe src="data:text/html,<script>alert(1)</script>"></iframe> Chrome

1.5

<iframe src="data:text/html,&lt;script&gt;alert(1)&lt;/script&gt;"></iframe>

1.6

<iframe srcdoc="&lt;script&gt;alert(1)&lt;/script&gt;"></iframe>

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42255372/article/details/103618431

智能推荐

ConvTranspose2d原理,对反卷积的思考_f.interpolate和反卷积_给芝麻加点糖的博客-程序员秘密

对公式的个人理解:反卷积实际上,相当于先用0插值再对插值后的图像做常规卷积操作。从上述公式中可以看出,ConvTranspose2d中的参数stride参数相当于F.upsample函数中的放缩因子scale。代入实例以供理解:现有width=60的input,欲反卷积得到output的width=240。即:240 = (60 - 1)* stride + kernalsize - 2*padding + output_padding方案一:令stride=4,则...

Kubernetes In cloud (一、deploy cluster) _flybirding1001的博客-程序员秘密

一、写在前面:云提供了kubernetes的Paas服务,但是很多同学对kubernetes的使用不是很清楚,最根本的原因就是出发点不同。cloud是要把技术门槛降低,通过可视化的配置降低学习成本;而企业要的是稳定性,以及故障恢复的时效性,以及故障复盘;这就造成了一系列的问题:support视角:1.cloud的support 不知道客户做了什么 操作...

窗口函数_睁大眼睛看星星的博客-程序员秘密

窗口函数一.简介窗口函数又名开窗函数,属于分析函数的一种。其与聚合函数都可以对表内容进行统计分析,但与聚合函数不同的是,对于区组的统计,窗口函数可以返回区组内的每一行,而聚合函数对于每区组只能返回一行。基本语句function(arg1,…) over (partition by partiton_clause order by ordby_clause ) 其中partition_clause为要按照其来分区的列,即目标分组列。function为功能函数,或者说可以使用窗口的函数。如下函数可

Kubernetes overview_LuckyCrise的博客-程序员秘密

Kubernetes 是一个能在集群中跨多主机管理容器化应用的开源系统。Kubernetes目的是让部署容器化和基于微服务的应用变得简单且强大。Kubernetes提供了诸多机制用来进行应用部署,调度,更新,维护和伸缩。一个Kubernetes的关键特性是它能主动的管理容器来保证集群的状态不断地符合用户的期望状态。一个运维人员能够启动微服务,然后让调度器来找到合适的安置点。Kubernetes...

制作启动U盘加载阵列卡驱动_sapling_lz1130的博客-程序员秘密

[size=medium]安装服务器时碰到没有阵列卡驱动无法安装的问题大家应该都碰到过。之前一次安装2003碰到没阵列卡驱动,解决的办法比较土,上网下了张别人做好的集成了raid驱动的2003。这次不行了,新机器,阵列卡很新,没现成的盘下。上网搜集了一些资料,今天记录下来。争取以后一小时内能解决。[color=red]这里主要针对dell的服务器安装2003。[/color]用系统盘安装时,需...

文件静态缓存_静态方法缓存文件可以吗_浓汤烩意面的博客-程序员秘密

每次进入文件都进行刷新,如果数据库承载着一个访问量比较大的网站,或大量用户读写的访问,会造成数据库的频繁操作,导致系统崩坏。如果访问量大的话,可以用到文件静态缓存。&amp;lt;?php//设置缓冲时间$cacheTime=10;//判断:文件不存或者过期了if(!file_exists(&quot;test.html&quot;) || time()-filemtime(&quot;test.html&quot;) &amp;gt; $cach...

随便推点

linux搭建sftp服务器_"/etc/ssh/ssh_config line 59: unsupported option \_superswordsman的博客-程序员秘密

最近工作需要用到sftp服务器,被网上各种方法尤其是权限设置问题搞得晕头转向,现在将自己搭建过程总结了一下,整理出来一种最简单的方法可供大家参考。第1步,创建组:groupadd sftpgroup第2歩,添加sftp用户:useradd -g sftpgroup -s /sbin/nologin sftpuser第3歩,修改密码:执行passwd sftpuser,然后输入密码2次即

securecrt简介_BAOXFEI的博客-程序员秘密

SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件。Secure[1] CRT支持SSH,同时支持Telnet和rlogin协议。SecureCRT是一款用于连接运行包括Windows、UNIX和VMS的理想工具。通过使用内含的VCP命令行程序可以进行加密文件的传输。有流行CRTTelnet客户机的所有特点

Git 清空工作区和暂存区_git 清空暂存区_xiange18的博客-程序员秘密

1. 还没有进行 add . 和 commit 操作:$ git checkout .命令作用:只能清空全部已修改的文件, 但是对于新建的文件和文件夹无法清空, 必须组合下面命令;$ git clean -f命令作用:清空所有新建的文件和文件夹;2. 已经 add . 了, 用如下命令重置 git reset ....

如何在命令行中 使用msedge打开指定http_滚菩提哦呢的博客-程序员秘密

可以使用如下命令打开 Microsoft Edge 浏览器并加载指定的 URL:msedge http://example.com

x264里的2pass指的是什么意思? x264源代码分析2.encode()_hq2902108007的博客-程序员秘密

A:x264里的2pass指的是什么意思?另外stat是什么意思, 比如有个参数--stats Filename for 2 pass stats [/"%s/"]/n", defaults->rc.psz_stat_out );stats在这是什么意思?2pass是2次编码的意思,stats是统计文档的名称,记录了1pass中的信息.2次编码就相当于2次转换这么做虽然转换时间会漫长