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

154 阅读4分钟

笔记创作活动的的第 8 天。

常见的攻击方式

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

XSS 攻击主要利用了网站盲目信任用户提交的内容,导致攻击者向网站中注入恶意攻击的脚本被执行。

开发者危险的操作:document.writeelement.innerHTMLSSR

XSS 的特点:

  • 通常难以从 UI 上感知(暗地执行脚本)
  • 窃取用户信息(cookie、token)
  • 绘制 UI(例如弹窗),诱骗用户点击/填写表单

按照性质分类:

  • 存储型 XSS 攻击:恶意脚本被存入数据库中,危害很大,当用户访问网站读取该数据时,都会被脚本攻击到。
  • DOM 型 XSS 攻击:从 URL 地址注入脚本/host/path?param=<script>alert('攻击')</script>,当获取该参数时,就会执行恶意脚本,注入脚本和执行脚本的地方都在浏览器。
  • 反射型 XSS 攻击:与 DOM 型 XSS 攻击的区别在于,反射型是在服务器端被注入脚本,通过请求的响应到浏览器执行。
  • Mutation-based XSS 攻击:利用了浏览器渲染 DOM 的特性,不同浏览器会有区别(按浏览器独特优化再进行攻击) image.png

CSRF (Cross-site request forgery) 跨站伪造请求

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

image.png

常见攻击手段:构建恶意请求

用户点击a标签就发起恶意请求
<a href="https://blank.com/transfer?to=hacker&amount=100">点我抽奖</a>

用户访问页面,只要加载了这个img标签,就会发起恶意请求
<img style="dispaly:none" src="https://blank.com/transfer?to=hacker&amount=100" />

伪造form表单
<form action="https://blank.com/transfer?to=hacker&amount=100" method="POST">   
    <input name="amount" value="10000000000" type="hidden" />    
    <input name="to" value="hacker" type="hidden" />
</form>
复制代码

注入

SQL 注入

  1. 攻击者:请求 → 带有高危 SQL 语句的参数(恶意注入)
  2. 服务器:获取请求参数 → 根据参数拼接 SQL 代码 → 执行 SQL 代码(恶意 SQL 也会被执行)

服务器端(有漏洞的代码): image.png

攻击者: image.png

命令注入

服务器端(有漏洞的代码): image.png 攻击者: image.png

危害:

  • 暴露重要信息,如密码、ssh 文件
  • 服务器配置被恶意修改
  • 攻击者可能触及公司内网

Dos 攻击

概念:通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求积压,进而雪崩效应。

Regex Dos

基于正则表达式的 Dos,利用正则匹配的贪婪模式,导致服务器响应时间延长,接口吞吐量明显降低,响应用户的请求次数大大下降。

image.png

DDos

短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,无法响应新的请求。

特点:

  • 直接访问 IP
  • 任意接口
  • 消耗大量带宽

image.png

基于传输层的攻击

中间人攻击

image.png

如何防御

防御 XSS

  • 永远不信任用户提交的信息,不要将用户提交内容的直接转换成 DOM。

  • 对 string 进行转义。

  • 对用户上传的 svg 文件进行检验,因为 svg 文件也可以嵌入 script 标签。

  • 如果允许用户自定义跳转链接,则需要对链接进行过滤,因为链接可以插入执行 JS 代码。

  • 如果允许用户自定义样式,则需要对样式内容进行校验,因为 background 属性也可以嵌套 URL。 image.png

  • 使用现成的工具

    • 前端:主流框架默认防御(Vue、React),google-closure-library
    • 服务端:Node 开发时使用 npm 包(DOMPurify)进行处理

CSP (Content Security Police) 内容安全策略

  • 利用同源策略
  • 开发者定义哪些源(域名)是安全的
  • 来自安全源的脚本可以执行,否则直接抛出错误
  • 拒绝所有的evalinline script代码

配置服务器端的响应头

Content-Security-Police: script-src 'seft' 同源
Content-Security-Police: script-src 'seft' http://domain.com
复制代码

配置浏览器端的 meta 标签

<meta http-equiv="Content-Srcurity-Police" content="script-src self" />
复制代码

防御 CSRF 攻击

  • 限制请求来源 image.png
  • token image.png
  • iframe 攻击方式的防御 配置 web 服务器响应头:X-Frame-Options : DENY / SAMEORIGIN image.png
  • 避免将 GET 请求和 POST 请求写到同一个接口
  • SameSite Cookie 不携带非当前页面域名的 cookie

防御 注入攻击

  • 使用prepared statement提前编译 SQL 语句。
  • 最小权限原则,避免使用sudo执行命令,避免使用root权限。
  • 建立允许名单+过滤,拒绝rm等高危操作
  • 对 URL 类型参数进行协议、域名、ip 等限制,拒绝用户直接访问内网。

防御 Regex Dos 攻击

  • 避免写出贪婪匹配的正则语句
  • 代码扫描 + 正则性能测试
  • 拒绝使用用户提供的正则

防御 DDos

image.png

防御 基于传输层的中间人攻击

HTTPS 协议的特性:

  • 可靠性:加密,避免明文传输
  • 完整性:MAC 验证,避免数据被篡改
  • 不可抵赖性:数字签名,确保双方身份