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

本博文翻译自:
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(C语言)请编写程序,计算1-1/2-1/3-1/4-.....-1/50的和。

代码如下&#xff1a; #include<stdio.h>int main() {float i,sum1;for(i2;i<50;i){sumsum-1/i;}printf("%f",sum); }注意这里用的是float&#xff0c;不能用int&#xff0c;否则像是1/2&#xff0c;1/3统统都是0&#xff0c;最终运行的结果也是0&#xff…

芋道 Spring Boot 自动配置原理

转载自 芋道 Spring Boot 自动配置原理 1. 概述 友情提示&#xff1a;因为本文是分享 Spring Boot 自动配置的原理&#xff0c;所以需要胖友有使用过 Spring Boot 的经验。如果还没使用过的胖友&#xff0c;不用慌&#xff0c;先跳转到《芋道 Spring Boot SpringMVC 入门》文…

云设计模式

随着技术的快速发展&#xff0c;应用的架构逐渐从单体、分层、SOA逐渐向微服务的方向演进&#xff0c;而基础设施也逐渐从大型机&#xff0c;自建机房&#xff0c;到托管在云平台的各种服务上。所有这一切都是为了使应用&#xff08;web/mobile&#xff09;更快、更安全的上线&…

(C语言)数组去重

现有一组数&#xff0c;a[]{1,1,1,3,3,5,5,5,5,6,6,8,8,9,10,10} 要求将他们变为&#xff1a;{1&#xff0c;3&#xff0c;5&#xff0c;6&#xff0c;8&#xff0c;9&#xff0c;10} #include<stdio.h> int fun(int a[],int n){&#xff0c;int i,j1,ka[0],m,flag0;for…

Orchard Core Framework:ASP.NET Core 模块化,多租户框架

上一篇编写Orchard Core一分钟搭建ASP.NET Core CMS &#xff0c;介绍ASP.NET Core CMS &#xff0c;Orchard的ASP.NET Core版&#xff0c;同时对应有一个ASP.NET Core框架。支持模块化和多租户。整个Orchard Core就是通过一个个模块Module组成的首先创建一个空的 ASP.NET Core…

Zookeeper超详细的面试题

转载自 Zookeeper超详细的面试题 1.ZooKeeper是什么&#xff1f; ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;它是集群的管理者&#xff0c;监视着集群中各个节点的状态根据节点提交的反馈…

【什么是泛型,有什么好处】

✅什么是泛型&#xff0c;有什么好处 ✅典型回答✅泛型是如何实现的✅什么是类型擦除&#xff1f;&#x1f4dd;C语言对泛型的支持&#x1f4dd;泛型擦除的缺点有哪些&#xff1f; ✅对泛型通配符的理解&#x1f4dd;泛型中上下界限定符 extends 和 super 有什么区别&#xff1…

.NET Core容器化@Docker

温馨提示&#xff1a;本文适合动手演练&#xff0c;效果更佳。1. 引言我们知道. NET Core最大的特性之一就是跨平台&#xff0c;而对于跨平台&#xff0c;似乎大家印象中就是可以在非Windows系统上部署运行。而至于如何操作&#xff0c;可能就有所欠缺。那这一节我们就结合简单…

Netty面试题(2020最新版)

转载自 Netty面试题&#xff08;2020最新版&#xff09; 1.Netty 是什么&#xff1f; Netty是 一个异步事件驱动的网络应用程序框架&#xff0c;用于快速开发可维护的高性能协议服务器和客户端。Netty是基于nio的&#xff0c;它封装了jdk的nio&#xff0c;让我们使用起来更加…

.NET开源三周年

3 年前&#xff0c;微软宣布开源 .NET 框架的大部分内容。正如Scott Hanselman在Connect 2016主题演讲中所说的那样&#xff0c;微软一直在做重大贡献&#xff1a;开源 .NET 框架并不总是一帆风顺的&#xff0c;可以肯定的说&#xff0c;总是会遇到一些困难。在过去的三年中&am…

