Web开发的安全之旅 | 青训营笔记

131 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的的第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

  • 不需要服务器的参与
  • 恶意攻击的发起+执行,全在浏览器完成

区别:完成注入脚本的地方

img_8.png

Mutation-based XSS

特点:

  • 利用浏览器渲染DOM的特性(独特优化)
  • 不同浏览器渲染不同,按浏览器进行攻击

img_9.png

上图中的title属性和p标签在chrome浏览器中被忽视,渲染了noscript,使效果彻底发送改变

CSRF 跨站伪造请求

特点:

  • 在用户不知情的前提下
  • 利用用户权限(cookie)
  • 构造指定HTTP请求,窃取或修改用户敏感信息
    例子: 利用恶意页面访问银行页面的接口,利用获取到的cookie进行验证,使请求执行成功

Injection 注入

SQL injection

过程:

img_7.png

其他

  • 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

过程

img_6.png 注意点:

  1. token要和用户绑定,不能所有用户的token都是一样的,因为攻击者也可以是注册用户=== 可以获取自己的token
  2. 要设置过期时间,否则token如果被窃取,那么之前所有的请求都会被暴露,同时之后的请求也会被长期利用

CSRF的防御-iframe

SameSite Cookie

Injection

  • 找到项目中查询SQL的地方 ,使用prepared statement
  • 最小权限原则:所有的命令不可以通过sudo来执行,限制root权限
  • 建立允许名单+过滤:rm等高危操作要拒绝
  • 对URL类型参数进行协议、域名、ip等限制:防止攻击者访问内网资源

DOS

Regex DoS

  • Code Review(拒绝贪婪模式)
  • 代码扫描 + 正则性能测试
  • 拒绝用户提供的使用正则

DDoS

img_10.png

传输层-防御中间人:HTTPS

数字签名:

privateKey+内容 -> signature(签名) publicKey:根据signature判断是不是对应的私钥

完整性

传输内容:加密信息+加密信息_hash

不可抵赖:数字签名

CA:certificate authority 服务的元信息通过CA提供的私钥被加密成证书,浏览器再通过CA提供的公钥进行证书验证

每一个主流浏览器都会大量内嵌CA的证书

当签名算法不够健壮时,签名算法有可能被暴力破解

可靠性:加密

通过对信息进行加密,避免了明文传输