常见的web攻击方法及与flask的关系

本文主要介绍了XSS、SQL注入、CSRF、DDOS这四种常见的web攻击的基本概念,并列出其一般的防御方式。

而flask是一种成熟的web框架,故本文还调研并介绍了flask对这些攻击的处理方式。

XSS

概念

XSS攻击的全称为Cross Site Scripting,跨站脚本攻击。看到这里读者一定会产生疑问:为什么是XSS,而不是CSS呢?来看一下维基百科中的解释。

Cross-site scripting的英文首字母缩写本应为CSS,但因为CSS在网页设计领域已经被广泛指层叠样式表(Cascading Style Sheets),所以将Cross(意为“交叉”)改以交叉形的X做为缩写。但早期的文件还是会使用CSS表示Cross-site scripting。

原来是CSS已经有了,因此采用Cross的交叉之意而用字母X。

其攻击的核心理念是想方设法的在浏览器中执行第三方恶意脚本,以获取用户cookie等敏感信息。

一般防御方式

  • 过滤script等特殊字符

  • 在HTTP头中指定内容为HTML/JavaScript,避免含有攻击脚本的HTML被作为JavaScript解析。

    如下图是浏览器在请求维基百科时的HTTP头,指定了内容为HTML

    image-20210408230341321

flask对XSS的处理

针对XSS,flask主要是对使用的模板渲染引擎Jinja2进行了配置,使其对所有可能造成攻击的字符进行转义,这样就解决了所有由模板造成的XSS问题。但除此之外的其它问题仍需flask用户自己注意。

SQL注入

概念

SQL注入就是指在输入的字符串中混入恶意SQL指令,而被数据库被认为是正常的指令执行,从而达到窃取数据库资料或破坏数据库的目的。

如最著名的例子是前端输入的用户名或密码中含有' or '1'= '1,然后后台的数据库查询语句(尖括号内为参数)为

select * from user where username='<user_name>' and password='<password>'

在实际进行查询时,查询语句就变成了

select * from user where username='hanmeimei' and password='' or '1'= '1'

然后就会将所有用户的信息读出来...是不是很可怕!

一般的防御方式

  • 参数化查询

    在参数化查询时,服务器不会将参数的内容作为SQL指令的一部分来处理,而是会先将SQL指令进行编译,然后再套用参数执行。

    这个方法目前已被视为最有效可预防SQL注入攻击的攻击手法的防御方式。---参数化查询wiki

  • 转义单引号

  • 验证用户输入

flask对SQL注入的处理

flask的flask-sqlalchemy扩展对SQL语句中的引号都做了转义,但是如果在flask-sqlalchemy中使用原生语句的话还是需要注意SQL注入问题。

CSRF

概念

CSRF的全称为Cross Site Request Forgery,跨站请求伪造。攻击者会通过这种方法来利用用户的认证凭证,绕过网站的用户认证,冒充受害者进行操作,从而实现攻击的目的。

例如攻击者在a.com放了一个访问b.bank.com并执行打钱的动作,而用户之前登录过b.bank.com,浏览器中还有登录凭证,这时b.bank.com就会认为是用户想要执行打钱动作,接受了请求。

一般的防御方式

  • 同源检测

    可通过HTTP头的Origin和Refer字段来确定请求来源,Origin代表着请求来源域名,Refer代表请求来源地址。

    通过这种方法,可以过滤掉外域的域名。

    这种方法比较简单,但是相当于完全将安全交给了浏览器,并不是非常安全。而且也无法规避来自站内评论区、图片上传的攻击等。

  • CSRF Token

    由于CSRF攻击者无法获取用户cookie,因此可以让用户每次访问服务器时带上一个攻击者无法获得的token,服务端再对这个token进行验证。

  • 双重cookie

    在用户提交表单时,带上cookie中的csrf_token字段,然后服务端验证表单中的token与cookie中的是否一致。

flask对CSRF的处理

flask自身并没有提供对CSRF的保护:

Why does Flask not do that for you? The ideal place for this to happen is the form validation framework, which does not exist in Flask.

而flask-wtf是一个flask的表单扩展,它提供了CSRF的保护,用的是上面提到的双重cookie验证。

csrf protection workflow

但是目前经过简单的了解,只看到flask-wtf似乎只适用于服务器渲染的情况,如果只适用于服务器渲染的话前后端分离项目将不适用。

DDOS

概念

DOS的全称为Denial of Service,拒绝服务。前面再加个D就变成DDOS,全称为Distributed Denial of Service,分布式拒绝服务。

DDOS不是一种具体的攻击,而是一大类攻击的总称。可分为带宽消耗型及资源消耗型,以瘫痪网络及系统为目的。

常见的带宽消耗型攻击方式有:

  • UDP洪水攻击

    使用大量的UDP包占满带宽。

  • ICMP洪水攻击

    向未设置良好的路由器发送广播信息。

  • 死亡之Ping

    向目的服务器发送错误封包或恶意的ping命令。

常见的资源消耗型攻击方式有:

  • SYN泛洪攻击

    SYN泛洪攻击利用了TCP三次握手的机制,攻击者只发送第一次握手信息SYN而不发送第三次,这时服务器就会挂起连接,并不断返回SYN+ACK来等待攻击ACK。当挂起的连接过多时,其资源就会耗尽。

    一个常用的防御方式是降低SYN timeout的时间;其次是使用防火墙,如果重复地收到大量来自同一IP的SYN,则认为受到了攻击,并进行相应的过滤措施。

  • LAND攻击

    这种方式与SYN泛洪类似,但攻击数据包的源地址和目的地址都是被攻击服务器,造成机器死循环,最终死机。

  • CC攻击

    使用代理服务器向被攻击服务器发送大量的合法请求,以占用服务器资源。

  • 应用程序级洪水攻击

    主要出现在应用层,在应用层面进行无节制的资源申请。

一般的防御方式

  • 防火墙

  • 路由器

  • 交换机

  • 黑洞引导

    将流量引入一个空接口或不存在的地址,或是有能力处理流量的服务提供商。

  • 流量清洗

    将流量通过DDoS流量清洗中心,区分出恶意流量和正常流量。

flask对DDoS的处理

由上面的知识可以看到,对DDoS进行防御主要是在外部的网络设备或防火墙进行,因此在flask这一层和防范DDoS无关。谷歌搜”flask DDos“也没有得到什么有价值的信息。

参考资料

flask-Security Considerations

跨站脚本-wiki

Web 安全入门之常见攻击

总结几种常见web攻击手段及其防御方式

参数化查询-wiki

为什么参数化SQL查询可以防止SQL注入?

Is SQL injection protection built into SQLAlchemy's ORM or Core?

SQLAlchemy + SQL Injection

前端安全系列(二):如何防止CSRF攻击?

CSRF Protection in Flask

flask-wtf-CSRF Protection

DDOS 攻击的防范教程-阮一峰(讲述了作者的博客受到攻击及其防范)

SYN泛洪攻击原理及防御

Cookie Security for Flask Applications