什么是 XSS 攻击?
简而言之,就是页面被注入了恶意代码。
攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如Cookie
、SessionID
等,进而危害数据安全。
本质:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。而由于直接在用户的终端执行,恶意代码能够直接获取用户的信息,或者利用这些信息冒充用户向网站发起攻击者定义的请求。
如何进行的 XSS 攻击?
有哪些地方可以被攻击呢?
- 用户输入片段
- 第三方链接
URL
参数POST
参数Referer
(可能来自不可信来源)Cookie
(可能来自其他子域注入)
攻击方式 1
- 攻击者构造出特殊的URL,其中包含恶意代码。
- 用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从
URL
中取出,拼接在HTML
中返回给浏览器。 - 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
常见于涉及数据保存的网页功能,如论坛发帖、评论私信。
攻击方式 2
- 攻击者将恶意代码提交到目标网站的数据库中。
- 用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在
HTML
中返回给浏览器。 - 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
常见于网站搜索、页面跳转
攻击方式 3
- 攻击者构造出特殊的URL,其中包含恶意代码。
- 用户打开带有恶意代码的
URL
。 - 用户浏览器接收到响应后解析执行,前端
JavaScript
取出URL
中的恶意代码并执行。 - 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
JS 自身安全漏洞
怎么防范 XSS 攻击?
防范要点:攻击者提交的恶意代码、浏览器执行的恶意代码。
- 输入过滤
- 代码和数据分离(纯前端渲染)
- 避免拼接
HTML
,同时对HTML
进行充分转义 - 使用某些
DOM API
时不要把不可信数据作为HTML
插入页面 - 输入内容长度控制(增加
XSS
攻击难度) - 使用
CSP
防范 - 验证码:防止脚本冒充用户提交危险操作。
HTTP-only Cookie
: 禁止JavaScript
读取某些敏感Cookie
,攻击者完成XSS
注入后也无法窃取此Cookie
- 主动检测
XSS
漏洞(手动攻击、扫描工具)
CSRF 攻击
什么是 CSRF 攻击?
跨站请求伪造(Cross-site Request Forgery)。攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求(通常是跨域)。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
特征:
- 攻击一般发起在第三方网站,而不是被攻击的网站(被攻击的网站无法防止攻击发生)。
- 攻击者利用受害者在被攻击网站的登录凭证,冒充受害者做出提交操作(不是直接窃取数据)。
- 整个过程攻击者并不能获取到受害者的登录凭证,仅仅是“冒用”。
- 跨站请求可以用各种方式:图片 URL、超链接、CORS、Form 提交等等。部分请求方式可以直接嵌入在第三方论坛、文章中,难以进行追踪。
如何进行的 CSRF 攻击?
CSRF 攻击典例
- 受害者登录
a.com
,并保留了登录凭证(Cookie
)。 - 攻击者引诱受害者访问了
b.com
。 b.com
向a.com
发送了一个请求:a.com/act=xx
。浏览器会默认携带a.com
的Cookie
。a.com
接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求。a.com
以受害者的名义执行了act=xx
。- 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让
a.com
执行了自己定义的操作
常见攻击方式
HTTP
的Get
请求- 表单提交(
POST
) - 点击诱导链接
怎么防范 CSRF 攻击?
CSRF
通常从第三方网站发起,被攻击的网站无法防止攻击发生,只能通过增强自己网站针对CSRF
的防护能力来提升安全性。
前面说到
CSRF
通常发生在第三方域名?
So,阻止不明外域访问
- 同源检测
- Samesite Cookie(不成熟)
整个攻击过程不能获取到 Cookie 等信息,只是“冒用”?
So,做提交操作时附加本域信息
CSRF Token
:要求所有的用户请求都携带一个CSRF
攻击者无法获取到的Token
。服务器通过校验请求是否携带正确的Token
,来把正常的请求和攻击的请求区分开,也可以防范CSRF
的攻击(服务器压力大)- 双重
Cookie
验证(服务器压力小,易于实施,但安全性没有CSRF Token
高)
其他防范措施
CSRF
测试CSRF
监控- 尽量少使用网页版邮件
- 尽量不打开可疑链接(必要时用不常用的浏览器打开)