本博文翻译自:
https://dotnetcoretutorials.com/2017/10/25/owasp-top-10-asp-net-core-cross-site-scripting-xss/

在这篇文章的前几次迭代中,我用了一个很长的篇幅解释了什么是跨站脚本(XSS)。但在花了好几个小时来完善它之后,我觉得向你展示一个简单的屏幕截图就更容易了。

这例子很简单。我有一个用户的“搜索”页面,并且他们输入的任何查询都以“搜索查询{您的查询在这里}”的形式回传给他们。代码如下所示:

<h2>Search Results for "@Html.Raw(Context.Request.Query["query"])"</h2>

因此,我们要把用户搜索的东西(或者输入用来查询的字符串),直接放到页面上。这样用户就可以输入脚本标签,或者任何他们想要的东西。这本质上是XSS的核心。获取未经验证的用户输入,并在网页上批量显示。

在这篇文章中,我将引用“我之前编写的代码”。这个代码在Github上,如果你想看一下,自己测试一下XSS。你可以在这里下载。

什么是XSS?

XSS是指跨站脚本攻击它能让攻击者将客户端脚本(通常为JavaScript,尽管可能有其他类型的注入)注入到网页上,然后再向其他用户显示。通常这些脚本试图窃取私人数据(例如cookies或浏览器存储),重定向浏览器,或者有时甚至欺骗用户进行他们通常不会做的动作。

XSS通常被定义为两种不同的类型:

反射性XSS

反射性XSS是指在用户输入结果时立即发生跨站点脚本攻击。例如,当用户搜索时,该搜索查询就会立即显示在页面上。通常,XSS的危险来自于将链接发送给不知情的用户,而用户看到的是全出乎意料的页面。

存储式XSS

存储式XSS是指把恶意脚本存储到被攻击者的网站的数据库。其他人访问数据库中的恶意脚本代码后,浏览器执行恶意脚本,被攻击。如果我们使用一个博客的例子,接受评论文章。如果您能够在博客评论中存储XSS漏洞,那么从那时起查看该博客文章的所有人都将受到影响。很明显,这有可能比反射性XSS漏洞要大得多,因为它不依赖于用户发送一个不可靠的链接,也不需要在他们的部分做任何额外的事情。

有人可以用XSS做什么?

使用Javascript

当然,要是能够在网页上注入脚本标签。世界真的是攻击者砧板上的肉。他们可以做一些简单的事情,比如将用户重定向到不同的页面(然后他们窃取用户的凭证),他们可以在页面上插入javascript来构建一个虚假的登录表单(然后他们窃取用户的凭证),或者他们甚至可以用它来盗取用户的登录cookie(然后他们窃取用户的凭证)。这可能是毁灭性的。

虽然在页面上注入javascript完全是毁灭性的,但是保护你的站点不仅仅是不允许在任何地方提交“script”这个词。实际上,你可以在没有CSS的情况下做一些相当危险的事情。

CSS

通过向页面中注入样式,攻击者可以改变页面的整个布局来欺骗用户做他们不想做的事情。我之前看到的一个“巧妙”漏洞是攻击者重新设计了一个页面,通过移动删除按钮并更改文本(现在可以添加CSS中的“内容”)来欺骗用户删除自己的帐户。

单独使用CSS,你几乎可以重写整个网站。让我们快速浏览一下我早期使用的网站。(再次,你可以在这里获得Github上的源代码)。默认情况下,它看起来有点像这样:

现在让我们尝试。让我们尝试在这里注入以下CSS负载:

<style>.container, .navbar{display:none;}
body { padding: 5px }
body:before { content:"We have moved. Head over to www.bogussite.com to continue"; }</style>

所以这个URL看起来像这样:

http://localhost:57423/?query=<style>.container,.navbar{display:none;}body {padding:5px}body:before{content:"We have moved. Head over to www.bogussite.com to continue";}</style>

看这个URL:

IFrames

注入iframe也是一种XSS漏洞,它可以在相当长的一段时间内不被发现,因为它对终端用户基本上是不可见的。ifram可以是“无害的”,当人们试图在他们自己的网站上建立视图时,视图里面包含了付费的广告,这是一种有害的东西,就像把一个虚假的登录表单写进页面一样。

用户输出HTML编码

现在,如果你一直在看我的示例代码,你可能会注意到一些事情。我正在谈论这个Html.Raw(Context.Request.Query["query"]) 。我想承认,我作弊了。默认情况下,当ASP.net Core Razor 将值输出到页面上时,它总是对它们进行编码。如果我们删除这个原始标签助手,并尝试注入一个脚本标签,我们可以在页面上看到:

