百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

实战经验:电商平台遭遇CC攻击,我们是如何应对的?

off999 2025-03-02 18:34 14 浏览 0 评论

本文转至二马读书

几年前,我们的电商平台遭遇过一次CC攻击(一种分布式网络攻击,后面有详细介绍),当时整个网站几乎陷于瘫痪的状态。期间很多PC网页和APP页面打不开或者持续报错,下单流程也彻底跑不通了。

上图是对网站流量的监控。我们可以看到10:00时UV(访问用户)和client IP数量突然激增,翻了几千倍。

从后台监控看(上图),CPU资源也被耗尽了。由于CPU被耗尽,服务器慢得要命,所以当时根本无法登入服务器查看CPU详细的使用情况,只能根据监控页面查看CPU使用情况。

另外,出口带宽也被打满了。所以那段时间很多请求根本进不来。用户看到的就是空白页面,请求错误等情况。

经过分析,我们发现这次攻击是新品限量首发活动引发的,是一次薅羊毛活动。攻击者专门针对限量的新品进行了分布式网络攻击,目的就是抢到限量新品,然后再在市场上高价出售获利。

攻击者利用接码平台(接码平台,通俗点讲就是接收手机验证码的平台)提前注册好大量的账号。然后提前准备好脚本程序,利用一些攻击工具(文末有工具列表)将这些脚本分发到大量的代理或者肉鸡,并通过这些代理和肉鸡对网站发起分布式攻击 。攻击步骤如下图:

下面我们详细了解一下CC攻击。了解CC攻击之前我们先弄清下面几个概念。

僵尸主机&僵尸网络

僵尸主机是指感染僵尸程序病毒,从而被黑客程序控制的计算机设备。该计算机设备可以是终端设备,也可以是云端设备,例如个人电脑,手机,云端主机等。一般情况下,僵尸主机已经被人操控并和其他僵尸主机组成了一个僵尸网络。例如,一个人非法控制了10000台电脑,他可以同时调度这10000台电脑发起网络攻击行为,那么其中任意一台电脑就可以称为僵尸主机,而这10000台电脑就组成了僵尸网络(其实是每个电脑中被安装了僵尸客户端程序)。通常,一台被侵占的电脑只是僵尸网络里面众多僵尸主机中的一个,僵尸程序会默默在后台运行。一般电脑的拥有者很难察觉到自己的系统已经被“僵尸化”,就仿佛是没有自主意识的僵尸一般。你用的手机电脑表面上看起来正常,也可能是被感染僵尸程序的一员。

肉鸡

肉鸡泛指所有那些被别人控制的计算机设备(电脑和手机等),而不管其是否属于某个僵尸网络,是否被统一调度。计算机设备一旦被别人控制,就成为了别人砧板上的肉,别人想怎么吃就怎么吃,肉鸡(机)一名由此而来,也被称之为傀儡机。当然在肉鸡上安装僵尸程序之后,也就变成一个僵尸主机了,即大家所说的僵尸电脑,也就成了僵尸网络的一员。

DDos攻击

DDos,全称Distributed Denial of Service,中文意思为“分布式拒绝服务”,就是利用大量合法的分布式计算机设备对目标服务器(网站等)发送请求,导致目标服务器CPU、内存、带宽等资源耗尽,从而导致正常用户无法访问目标服务器。通俗点讲就是利用网络节点资源,如:IDC服务器、个人PC、手机、智能设备、打印机、摄像头等对目标发起大量攻击请求,从而导致服务器拥塞,进而无法对外提供正常服务。

CC攻击

CC攻击(Challenge Collapsar)。其前身名为Fatboy攻击。Collapsar(黑洞) 是绿盟科技的一款抗DDOS产品,在对抗拒绝服务攻击的领域内具有很高的影响力和口碑。因此,黑客们把攻击更名为Challenge Collapsar,表示要向黑洞发起挑战。

CC攻击是DDOS(分布式拒绝服务)的一种,是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向受害主机不停访问,造成服务器的内存或CPU等资源耗尽或带宽资源耗尽,直到网站无法访问。

因为CC攻击的访问流量来自成千上万,几十万,甚至数百万的电脑,手机,云主机等客户端。几乎和正常的用户访问没区别,这些攻击请求不具备明显的特征,很难和正常访问区分开来,防御难度也很大。尤其是利用肉鸡组成的僵尸网络发起攻击,动辄是数以万计的机器(其中很多机器可能都是普通用户使用的电脑手机等),这种攻击请求和正常用户请求非常相似,防御难度就更大了。

慢速攻击--CC攻击的变异品种