Viewpager的使用

第一&#xff1a; 首先在activity_main中加入Viewpager控件 <androidx.viewpager.widget.ViewPagerandroid:layout_width"match_parent"android:layout_height"match_parent"android:id"id/viewPager"></androidx.viewpager.widget.Vi…

消息中间件MQ与RabbitMQ面试题(2020最新版)

转载自 消息中间件MQ与RabbitMQ面试题&#xff08;2020最新版&#xff09; 为什么使用MQ&#xff1f;MQ的优点 简答 异步处理 - 相比于传统的串行、并行方式&#xff0c;提高了系统吞吐量。 应用解耦 - 系统间通过消息通信&#xff0c;不用关心其他系统的处理。 流量削锋 …

IdentityServer4 第三方快速入门和示例

这些示例不由IdentityServer团队维护。 IdentityServer团队提供链接到了社区示例&#xff0c;但不能对示例做任何保证。 如有问题&#xff0c;请直接与作者联系。各种ASP.NET Core安全示例https://github.com/leastprivilege/AspNetCoreSecuritySamplesIdentityServer4 EF 和 A…

开发规范以及注意点

preiteer在保存时不格式化文件 Vscode回车到下一行的时候&#xff0c;不保留缩进 加上这一句即可 "editor.autoIndent": "keep",<template><div class"strategy-edit" v-loading"loading"><el-formclass"strateg…

Java并发编程面试题(2020最新版)

转载自 Java并发编程面试题&#xff08;2020最新版&#xff09; 基础知识 并发编程的优缺点 为什么要使用并发编程&#xff08;并发编程的优点&#xff09; 充分利用多核CPU的计算能力&#xff1a;通过并发编程的形式可以将多核CPU的计算能力发挥到极致&#xff0c;性能得到…

.NET Core容器化之多容器应用部署@Docker-Compose

1.引言紧接上篇.NET Core容器化Docker&#xff0c;这一节我们先来介绍如何使用Nginx来完成.NET Core应用的反向代理&#xff0c;然后再介绍多容器应用的部署问题。2. Why Need Nginx.NET Core中默认的Web Server为Kestrel。Kestrel is great for serving dynamic content from …

ServerSuperIO Designer IDE 发布,打造物联网通讯大脑,随心而联。附:C#驱动源代码。

1.概况注&#xff1a;ServerSuperIO Designer IDE 同行业网友随便使用&#xff0c;不涉及到软件使用限制的问题。从2015年到现在的将近两年的时间&#xff0c;一直在开发、完善ServerSuperIO&#xff08;SSIO&#xff09;的基础框架&#xff0c;包括&#xff1a;多通讯机制、稳…

MySQL数据库面试题(2020最新版)

转载自 MySQL数据库面试题&#xff08;2020最新版&#xff09; 数据库基础知识 为什么要使用数据库 数据保存在内存 优点&#xff1a;存取速度快 缺点&#xff1a;数据不能永久保存 数据保存在文件 优点&#xff1a;数据永久保存 缺点&#xff1a;1&#xff09;速度比内…

分布式系统的消息服务模式简单总结

在一个分布式系统中&#xff0c;有各种消息的处理&#xff0c;有各种服务模式&#xff0c;有同步异步&#xff0c;有高并发问题甚至应对高并发问题的Actor编程模型&#xff0c;本文尝试对这些问题做一个简单思考和总结。一、消息的“推、拉模式” 在传统的Client/Server结构中&…

Spring Cloud面试题(2020最新版)

转载自 Spring Cloud面试题&#xff08;2020最新版&#xff09; 为什么需要学习Spring Cloud 不论是商业应用还是用户应用&#xff0c;在业务初期都很简单&#xff0c;我们通常会把它实现为单体结构的应用。但是&#xff0c;随着业务逐渐发展&#xff0c;产品思想会变得越来…