那么,为什么没有真正运行脚本标签?它看起来应该是对的?让我们来看看页面的源代码。

看看我们的脚本标签是如何被写入HTML的。它已经被我们转义了,这意味着脚本标记还没有被实际运行!很棒!因此,对于直接写入页面的内容,实际上我们有受到框架的保护。

我们正在展示这些数据的其他地方呢?也许我们正在构建一个SPA,而不是使用ASP.net Core Razor。每个JavaScript库(甚至jQuery)都会为您编码数据。但是检查这是一个自动还是手动的过程是值得的,并且将用户输入直接输出到HTML中的任何地方都应该进行三重检查以获得有效的编码。

值得注意的一个有趣的观点是,我遇到了一些开发人员,他们坚持HTML编码,因为他们存储在数据库中,然后在网页上显示它们(通常,你不使用Razor,所以你没有得到自动编码)。这将起作用,但我认为这是一个不好的做法。当您仅在存储数据时对数据进行编码时,您就会对反射性XSS攻击保持开放,因为这些数据从未存储在任何地方(直接显示给用户)。

用户输入址编码

在将用户数据直接输出到HTML中时,HTML编码很好。但有时您可能需要接受用户输入并将其放入URL中。URL不会使用与HTML相同的字符进行编码,因此您可能会发现自己试图用Raw标签助手来覆盖所有内容。 不要这样做! 因为.NET core 已经覆盖了URL编码。

要访问它,首先需要在Visual Studio的软件包管理器控制台中安装以下nuget软件包:

Install-Package Microsoft.AspNet.WebUtilities -Pre

然后,您可以像这样在视图中编码您的URL:

<a href="/linktosomething?query=@System.Net.WebUtility.UrlEncode(Context.Request.Query["query"])">Search Query</a>

浏览器保护

需要注意的一点是,浏览器正在跳入,以保护用户免受XSS攻击。 在Chrome中,使用<script> alert (“this is a XSS” )</ script>这个非常简单的负载 ,我最终得到了以下结果:

说到这个,你基本在这里可以找到一个试图绕过Chrome的XSS过滤器的用户写的好文章用户试图绕过Chrome的XSS过滤器可以在这里找到一个很好的写作https://blog.securitee.org/?p=37。从本质上讲,这将是一场军备竞赛,依靠浏览器来保护你的用户将是非常困难的。更不用说那些不更新浏览器的用户了。

X-XSS-Protection头

这是另一种保护你的用户的方法,“很好,但是请编码你的输出。”。使用X-XSS-Protection头文件,您可以指导浏览器如何最好地处理它检测到的任何XSS漏洞。标题有4个不同的值,您可以使用。

X-XSS-Protection: 0

试图在浏览器中禁用XSS保护(如果你想尝试和测试的话,这是很好的选择)。

X-XSS-Protection: 1

启用XSS保护,但如果检测到XSS,则会尝试清理输出(例如对其进行编码或去除字符)。这样做可能很危险,因为生成的HTML可能同样危险。看到这里:http://blog.innerht.ml/the-misunderstood-x-xss-protection/。

X-XSS-Protection: 1; mode=block

启用XSS保护,并在检测到任何XSS漏洞的情况下阻止加载页面。

X-XSS-Protection: 1; report=<reporting-uri>

这是一个chromium内核的头文件,它允许您向您报告任何在XSS攻击中被检测到的URL。

实际上,你应该使用的唯一选项是阻止,因为这将保护你的最佳状态。您可以在代码或服务器级别设置标题。对于代码级别,它和在管道中添加额外的中间件一样简单。类似这样:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){app.Use(async (context, next) =>{context.Response.Headers.Add("X-Xss-Protection", "1");        await next();});app.UseMvc();
}

如果您有兴趣进一步阅读,我们有一篇专门讨论X-XSS-Protection header的文章,另外还有一篇关于
每个站点都应该有的3个安全标题.。

总结

跨站脚本攻击是那些拒绝死亡的攻击之一,主要是因为人们没有做基本的事情。正如我们所看到的,在ASP.net Core中,我们的razor 标签助手是一个保护我们非常好的的解决方案,事实上,框架解决我们的大部分问题,事实上都是HTML编码。浏览器在保护人们方面也正在取得重大进展,但这并不意味着开发者能对自己在保护终端用户方面的角色感到自满。

相关文章:

  • ASP.NET Core中的OWASP Top 10 十大风险-SQL注入

  • ASP.NET Core中的OWASP Top 10 十大风险-失效的访问控制与Session管理

