这是我参与「第四届青训营 」笔记创作活动的的第3天
Web开发的安全之旅
攻击
XSS
- 作为开发者,盲目信任用户提交的内容
- string-> DOM: document.write element.innerHTML=anything SRR(user_data) 特点
- 通常难以从UI上感知(暗地执行脚本)
- 窃取用户信息(cookie/token)
- 绘制UI(例如弹窗),诱骗用户点击/填写表单
Stored XSS
- 恶意脚本被存在数据库中
- 访问页面->读数据-》被攻击
- 危害最大,对全部用户可见
例如:视频网站,在上传视频的数据中加入恶意脚本,那么每一个观看该视频的用户都会受到攻击
Reflected XSS
- 不涉及数据库
- 从URL上攻击
DOM-based XSS
- 不需要服务器的参与
- 恶意攻击的发起+执行,全在浏览器完成
区别:完成注入脚本的地方
Mutation-based XSS
特点:
- 利用浏览器渲染DOM的特性(独特优化)
- 不同浏览器渲染不同,按浏览器进行攻击
上图中的title属性和p标签在chrome浏览器中被忽视,渲染了noscript,使效果彻底发送改变
CSRF 跨站伪造请求
特点:
- 在用户不知情的前提下
- 利用用户权限(cookie)
- 构造指定HTTP请求,窃取或修改用户敏感信息
例子: 利用恶意页面访问银行页面的接口,利用获取到的cookie进行验证,使请求执行成功
Injection 注入
SQL injection
过程:
其他
- CLI
- OS命令
- SSRF(server-side request forgery)服务端伪造请求:例如通过伪造内网的网址,来盗取内网信息 影响:
- 利用rm -rf等命令删除数据
- 修改重要文件,例如nginx.conf中的location,让流量转入到第三方,使第三方扛不住激增的流量 ,从而使第三方服务下线
DoS 服务拒绝 denial of service
通过某种请求,导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而雪崩效应
正则表达式--贪婪模式
贪婪:? 非贪婪:没有 ?
ReDos:基于正则表达式的Dos
服务端:贪婪的正则表达式,攻击者传入一个需要不断回溯的字符串 -> 响应时间大大延长,接口吞吐量下降,响应用户请求次数大大下降
DDos
短时间内,来自大量僵尸设备请求流量 攻击特点:
- 直接访问IO
- 任意API
- 消耗大量带宽 过程:攻击者通过TCO向服务端发送大量SYN,服务端接受响应后返回ACK+SYN,但此时攻击者不再向 服务端返回ACK,没有完成连接,不能被释放。最终超过最大连接数,新请求不能被响应
传输层
中间人攻击
在浏览器和服务器中夹杂中间人 利用:
- 明文传输:信息都是暴露的
- 信息篡改不可知
- 服务器和浏览器都没有对对方身份进行验证,从而让中间人有机会存储
防御
永远不要相信用户提交的内容 永远不要将用户的提交内容转换成DOM
XSS
前端:
- 主流框架默认防御 XSS
- google*closure/library 服务端(Node):
- DOMPurify(完成字符串转移)
!用户需求:数据必须动态生存DOM 1.string->DOM:new DOMParser() 要对string进行转移 2.上传svg文件:对svg文件要进行扫描 3.自定义跳转链接:要扫描过滤 4.自定义样式:对设置url的地方额外小心
SOP:Same-origin Policy
同源:协议、域名、端口号相同 HTTP请求:同源(没问题)、跨域(看请求类型和服务器的配置)
CSP content security policy 服务安全策略
- 哪些源(域名)被认为是安全的
- 来自安全源的脚本可以执行,否则直接抛错
- 对eval + inline script 说NO
Content-Security-Policy: script-src 'self'
CSRF的防御-origin//referer
CSRF的请求来源是异常来源,限制请求来源->限制伪造请求
对origin和referer(更广泛)进行验证
CSRF的防御-token
过程
注意点:
- token要和用户绑定,不能所有用户的token都是一样的,因为攻击者也可以是注册用户=== 可以获取自己的token
- 要设置过期时间,否则token如果被窃取,那么之前所有的请求都会被暴露,同时之后的请求也会被长期利用
CSRF的防御-iframe
SameSite Cookie
Injection
- 找到项目中查询SQL的地方 ,使用prepared statement
- 最小权限原则:所有的命令不可以通过sudo来执行,限制root权限
- 建立允许名单+过滤:rm等高危操作要拒绝
- 对URL类型参数进行协议、域名、ip等限制:防止攻击者访问内网资源
DOS
Regex DoS
- Code Review(拒绝贪婪模式)
- 代码扫描 + 正则性能测试
- 拒绝用户提供的使用正则
DDoS
传输层-防御中间人:HTTPS
数字签名:
privateKey+内容 -> signature(签名) publicKey:根据signature判断是不是对应的私钥
完整性
传输内容:加密信息+加密信息_hash
不可抵赖:数字签名
CA:certificate authority 服务的元信息通过CA提供的私钥被加密成证书,浏览器再通过CA提供的公钥进行证书验证
每一个主流浏览器都会大量内嵌CA的证书
当签名算法不够健壮时,签名算法有可能被暴力破解
可靠性:加密
通过对信息进行加密,避免了明文传输