慢速攻击的基本原理如下:对任何一个开放了HTTP访问的HTTP服务器,先建立了一个连接,指定一个比较大的Content-length,然后以非常低的速度发表,比如1-10s发一个字节,然后维持住这个连接不断开。如果客户端持续建立这样的连接,那么服务器上可用的连接将一点一点被占满,从而导致拒绝服务。

HTTP协议在接收到request之前是不对请求内容作校验的,所以即使你的Web应用没有可用的form表单,这个攻击一样有效。

在客户端建立较大数量的无用连接,并保持持续发包的代价非常的低廉。实际试验中一台普通PC可以建立的连接在3000个以上。这对一台普通的Web服务器,将是致命的打击。更不用说结合肉鸡群做分布式攻击了。

正因为其简单易用,成本低廉,效果明显的特性,慢速攻击成为众多攻击者的研究和利用对象。

发展到今天,慢速攻击也演变成了多种,典型的主要包括如下几类:

Slow headers:Web应用在处理HTTP请求之前都要先接收完所有的HTTP头部,因为HTTP头部中包含了一些Web应用可能用到的重要的信息。攻击者利用这点,发起一个HTTP请求,一直不停的发送HTTP头部,消耗服务器的连接和内存资源。攻击客户端与服务器建立TCP连接后,每10秒才向服务器发送一个HTTP头部,而Web服务器在没接收到2个连续的\r\n时,会认为客户端没有发送完头部,而持续的等待客户端发送数据。

下面是使用 slowhttptest 工具发起的 slow header 攻击:

Slowhttptest 所发送的请求

服务端连接数变化

Slow body:攻击者发送一个HTTP POST请求,该请求的Content-Length头部值很大,使得Web服务器或代理认为客户端要发送很大的数据。服务器会保持连接准备接收数据,但攻击客户端每次只发送很少量的数据,使该连接一直保持存活,消耗服务器的连接和内存资源。攻击客户端与服务器建立TCP连接后,发送了完整的HTTP头部,POST方法带有较大的Content-Length,然后每10s发送一次随机的参数。服务器因为没有接收到相应Content-Length的body,而持续的等待客户端发送数据。

Slow read:客户端与服务器建立连接并发送HTTP请求,客户端发送完整的请求给服务器端,然后一直保持这个连接,以很低的速度读取Response,比如很长一段时间客户端不读取任何数据,通过发送Zero Window到服务器,让服务器误以为客户端很忙,直到连接快超时前才读取一个字节,以消耗服务器的连接和内存资源。

注:TCP通过滑动窗口(Window)的概念来进行流量控制。设想在发送端发送数据的速度很快而接收端接收速度却很慢的情况下,为了保证数据不丢失,显然需要进行流量控制, 协调好通信双方的工作节奏。所谓滑动窗口,可以理解成接收端所能提供的缓冲区大小。顾名思义,Zero Window,零窗口,即当发送方的发送速度大于接收方的处理速度,接收方的缓冲塞满后,就会告诉发送方当前窗口size=0,发送方此时会立即停止发送数据。

慢速攻击主要利用的是thread-based(基于线程)架构的服务器的特性,这种服务器会为每个新连接打开一个线程,它会等待接收完整的HTTP头部才会释放连接。比如Apache会有一个超时时间来等待这种不完全连接(默认是300s),但是一旦接收到客户端发来的数据,这个超时时间会被重置。正是因为这样,攻击者可以很容易保持住一个连接,因为攻击者只需要在即将超时之前发送一个字符,便可以延长超时时间。而客户端只需要很少的资源,便可以打开多个连接,进而占用服务器很多的资源。

Apache、httpd都采用thread-based架构,很容易遭到慢速攻击。而另外一种event-based(基于事件)架构的服务器,比如 nginx 和 lighttpd 却不容易遭受慢速攻击。

如何防御慢速攻击?

如果请求超过配置的超时时间或者传输速率低于最小速率,那么它就有可能是一个慢速攻击。可以配置合理的从客户端接收HTTP头部和HTTP body的超时时间和最小速率,来避免连接长时间等待。

周期地统计报文数量。一个TCP连接,HTTP请求的报文中,报文过多或者报文过少都是有问题的,如果一个周期内报文数量非常少,那么它就可能是慢速攻击,可以封禁对应IP;如果一个周期内报文数量非常多,那么它就可能是一个CC攻击。

使用较多的慢速攻击工具有:Slowhttptest和Slowloris。

CC等DDos攻击的防御方法如下:

按IP限流

我们可以在网关层(Apache,Nginx,Zuul等),对IP限流,按分钟级和秒级维度限制接口访问次数。当访问次数超过指定阀值后对其他请求做抛弃处理。对访问量过大的IP,放进黑名单,限制访问。将恶意请求的拦截前置到网关层处理,避免大量恶意请求打到后端服务,对服务造成巨大压力。

分组部署,按用户限流

