网络攻击与防范
# 介绍一下什么是xss
特别重要
概念:
xss
是跨站脚本攻击,是一种代码注入攻击,攻击者通过,攻击者通过网站注入恶意脚本,使之在用户的浏览器上运行,进而盗取用户的信息如cookies
等
本质:
网站对恶意代码进行过滤,与正常的代码混合在一起,浏览器无法分辨哪些是可信的,导致恶意代码执行
方式:
获取页面的数据,如
DOM
cookies
localstorge
dos
攻击 发送合理请求 占用服务器资源,使得服务器无法访问服务器破坏页面结构
流量劫持(将链接指向某网络)
攻击类型
xss
可分为存储型
反射型
DOM型
存储型指恶意脚本会存储到目标服务器上,当浏览器请求数据,脚本从服务器传回并执行
反射型指的是攻击者诱导用户访问一个带有恶意的代码的
URL
后,服务端接收数据后处理,把带有恶意代码发送到浏览器端,浏览器端解析这段xss
代码的数据当做脚本执行,最终完成xss
攻击dom
型指的是修改页面的dom
节点形成的xss
存储xss
攻击步骤
攻击者将恶意代码提交到目标网站的数据库
用户打开目标网站,网站服务端从数据库中取出,拼接在
html
中返回给浏览器用户浏览器接收到响应后解析执行,混在其中的恶意代码被执行
恶意代码窃取用户数据并发送到攻击者网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定操作
多用于带有用户保存数据的网站功能,如论坛发帖 商品评论 用户私信
反射性xss
攻击步骤
攻击者构造出特殊
URL
,包含恶意代码用户打开这个
URL
,网站服务端将恶意代码从URL
中取出,拼接在HTML
中返回给浏览器用户浏览器接收到响应后解析执行,恶意代码也被执行
恶意代码窃取用户数据并发送到攻击者网站,或冒充用户
反射型漏洞常见于通过URL
传递参数,如网站的搜索,跳转等,由于用户需要主动打开恶意的URL
才能生效,攻击者会结合多种手段诱导点击(例如诱导用户点击电子邮件的链接)
反射型和存储型主要区别是:反射型恶意代码存储在URL
中,存储型恶意代码存储在数据库中
dom
型xss
攻击步骤
构造特殊的
URL
,包含恶意代码用户打开这个
URL
用户浏览器接收到响应后解析执行,前端
js
取出URL
中的恶意代码并执行恶意代码窃取用户数据并发送到攻击者网站,或冒充用户
dom
和反射型的区别是反射型是他点击了一个链接然后他在服务端拦截然后操作你的信息或让你跳转到某个页面去,而dom
型就是控制你的dom
,当你点击之后他会弹出信息或者操作你的信息或者在页面中嵌入插入一个链接,其地址为用户输入的内容
# 如何防范xss
攻击特别重要
不使用服务端渲染,或者严格定义
Content-Type: application/json
,对插入到html
中的代码充分转义使用
csp
,意思就是建立一个白名单,告诉浏览器哪些外部资源是可以加载执行的,防止恶意代码的注入CSP
指的是内容安全策略,它的本质是建立一个白名单,告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则,如何拦截由浏览器自己来实现。通常有两种方式来开启CSP
,一种是设置HTTP
首部中的Content-Security-Policy
,一种是设置meta
标签的方式<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:"> // 脚本:只信任当前域名 // <object>标签:不信任任何URL,即不加载任何资源 // 样式表:只信任cdn.example.org和third-party.org // 框架(frame):必须使用HTTPS协议加载 // 其他资源:没有限制
1
2
3
4
5
6
对一些敏感信息进行保护,比如
cookies
使用http-only
,使得脚本无法获得,也可以使用验证码,避免脚本伪装成用户进行操作如果服务端被黑了,返回一串恶意执行的代码,可以将执行的代码转发到服务端进行校验
JSONP
内容校验,再返回校验结果
# 介绍一下什么是CSRF
特别重要
概念:
指的是跨站请求伪造攻击,攻击者诱导用户进入第三方网站,然后该网站向被攻击网站发送跨站请求,如果用户在被攻击的网站保存了登录状态,那么攻击者就可以利用这个登录状态来冒充用户向原有网站发出请求了
本质:
利用cookies
会在同源请求中携带发送给服务器的特点来实现用户的冒充
攻击类型:
get
类型的csrf
攻击:在网站的img
标签构建一个请求,当用户打开这个网站就自动发起请求
post
类型的:构建一个表单,隐藏他,当用户进入页面的时候自动提交这个表单
链接类型的csrf
:在a
标签里面构建一个请求,诱导用户去点击
# 如何防范csrf
攻击特别重要
- 进行同源检测,服务器根据
http
请求头中origin
或者referer
信息来判断请求是否为允许访问的站点,从而对请求进行过滤。当origin
或者referer
信息都不存在的时候,直接阻止请求。这种方式的缺点是有些情况下referer
可以被伪造,同时还会把搜索引擎的链接也给屏蔽了。所以一般网站会允许搜索引擎的页面请求,但是相应的页面请求这种请求方式也可能被攻击者给利用。(Referer
字段会告诉服务器该网页是从哪个页面链接过来的)
为什么会出现referer和origin两个类似的请求头呢
referer
显示来源页面的完整地址,而origin
显示来源页面的origin: protocal+host
,不包含路径等信息,也就不会包含含有用户信息的敏感内容
使用
CSRF Token
进行验证,服务器向用户返回一个随机数Token
,当网站再次发起请求时,在请求参数中加入服务器端返回的token
,然后服务器对这个token
进行验证。这种方法解决了使用cookie
单一验证方式时,可能会被冒用的问题,但是这种方法存在一个缺点就是,我们需要给网站中的所有请求都添加上这个token
,操作比较繁琐。还有一个问题是一般不会只有一台网站服务器,如果请求经过负载平衡转移到了其他的服务器,但是这个服务器的session
中没有保留这个token
的话,就没有办法验证了。这种情况可以通过改变token
的构建方式来解决。对
Cookie
进行双重验证,服务器在用户访问网站页面时,向请求域名注入一个Cookie
,内容为随机字符串,然后当用户再次向服务器发送请求的时候,从cookie
中取出这个字符串,添加到URL
参数中,然后服务器通过对cookie
中的数据和参数中的数据进行比较,来进行验证。使用这种方式是利用了攻击者只能利用cookie
,但是不能访问获取cookie
的特点。并且这种方法比CSRF Token
的方法更加方便,并且不涉及到分布式访问的问题。这种方法的缺点是如果网站存在XSS
漏洞的,那么这种方式会失效。同时这种方式不能做到子域名的隔离。在设置
cookie
属性的时候设置Samesite
,限制cookie
不能作为被第三方使用,从而可以避免被攻击者利用。
samesite的几种形式
strict | lax | None |
---|---|---|
完全禁止第三方cookies | 大多数情况下不发送cookies ,像img 的src post 请求等都不发送cookies | 发送cookies |
链接<a href="..."></a> | 当且仅当开启secure 模式 | |
get 表单<form method="GET" action="..."> | ||
预加载<link rel="prerender" href="..."/> |
# 介绍一下什么是中间人攻击特别重要
概念
中间人攻击是指攻击者在通讯两端分别创立的联系,并交换其收到的数据,是通讯两端认为他们正在一个私密的连接与对方直接对话,但是事实上整个会话都被攻击者完全控制,在中间人攻击中,攻击者可以拦截通讯对方的内容进行篡改或插入新内容
攻击过程:
- 客户端发请求到服务端,请求被中间人截获
- 服务器向客户端发送公钥
- 中间人获取公钥,保留在自己手中,给客户端发送中间人自己伪造的公钥
- 客户端收到伪造的公钥,生成加密
hash
发给服务器 - 中间人截获加密
hash
,用自己的私钥解密获得真正的密钥,同时生成假的加密hash
发送给服务器 - 服务器用私钥解密获得假密钥,然后加密数据传输给客户端
# 介绍一下sql
注入重要
SQL
注入是一种非常常见的数据库攻击手段,也是网络世界中最普遍的漏洞之一,它其实就是黑客在表单中填写包含 SQL
关键字的数据,表单数据提交给服务器时让数据库执行恶意 SQL
的过程。
例如 ' OR '1'='1
,当我们输如用户名 admin
,然后密码输如 ' OR '1'=1='1
的时候,我们在查询用户名和密码是否正确的时候
本来要执行的是 SELECT * FROM user WHERE username='' and password=''
经过参数拼接后,会执行 SQL
语句 SELECT * FROM user WHERE username='' and password='' OR '1'='1'
,这个时候1=1
是成立,自然就跳过验证了。
# 如何防止 SQL
注入重要
主要是后端进行对 SQL
注入攻击的防护,常见的防护机制有:
- 使用
preparestatement
预编译机制: 在sql
语句执行前,对其进行语法分析、编译和优化,其中参数位置使用占位符?
代替了。当真正运行时,传过来的参数会被看作是一个纯文本,不会重新编译,不会被当做sql
指令 - 特殊字符转义: 些特殊字符,比如:
%
作为like
语句中的参数时,要对其进行转义处理 - 使用代码检测工具: 使用
sqlMap
等代码检测工具,它能检测sql
注入漏洞 - 数据库账号增加权限控制、数据库异常监控等等
# 介绍一下DDoS
攻击重要
Dos 拒绝服务攻击(Denial of Service attack)
是一种能够让服务器呈现静止状态的攻击方式。其原理就是发送大量的合法请求到服务器,服务器无法分辨这些请求是正常请求还是攻击请求,所以会照单全收。海量的请求造成服务器进入停止工作或拒绝服务的状态。
DDoS
:分布式拒绝服务攻击(Distributed Denial of Service)
,DDos
攻击是在 DOS
攻击基础上的,可以通俗理解,dos
是单挑,而 ddos
是群殴,因为现代技术的发展,dos
攻击的杀伤力降低,所以出现了DDOS
,攻击者借助公共网络,将大数量的计算机设备联合起来,向一个或多个目标进行攻击
# 介绍一下上传文件攻击
如果 web
网站没有对文件类型进行严格的校验,导致可执行文件被恶意上传到了服务器,恶意脚本就会执行
# 如何防止上传文件攻击
- 文件上传后放到独立的存储上,做静态文件处理,杜绝脚本执行的可能
- 对上传文件类型进行白名单校验
- 使用随机数改写文件名和文件路径等等
# 介绍一下有哪些可能造成前端安全问题
跨站攻击脚本
iframe
的滥用:iframe
中的内容是由第三方提供的,默认不受控制,可以在iframe
上运行js
脚本,flash
脚本弹出对话框等破坏前端用户体验csrf
恶意第三方库
# 网络劫持有哪几种,如何防范重要
DNS
劫持:输入jd.com
强制跳转到taobao.com
属于dns
劫持dns
强制解析:通过修改运营商的本地dns
记录,来引导用户流量到缓存服务器302
跳转:通过监控网络出口的流量,分析判断哪些内容是可以进行劫持处理的,再对劫持的内存发起302
跳转的回复,引导用户获得内容
HTTP
劫持:访问google.com
一直有贪玩蓝月广告,由于http
明文传输,运营商会修改你的http
响应内容
dns
劫持由于涉嫌违法,已经被监管起来,现在很少有dns
劫持,而http
劫持依然非常盛行,最有效的方法还是使用https
,使得运营商无法获取明文,就无法劫持你的响应内容