这是我参与「第四届青训营 」笔记创作活动的的第5天
红蓝对抗:本文主要围绕攻-防两个方面展开
常见攻击方式
Cross-Site Scripting(XSS)
概念: 跨站脚本攻击(Cross-site scripting,通常简称为XSS)发生在客户端,跨站脚本攻击是指在存在安全漏洞的Web浏览器内运行非法的HTML标签或JavaScript进行的一种攻击。
原理: XSS 的原理是恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码,当用户浏览该页之时,嵌入其中 Web 里面的脚本代码会被执行,从而可以达到攻击者盗取用户信息或其他侵犯用户安全隐私的目的。
常见漏洞:
-
盲目信任用户提交内容
-
string → DOM
- document.write
- element.innerHTML = anyString;
- SSR(user_data)
特点:
- 难以从UI上感知(暗中执行脚本)
- 窃取用户信息(cookie/token)
- 绘制UI(如弹框),诱骗用户点击/填写表单
Stored XSS
- 恶意脚本经正常功能提交被存在数据库中
- 客户端从数据中读取数据时,会将其渲染并被执行
- 访问页面 → 读数据 === 被攻击
- 危害最大,对全部用户可见
Reflected XSS
- 最普遍的跨站类型
- 跨站攻击代码存在于链接中,通过请求攻击链接,经过服务端反射回来
- 即时性,不经过服务器存储,直接通过 HTTP 的 GET 和 POST 请求就能完成一次攻击
- 反馈率低,所以较难发现和响应修复
- 需要经过用户点击链接才能发起
<http://host/api/path?param=><script>攻击脚本</script>
async render(ctx) {
const { param } = ctx.query;
ctx.status = 200;
ctx.body = `<div>${param}</div>`;
}
DOM-based XSS
- 不需要服务端的参与
- 恶意攻击的发起 + 执行全部由浏览器完成
Mutation-based XSS
通过浏览器渲染机制,在渲染错误时执行回调,调用攻击脚本
防御:
-
永远不要信任用户提交的内容
-
不要将用户提交内容直接转换成DOM
- new DOMParser() 进行转义
- 上传SVG时进行扫描
- 让用户自定义跳转、样式时尤其需要注意,可以执行脚本的地方
防御策略:CSP
CSP 本质上就是建立白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行。只需要配置规则,如何拦截是由浏览器实现的。
- 设置 HTTP Header 中的 Content-Security-Policy
- 设置 meta 标签的方式
现成工具:
- 主流框架默认防御XSS
- google-closure-library
- DOMPurify
Cross-Site Request Forgery(CSRF)
在用户不知情的前提下,利用用户权限(cookie),构造指定HTTP请求,窃取或修改用户敏感信息
防御:
- 请求头部进行设置
- 不让第三方网站访问到用户
Cookie - 阻止第三方网站请求接口
- 请求时附带验证信息,比如验证码或者
Token - 重要操作增加二次图片验证码或滑动验证码等
- 致命操作使用二次密码验证或人脸识别等
- SameSite Cookie
SameSite和CORS区别
CSRF-iframe
用户在登陆 A 网站的系统后,被攻击者诱惑打开第三方网站,而第三方网站通过 iframe 引入了 A 网站的页面内容,用户在第三方网站中点击某个按钮(被装饰的按钮),实际上是点击了 A 网站的按钮。
防御:
- 通过配置
nginx发送X-Frame-Options响应头.
这个HTTP响应头 就是为了防御用 iframe 嵌套的点击劫持攻击。
这样浏览器就会阻止嵌入网页的渲染。
该响应头有三个值可选,分别是:
DENY,表示页面不允许通过 iframe 的方式展示。SAMEORIGIN,表示页面可以在相同域名下通过 iframe 的方式展示。ALLOW-FROM,表示页面可以在指定来源的 iframe 中展示。
- 使用
Javascript防御
判断顶层视口的域名是不是和本页面域名一致,如果不一致就让恶意网页自动跳转到我方的网页。
if (top.location.hostname !== self.location.hostname) {
alert("您正在访问不安全的页面,即将跳转到安全页面!")
top.location.href = self.location.href;
}
Injection
SQL injection
SQL注入攻击(SQL Injection),简称注入攻击、SQL注入,被广泛用于非法获取网站控制权,是发生在应用程序的数据库层上的安全漏洞。在设计程序,忽略了对输入字符串中夹带的SQL指令的检查,被数据库误认为是正常的SQL指令而运行,从而使数据库受到攻击。
可能导致数据被窃取、更改、删除,以及进一步导致网站被嵌入恶意代码、被植入后门程序等危害。
OS command
修改 + 读取系统内容,执行系统命令(如 rm -rf /)
Server-Side Request Forgery(SSRF)
利用服务器端具有内网访问权限的特点,进行攻击,获取内网信息。
防御:
- 构建Middlewares,对SQL进行过滤和预编译
- 最小权限,不要赋予sudo和root权限
- 建立允许名单
- 对URL类型参数进行协议、域名、ip等限制
Denial of Service(DoS)
- 通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而雪崩效应。
防御:
- code review
- 正则性能测试
- 不适用用户提供的正则
Distributed DoS(DDoS)
通过不停的去访问你的网站,让你的网站负荷过大承载不了而使网站无法被其他人访问
特点:
- 直接访问IP
- 任意API
- 消耗大量带宽
防御:
-
流量治理
- 负载均衡
- API网关
- CDN
-
快速自动扩容
-
非核心服务降级
中间人攻击
原理:
- 明文传输
- 信息篡改不可知
- 对方身份未验证
防御:
- 确保当前你所访问的网站使用了HTTPS
- 不要在公共Wi-Fi上发送敏感数据
- 如果你的网站使用了SSL,确保你禁用了不安全的SSL/TLS协议。
- 不要点击恶意链接或电子邮件。