常见网络攻击

XSS 攻击

xss【cross site script】跨站脚本攻击,因为缩写和css相同,因此别名叫xss攻击

  • 非持久性攻击
    通过发送带恶意脚本参数的url给用户,诱骗用户进行点击,从而获取到用户的信息,特点是:难发现,即时性,需要进行诱点
  • 持久性攻击
    通过提交表单事件的时候,把恶意代码送入数据库,当前端读取的时候,从数据库中拿到并渲染执行,特点是:持久性,危害面广
    防御方式:前后端在涉及到提交内容和直接渲染数据库内容的时候务必转义

CSRF 攻击

csrf【cross-site request forgery】跨站请求伪造攻击

  • 具体流程:如果A网站没有做任何对于csrf的防御工作,当用户登录A网站后,产生了cookie,cookie携带了一些私密的用户信息,然后用户点击了服务器B给的一个url,从而带上了cookie到B服务器中,B拿到之后就可以模拟用户的行为来操作实际用户的账户了。
  • 防御方式:用户登录后为用户生成一个单独的csrftoken,每次到服务器之后验证这个token,这个token不会被浏览器的cookie携带,因此不存在泄露的风险,同时只有cookie的情况下请求无法得到验证
  • 题外话:既然已经有了浏览器的同源策略,为什么还需要防止csrf,其实最根本的原因是当你用户domain A下的cookie的时候,即便你在domain B下,你给domain A发送请求的时候,浏览器还是会自动带上domain A下的所有cookie的。

SQL 注入

sql 注入是一种比较流行的攻击方式,比如当用户提交账号密码进行登录的时候,后端拿到这个username后直接去拼接了一段sql来执行,如下,我们期望的sql是这样的:

1
SELECT * FROM user WHERE username='zoumiaojiang' AND psw='mypassword'

但是实际运行的时候,用户在username那里输入了一点别的东西,使得sql变成了:

1
SELECT * FROM user WHERE username='zoumiaojiang' OR 1 = 1 --' AND psw='xxxx'

– 在sql中是注释的意思,因此实际运行的sql变为了

1
SELECT * FROM user WHERE username='zoumiaojiang' OR 1 = 1

1 = 1永远为真,因此攻击者绕过了密码就进入了这个用户的账户,后面可以做的事情就更多了,后果是非常严重的

  • 如何预防:
    • 对所有提交到sql的内容进行转义
    • 严格限制Web应用的数据库的操作权限
    • 后端代码检查输入的数据是否符合预期
    • 对进入数据库的特殊字符(’,”,\,<,>,&,*,; 等)进行转义处理,或编码转换
    • 所有的查询语句建议使用数据库提供的参数化查询接口
    • 在应用发布之前建议使用专业的 SQL 注入检测工具进行检测
    • 避免网站打印出 SQL 错误信息
    • 不要过于细化返回的错误信息

命令行注入

在代码中设定了一段shell脚本,并且其中的一部分内容是用户输入的内容,比如下面这个:

1
2
3
4
5
// 以 Node.js 为例,假如在接口中需要从 github 下载用户指定的 repo
const exec = require('mz/child_process').exec;
let params = {/* 用户输入的参数 */};

exec(`git clone ${params.repo} /some/path`);

如果正常的设置repo是没问题的,但是当用户这样给入的时候

1
https://github.com/xx/xx.git && rm -rf /* &&

碰巧你还是sudo权限执行的话,后果不堪设想~

  • 预防方式:
    • 后端对前端提交内容需要完全选择不相信,并且对其进行规则限制(比如正则表达式)。
    • 在调用系统命令前对所有传入参数进行命令行参数转义过滤。
    • 不要直接拼接命令语句,借助一些工具做拼接、转义预处理,例如 Node.js 的 shell-escape npm 包。

DDOS 攻击

ddos【Distributed Denial of Service】分布式拒绝服务

核心原理就是利用大量的请求造成服务器资源过载,服务不可用,比如我们某个服务器的最大承载流量是400的qps,那么当有人用qps500的频率来攻击我们服务器的时候,服务器就会因为qps太高导致挂掉,然后服务就没法用了,这个东西不算是安全问题,是一种流氓攻击。

除了通过请求的方式攻击,ddos最常见的还是网络层面的攻击,比如 SYN Flood、ACK Flood、UDP Flood、ICMP Flood 等;

  • syn flood:我们知道tcp的三次握手是需要时间的,当服务器进入握手的第一个环节,需要将syn+ask返回去来询问是否可以正常连接,但是这个时候因为攻击者的ip是假的,随机模拟的,导致一直无法响应,服务器对无法响应的ip会不停的重试,以防止丢包问题,因此这里链接一直被占用,并且无法得到释放,就会导致服务器资源吃紧,然后挂掉。

  • ack flood:在 TCP 连接建立之后,所有的数据传输 TCP 报文都是带有 ACK 标志位的,主机在接收到一个带有 ACK 标志位的数据包的时候,需要检查该数据包所表示的连接四元组是否存在,如果存在则检查该数据包所表示的状态是否合法,然后再向应用层传递该数据包。如果在检查中发现该数据包不合法,例如该数据包所指向的目的端口在本机并未开放,则主机操作系统协议栈会回应 RST 包告诉对方此端口不存在。

  • udp flood:由于 UDP 是一种无连接的协议,因此攻击者可以伪造大量的源 IP 地址去发送 UDP 包,此种攻击属于大流量攻击。正常应用情况下,UDP 包双向流量会基本相等,因此发起这种攻击的攻击者在消耗对方资源的时候也在消耗自己的资源。

  • ICMP Flood:ICMP Flood 攻击属于大流量攻击,其原理就是不断发送不正常的 ICMP 包(所谓不正常就是 ICMP 包内容很大),导致目标带宽被占用,但其本身资源也会被消耗。目前很多服务器都是禁 ping 的(在防火墙在可以屏蔽 ICMP 包),因此这种攻击方式已经落伍。

防御方式:
- 负载均衡
- 抗ddos设备,增加流量清洗
- 限制ip访问频率,拉黑ip

流量劫持

流量劫持就是当用户在访问A地址的时候,给用户呈现的不是全部的A,其中加载了一些广告或者别的东西等等内容

  • DNS 劫持
    也叫域名劫持,当用户打开baidu.com的时候,实际的DNS解析地址的IP是123,如果DNS解析服务器上被恶意处理了,很有可能查到的IP变成了456,从而把用户引导到了新的服务器上,返回一个类似的页面,再让用户输入账号密码,轻松获取账号信息,因为一般的域名解析服务器都是在运营商的手里,所以劫持都需要运营商参与的,运营商与黑产机构勾结下的产物。

  • HTTP 劫持
    由于http本身在网络中是明文传递的,因此不法运营商和黑产勾结可以修改http返回的页面,在其中插入一点别的内容,比如广告内容,然后再丢给用户,这样的话用户就不得不一直看一些没有用的广告,更狠一点可以直接把整个页面篡改掉,如果想要屏蔽这种现象的话可以使用https,因为https在传输过程中是加密的,无法被篡改

坚持原创技术分享,您的支持将鼓励我继续创作!