可以将新用户和老用户路由到不同的服务器群组。如果新用户突然暴涨,很可能是混入了大量肉鸡注册的账号,可以将这些新用户的请求路由到专门的新用户服务器群组,保证老用户所在的服务器群组不受影响。之后再找出异常的用户进行封禁和拦截处理。另外还可以按USERID对用户进行限流,如新用户每分钟请求上限为60次/分钟,老用户为45次/分钟。这样可以避免同一用户在短时间内发送大量请求到后端服务器。

更改访问端口

很多情况下,Web Server通过80端口对外提供服务,攻击者也是针对目标站点的对应端口进行攻击的。发现被攻击后,可以临时改变该端口来应对攻击。但是这只是临时策略,稍微懂点网络知识的攻击者会很快发现新改变的接口,改变攻击脚本后即可发动新一轮的攻击。

购买高防IP服务

高仿IP服务算是终极抗D方案了。公司可以通过配置DDoS高防IP服务,把自己的网站域名解析指向高防IP,并配置源站IP。所有公网流量都经过高防IP服务,在高防IP服务上进行清洗过滤后再将正常流量转发到源站IP,从而确保源站IP稳定访问。另外,高防IP服务往往拥有超大带宽,一般的CC攻击几乎不可能耗尽高防IP服务的带宽资源。高防IP防御效果非常好,不过价格也比较贵。我们当时就是采用了这个方式,紧急采购了高防IP,并快速接入我们的网站。

高防IP服务会通过多种手段对请求进行清洗。比如,会根据大数据分析结果,形成各种特征的IP名单。还会根据请求特征对攻击工具进行识别。

页面静态化

尽量将页面静态化,减少对后端服务的访问。静态页面可以充分利用客户端浏览器和反向代理的缓存能力。还可以上CDN,用CDN分担绝大部分的流量。可以大幅降低攻击流量到达后端服务的几率。

避免IP泄漏

为了减少被DDos攻击的可能性,我们需要隐藏真实IP,这可以让攻击者找不到攻击目标,从而有效地保护网站。隐藏IP主要有两种方式,利用CDN或者高防IP。虽然很多公司都接入了CDN,但是还有很多要注意的点,一不留神就会泄漏真实IP。

尽量避免真实业务主机直接发起对外连接,不理解这句的同学可以想想以下场景:用户注册激活、找回密码等业务需要发邮件,如果业务主机直接通过SMTP方式向外发邮件,绝大部分情况下邮件HEADER中会出现真实IP。

防止二级域名IP泄漏。主域名上了CDN,如果管理后台的admin的二级域名没有经过CDN,就可以轻易解析到业务主机的IP,同样泄漏了真实IP。邮件解析的MX,如果没有经过CDN,同样会泄露真实IP。CDN如果只用了国内的,则可以通过国外主机PING域名来获取真实IP。诸如此类的情况比较多,要引起大家的注意。

注:MX即邮件交换记录。用于将以该域名为结尾的电子邮件指向对应的邮件服务器。例如用户所用的邮件是以域名163.com为结尾,那么在MX解析时就要解析到163.com对应的服务器IP。如果没有经过CDN,很容易获取真实IP。

最后介绍几款分布式网络攻击工具:

LOIC:LOIC是一款专注于web应用程序的Dos/DDOS攻击工具,它可以用TCP数据包、UDP数据包、HTTP请求对目标网站进行DDOS/DOS测试,不怀好意的人可能利用LOIC构建僵尸网络。LOIC是用C#语言写的,这是一个C#新手的练手作品,靠GUI界面吸引了不明真相的小白们使用。由于程序设计上“有意或无意”留下的BUG导致一旦开始攻击在退出进程前无法真正停止攻击,潜在增大了攻击效果。攻击手段主要是以无限循环方式发送大量数据,并无其它特色。LOIC 程序主界面如下。

HULK:HULK是一种web的拒绝服务攻击工具。它能够在web服务器上产生许多单一的伪造流量,能绕开引擎的缓存,因此能够直接攻击服务器的资源池。hulk的特别之处在于:对于每一个请求都是独特的,能够绕开引擎的缓存直接作用于服务器的负载。

Darkddoser:Darkddoser通过僵尸网络发起http攻击,图形界面如下。

Slowhttptest:Slowhttptest是一个可以灵活配置的应用层攻击工具,它能发起诸如slowloris、Slow http post、slow read、slow range等工具实现的慢速攻击。

Zarp:Zarp是采用Python编写的、类似MSF的一款网络攻击测试框架。工具采用模块化设计,集漏洞扫描、嗅探、DDoS压力测试于一身。Zarp主要接口是一个CLI驱动的图形界面,采用多层菜单,使用起来相当方便。

写在最后

