前端安全系列(一):如何防止XSS攻击?

打印 上一主题 下一主题

主题 902|帖子 902|积分 2706

一、什么是XSS

Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的欣赏器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。
XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;欣赏器无法分辨哪些脚本是可信的,导致恶意脚本被执行。
而由于直接在用户的终端执行,恶意代码能够直接获取用户的信息,或者利用这些信息冒充用户向网站发起攻击者定义的请求。
   【逐一帮助安全学习,所有资源获取处逐一】
  ①网络安全学习门路
  ②20份渗出测试电子书
  ③安全攻防357页笔记
  ④50份安全攻防口试指南
  ⑤安全红队渗出工具包
  ⑥网络安全必备书籍
  ⑦100个漏洞实战案例
  ⑧安全大厂内部视频资源
  ⑨历年CTF夺旗赛题解析
  二、XSS注入方法



  • 在 HTML 中内嵌的文本中,恶意内容以 script 标签形成注入。
  • 在内联的 JavaScript 中,拼接的数据突破了原本的限制(字符串,变量,方法名等)。
  • 在标签属性中,恶意内容包罗引号,从而突破属性值的限制,注入其他属性或者标签。
  • 在标签的 href、src 等属性中,包罗 javascript: 等可执行代码。
  • 在 onload、onerror、onclick 等事件中,注入不受控制代码。
  • 在 style 属性和标签中,包罗类似 background-image:url(“javascript:…”); 的代码(新版本欣赏器已经可以防范)。
  • 在 style 属性和标签中,包罗类似 expression(…) 的 CSS 表达式代码(新版本欣赏器已经可以防范)。
总之,如果开发者没有将用户输入的文本举行合适的过滤,就贸然插入到 HTML 中,这很轻易造成注入漏洞。攻击者可以利用漏洞,构造出恶意的代码指令,进而利用恶意代码危害数据安全。
三、XSS分类

根据攻击的来源,XSS 攻击可分为存储型、反射型和 DOM 型三种。
|范例|存储区|插入点|


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

存储型XSS的攻击步骤:

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

反射型 XSS 的攻击步骤:

  • 攻击者构造出特殊的 URL,其中包罗恶意代码。
  • 用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给欣赏器。
  • 用户欣赏器接收到相应后解析执行,混在其中的恶意代码也被执行。
  • 恶意代码盗取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。
反射型 XSS 漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。
由于需要用户自动打开恶意的 URL 才能生效,攻击者往往会联合多种手段诱导用户点击。
POST 的内容也可以触发反射型 XSS,只不外其触发条件比较苛刻(需要构造表单提交页面,并引导用户点击),所以非常少见。
3.3 DOM型XSS

DOM 型 XSS 的攻击步骤:

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

通过前面的先容可以得知,XSS 攻击有两大要素:

  • 攻击者提交恶意代码。
  • 欣赏器执行恶意代码。
针对第一个要素:我们是否能够在用户输入的过程,过滤掉用户输入的恶意代码呢?答案是不可行的。既然输入过滤并非完全可靠,我们就要通过“防止欣赏器执行恶意代码”来防范 XSS。这部分分为两类:


  • 防止 HTML 中出现注入。
  • 防止 JavaScript 执行时,执行恶意代码。
4.1 纯前端渲染

纯前端渲染的过程:

  • 欣赏器先加载一个静态 HTML,此 HTML 中不包罗任何跟业务相关的数据。
  • 然后欣赏器执行 HTML 中的 JavaScript。
  • JavaScript 通过 Ajax 加载业务数据,调用 DOM API 更新到页面上。
在纯前端渲染中,我们会明确的告诉欣赏器:下面要设置的内容是文本(.innerText),照旧属性(.setAttribute),照旧样式(.style)等等。欣赏器不会被轻易的被欺骗,执行预期外的代码了。
但纯前端渲染还需注意制止 DOM 型 XSS 漏洞(例如 onload 事件和 href 中的 javascript:xxx 等,请参考下文”防备 DOM 型 XSS 攻击“部分)。
在许多内部、管理系统中,采用纯前端渲染是非常合适的。但对于性能要求高,或有 SEO 需求的页面,我们仍然要面临拼接 HTML 的题目。
4.2 转义 HTML