原文地址:http://www.cnblogs.com/chen-jie/p/owasp-top-10-asp-net-core-cross-site-scripting-xss.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

ASP.NET Core中的OWASP Top 10 十大风险-跨站点脚本攻击 (XSS)相关推荐

  1. ASP.NET Core中的OWASP Top 10 十大风险-失效的访问控制与Session管理

    本博文翻译自: https://dotnetcoretutorials.com/2017/10/16/owasp-top-10-asp-net-core-broken-authentication-s ...

  2. ASP.NET Core中的OWASP Top 10 十大风险-SQL注入

    本博文翻译自: https://dotnetcoretutorials.com/2017/10/11/owasp-top-10-asp-net-core-sql-injection/ OWASP或者说 ...

  3. OWASP Top 10十大风险 – 10个最重大的Web应用风险与攻防

    先来看几个出现安全问题的例子 OWASP TOP10 开发为什么要知道OWASP TOP10 TOP1-注入 TOP1-注入的示例 TOP1-注入的防范 TOP1-使用ESAPI(https://gi ...

  4. 【Microsoft Azure 的1024种玩法】二十四.通过Azure Front Door 的 Web 应用程序防火墙来对 OWASP TOP 10 威胁进行防御

    [简介] 我们都知道像 SQL 注入.跨站点脚本攻击(XSS)之类的恶意攻击以及 OWASP 发现的十大威胁都可能会导致服务中断或数据丢失,让 Web 应用程序所有者受到巨大威胁.那么如何有效的解决O ...

  5. OWASP TOP 10 2017版本

    pdf原文地址:http://www.owasp.org.cn/owasp-project/OWASPTop102017v1.3.pdf 1.前言 不安全的软件正在破坏着我们的金融.医疗.国防.能源和 ...

  6. OWASP Top 10 2021 全新出炉

    2021 年前 10 名发生了什么变化 有三个新类别,四个类别的命名和范围发生了变化,并且 2021 年的前 10 名中进行了一些合并. A01:2021-Broken Access Control ...

  7. 做网安必看的OWASP TOP 10(2021)最新榜单

    近日,OWASP发布2021年草案,全新的OWASP Top 10正式发布. 2021年的OWASP Top10 发生了很多变化,新增三个类别,四个类别的命名和范围也发生了变化,同时对top10进行了 ...

  8. 2021 OWASP Top 10 榜单(初稿)发布,头牌易主

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 OWASP Top 10 榜单列出的是最危险的 web 漏洞,时隔四年且十多年以来,该榜单霸主易主. OWASP Top 10 榜单创建于21世 ...

  9. OWASP TOP 10 – 终极漏洞指南(2021)

    OWASP Top 10 是由开放 Web 应用程序安全项目 (OWASP) 建立的,该项目是一个非营利组织,可免费提供有关 Web 应用程序安全的文章和其他信息. 目录 什么是OWASP? 什么是 ...

最新文章

  1. Visual Studio 2008 Samples Page
  2. [算法学习]斐波那契数的计算
  3. 数学--数论--费马小定理+求逆元
  4. 信用贷款额度是怎么确定的?
  5. 编程算法 - 切割排序 代码(C)
  6. 如何用ARKit将太阳系装进iPhone(二)
  7. java 数组以逗号分隔_在java中使用逗号分隔符拆分字符串数组
  8. ASP.NET MVC多语言 仿微软网站效果
  9. centos vmware centos6.6 64位 kvm虚拟化安装配置 第四十二节课
  10. ELK 使用filebeat替代Logstash收集日志
  11. Java 设计模式 代理模式
  12. 1400 序列分解(dfs)
  13. weblogic部署静态资源文件html,weblogic部署静态html
  14. TFS2010用户解锁
  15. python环境下使用opencv把视频切割成图片
  16. luckysheet导出excel表格(使用exceljs,支持图片)
  17. 计算机原理及应用自测题4,自测题-微计算机原理-电子发烧友网站
  18. SpringBoot整合Guacamole
  19. 2022团体程序设计天梯赛
  20. 总结一些网站加密和混淆技术

热门文章

  1. Eclipse Add generated serial version ID报错解决方案
  2. 基于 HTML5 Canvas 绘制的电信网络拓扑图
  3. 学会这些, 让你的服务器远离***影响
  4. WPF之DataGrid
  5. python第七天--字符串的方法与注释
  6. MFC中使用SDL播放音频没有声音的解决方法
  7. js框架页弹出页面关闭
  8. 缓慢渐变维度的处理方式
  9. 你周围需要这6种人(文摘)
  10. git的安装与使用(一)--windows平台 .