这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
1.重点内容
- 攻击篇
- Cross-Site Scripting (XSS) 跨站脚本攻击
2.详细知识
2.1 攻击篇
2.1.1 Cross-Site Scripting (XSS) 跨站脚本攻击
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序 ——百度百科
产生原因
盲目信任用户提交的内容
特点
- 通常难以从UI上感知(暗地里执行脚本)
- 窃取用户信息(cookie/token)
- 绘制UI(例如弹窗), 诱骗用户点击/填写表单
分类
Stored XSS 存储型xss攻击
- 恶意脚本被存在数据库中
- 访问页面 -> 读数据 == 被攻击
- 危害最大, 对全部用户可见
Reflected 反射型xss攻击
- 不涉及数据库
- 从URL上攻击
DOM-based XSS攻击
和Reflected 类似, 区别在于DOM-based是在浏览器端进行脚本注入, reflected 是在服务器端
mutation-bsed xss
- 利用浏览器渲染DOM的特性
- 不同浏览器,会有区别 例如:
<noscript><p title="</noscript><img src=x onerror=alert(1)>">
会被渲染成
<div>
<noscirpt><p title="</noscript>
<img src="X" onerror="alert(1)">
"">"
</div>
2.1.2 CSRF 跨站伪造请求
特点
- 在用户不知情的情况下
- 利用用户权限(cookie)
- 构造指定HTTP 请求, 窃取或修改用户敏感信息
2.1.3 InjectIion 注入
- 请求携带的参数是一个sql语句
- 服务器运行SQLcode
- 实现数据库操作(获取其他数据, 修改数据..)
例子:
public async renderForm(ctx) {
const {username, form_id } = ctx.query
const result = await sql.query(`
SELECT a, b, c, FROM table
WHERE username = ${username}
AND form_id = ${form_id}
`)
不仅只限于SQL 可以是命令行, 系统命令, 服务器端的伪造请求
2.1.4 DOS 服务拒绝
通过某种方式(构造特定请求), 导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压, 进而雪崩雪崩效应
基于正则的DOS
请求携带参数为
/^((ab)*)+$/
这样服务器就会去重复匹配(回溯请求), 从而消耗服务器的运算资源
distributed DOS 分布式DDOS
短时间内,来自大量僵尸设备的请求流量, 服务器不能及时完成全部请求, 导致请求堆积, 进而雪崩效应, 无法响应新请求
2.1.5 中间人攻击
你和服务器的通信被转发到了一个“中间人”(恶意 webView, 路由器等),你的所发送给服务器的信息被中间人恶意篡改
2.2 防御篇
2.2. 1 XSS防御
永远不要相信用户的提交内容
不要将用户提交内容转换成DOM
XSS防御框架
-
前端
- 主流的默认框架防御 (vue, react)
- google-closure-library
-
服务端(node)
- DOMPurify
如果必须字符串转DOM, 需要预先对字符串进行处理
上传SVG 也要注意里面可能嵌入XSS脚本
尽量不要让用户自定义跳转,
自定义样式也有肯能导入XSS 攻击
2.2.2 CSRF防御
请求头限制:
Origin 限制跨域: 同源请求中,GET + HEAD 不发送
Referer
使用token
iframe攻击
设置: X-Frame-Options:DENY/SAMEORIGIN
2.2.3 Injection 防御
找到SQL的地方, 使用Prepared statement
2.2.5 防御DDOS
2.2.4 防御中间人
使用HTTPS