如果拼接 HTML 是必要的,就需要采用合适的转义库,对 HTML 模板各处插入点举行充分的转义。
常用的模板引擎,如 doT.js、ejs、FreeMarker 等,对于 HTML 转义通常只有一个规则,就是把 & < > " ' / 这几个字符转义掉,确实能起到肯定的 XSS 防护作用,但并不完善:
|XSS 安全漏洞 | 简单转义是否有防护作用|


  • |HTML 标签文字内容 | 有|
  • |HTML 属性值 | 有|
  • |CSS 内联样式 | 无|
  • |内联 JavaScript | 无|
  • |内联 JSON | 无|
  • |跳转链接 | 无|
所以要完善 XSS 防护措施,我们要利用更完善更过细的转义战略。
例如 Java 工程里,常用的转义库为 org.owasp.encoder
4.3 Content Security Policy

严酷的 CSP 在 XSS 的防范中可以起到以下的作用:


  • 禁止加载外域代码,防止复杂的攻击逻辑。
  • 禁止外域提交,网站被攻击后,用户的数据不会泄漏到外域。
  • 禁止内联脚本执行(规则较严酷,现在发现 GitHub 利用)。
  • 禁止未授权的脚本执行(新特性,Google Map 移动版在利用)。
  • 合理利用上报可以实时发现 XSS,利于尽快修复题目。
4.4 输入内容长度控制

对于不受信任的输入,都应该限定一个合理的长度。虽然无法完全防止 XSS 发生,但可以增加 XSS 攻击的难度。
4.5 HTTP-only Cookie

禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法盗取此 Cookie。
4.6 验证码

防止脚本冒充用户提交伤害操作。
五、XSS的检测


  • 利用通用 XSS 攻击字符串手动检测 XSS 漏洞。
  • 利用扫描工具自动检测 XSS 漏洞。
除了手动检测之外,还可以利用自动扫描工具探求 XSS 漏洞,例如 Arachni**、Mozilla HTTP Observatory*、w3af**等。
总结

虽然很难通过技能手段完全制止 XSS,但我们可以总结以下原则减少漏洞的产生:


  • 利用模板引擎 开启模板引擎自带的 HTML 转义功能。例如: 在 ejs 中,尽量利用 <%= data %> 而不是 <%- data %>; 在 doT.js 中,尽量利用 {{! data } 而不是 {{= data }; 在 FreeMarker 中,确保引擎版本高于 2.3.24,而且选择正确的 freemarker.core.OutputFormat。
  • 制止内联事件 尽量不要利用 onLoad="onload('{{data}}')"、onClick="go('{{action}}')" 这种拼接内联事件的写法。在 JavaScript 中通过 .addEventlistener() 事件绑定会更安全。
  • 制止拼接 HTML 前端采用拼接 HTML 的方法比较伤害,如果框架允许,利用 createElement、setAttribute 之类的方法实现。或者采用比较成熟的渲染框架,如 Vue/React 等。
  • 时候保持警惕 在插入位置为 DOM 属性、链接等位置时,要打起精力,严加防范。
  • 增加攻击难度,降低攻击后果 通过 CSP、输入长度配置、接口安全措施等方法,增加攻击的难度,降低攻击的后果。
  • 自动检测和发现 可利用 XSS 攻击字符串和自动扫描工具探求匿伏的 XSS 漏洞
黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。
1.学习门路图


攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的门路图,如果你能学完它们,你去就业和接私活完全没有题目。
2.视频教程

网上虽然也有许多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面门路图的每一个知识点,我都有配套的视频解说。
内容涵盖了网络安全法学习、网络安全运营等保测评、渗出测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。
3.技能文档和电子书

技能文档也是我自己整理的,包括我加入大型网安举措、CTF和挖SRC漏洞的经验和技能要点,电子书也有200多本,由于内容的敏感性,我就不逐一展示了。
4.工具包、口试题和源码

“工欲善其事必先利其器”我为大家总结出了最受接待的几十款款黑客工具。涉及范围重要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感爱好的同学不容错过。
还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。
这些题目都是大家在口试深信服、奇安信、腾讯或者其它大厂口试时经常遇到的,如果大家有好的题目或者好的见解接待分享。
参考解析:深信服官网、奇安信官网、Freebuf、csdn等
内容特点:条理清晰,含图像化表现更加易懂。
内容概要:包括 内网、操作系统、协议、渗出测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包罗、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

因篇幅有限,仅展示部分资料,如果你对网络安全入门感爱好,需要的话可以在下方

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

圆咕噜咕噜

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表