在计算机世界的攻与防的博弈中,作为防御者的我们,不可能把系统做到无懈可击,没有任何安全漏洞。我们能做的是,尽量考虑全面,不断的发现问题,将已知的安全问题快速修复。没有绝对安全的系统,也没有无法防御的黑客。只有不断积累安全知识,保持居安思危的意识才能让我们从容应对网络攻击。

如果觉得本文对你有帮助,可以点赞关注支持一下

相关推荐

Python钩子函数实现事件驱动系统(created钩子函数)

钩子函数(HookFunction)是现代软件开发中一个重要的设计模式,它允许开发者在特定事件发生时自动执行预定义的代码。在Python生态系统中,钩子函数广泛应用于框架开发、插件系统、事件处理和中...

Python函数(python函数题库及答案)

定义和基本内容def函数名(传入参数):函数体return返回值注意:参数、返回值如果不需要,可以省略。函数必须先定义后使用。参数之间使用逗号进行分割,传入的时候,按照顺序传入...

Python技能:Pathlib面向对象操作路径,比os.path更现代!

在Python编程中,文件和目录的操作是日常中不可或缺的一部分。虽然,这么久以来,钢铁老豆也还是习惯性地使用os、shutil模块的函数式API,这两个模块虽然功能强大,但在某些情况下还是显得笨重,不...

使用Python实现智能物流系统优化与路径规划

阅读文章前辛苦您点下“关注”,方便讨论和分享,为了回馈您的支持,我将每日更新优质内容。在现代物流系统中,优化运输路径和提高配送效率是至关重要的。本文将介绍如何使用Python实现智能物流系统的优化与路...

Python if 语句的系统化学习路径(python里的if语句案例)

以下是针对Pythonif语句的系统化学习路径,从零基础到灵活应用分为4个阶段,包含具体练习项目和避坑指南:一、基础认知阶段(1-2天)目标:理解条件判断的逻辑本质核心语法结构if条件:...

[Python] FastAPI基础:Path路径参数用法解析与实例

查询query参数(上一篇)路径path参数(本篇)请求体body参数(下一篇)请求头header参数本篇项目目录结构:1.路径参数路径参数是URL地址的一部分,是必填的。路径参...

Python小案例55- os模块执行文件路径

在Python中,我们可以使用os模块来执行文件路径操作。os模块提供了许多函数,用于处理文件和目录路径。获取当前工作目录(CurrentWorkingDirectory,CWD):使用os....

python:os.path - 常用路径操作模块

应该是所有程序都需要用到的路径操作,不废话,直接开始以下是常用总结,当你想做路径相关时,首先应该想到的是这个模块,并知道这个模块有哪些主要功能,获取、分割、拼接、判断、获取文件属性。1、路径获取2、路...

原来如此:Python居然有6种模块路径搜索方式

点赞、收藏、加关注,下次找我不迷路当我们使用import语句导入模块时,Python是怎么找到这些模块的呢?今天我就带大家深入了解Python的6种模块路径搜索方式。一、Python模块...

每天10分钟,python进阶(25)(python进阶视频)

首先明确学习目标,今天的目标是继续python中实例开发项目--飞机大战今天任务进行面向对象版的飞机大战开发--游戏代码整编目标:完善整串代码,提供完整游戏代码历时25天,首先要看成品,坚持才有收获i...

python 打地鼠小游戏(打地鼠python程序设计说明)

给大家分享一段AI自动生成的代码(在这个游戏中,玩家需要在有限时间内打中尽可能多的出现在地图上的地鼠),由于我现在用的这个电脑没有安装sublime或pycharm等工具,所以还没有测试,有兴趣的朋友...

python线程之十:线程 threading 最终总结

小伙伴们,到今天threading模块彻底讲完。现在全面总结threading模块1、threading模块有自己的方法详细点击【threading模块的方法】threading模块:较低级...

Python信号处理实战:使用signal模块响应系统事件

信号是操作系统用来通知进程发生了某个事件的一种异步通信方式。在Python中,标准库的signal模块提供了处理这些系统信号的机制。信号通常由外部事件触发,例如用户按下Ctrl+C、子进程终止或系统资...

Python多线程:让程序 “多线作战” 的秘密武器

一、什么是多线程?在日常生活中,我们可以一边听音乐一边浏览新闻,这就是“多任务处理”。在Python编程里,多线程同样允许程序同时执行多个任务,从而提升程序的执行效率和响应速度。不过,Python...

用python写游戏之200行代码写个数字华容道

今天来分析一个益智游戏,数字华容道。当初对这个游戏颇有印象还是在最强大脑节目上面,何猷君以几十秒就完成了这个游戏。前几天写2048的时候,又想起了这个游戏,想着来研究一下。游戏玩法用尽量少的步数,尽量...

取消回复欢迎 发表评论: