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 十大风险-跨站点脚本攻击 (XSS)的更多相关文章
- ASP.NET Core中的OWASP Top 10 十大风险-SQL注入
不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: https://dotnetcoretutorials.com/201 ...
- ASP.NET Core中的OWASP Top 10 十大风险-失效的访问控制与Session管理
不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: https://dotnetcoretutorials.com/201 ...
- OWASP Top 10十大风险 – 10个最重大的Web应用风险与攻防
先来看几个出现安全问题的例子 OWASP TOP10 开发为什么要知道OWASP TOP10 TOP1-注入 TOP1-注入的示例 TOP1-注入的防范 TOP1-使用ESAPI(https://gi ...
- 在Asp.Net Core中使用DI的方式使用Hangfire构建后台执行脚本
最近项目中需要用到后台Job,原有在Windows中我们会使用命令行程序结合计划任务或者直接生成Windows Service,现在.Net Core跨平台了,虽然Linux下也有计划任务,但跟原有方 ...
- OWASP TOP 10 详解
OWASP--开放式web应用程序安全项目 参考文献:袁鸣凯.OWASP Top 10十大风险 – 10个最重大的Web应用风险与攻防.2016-9-18. https://blog.csdn.n ...
- 在 ASP.NET Core 中启用跨域请求(CORS)
本文介绍如何在 ASP.NET Core 的应用程序中启用 CORS. 浏览器安全可以防止网页向其他域发送请求,而不是为网页提供服务. 此限制称为相同源策略. 同一源策略可防止恶意站点读取另一个站点中 ...
- ASP.NET Core中使用Csp标头对抗Xss攻击
内容安全策略(CSP)是一个增加的安全层,可帮助检测和缓解某些类型的攻击,包括跨站点脚本(XSS)和数据注入攻击.这些攻击用于从数据窃取到站点破坏或恶意软件分发的所有内容(深入CSP) 简而言之,CS ...
- OWASP Top 10 – 2013, 最新十大安全隐患(ASP.NET解决方法)
OWASP(开放Web软体安全项目- Open Web Application Security Project)是一个开放社群.非营利性组织,目前全球有130个分会近万名会员,其主要目标是研议协助解 ...
- (10)ASP.NET Core 中的环境(Environments:dev, stage, prod)
1.环境变量配置 ASP.NET Core在应用程序启动时读取环境变量(Properties\launchSettings.json)ASPNETCORE_ENVIRONMENT,并将该值存储在IHo ...
随机推荐
- bootstrap 鼠标悬停显示
1. <button type="button" rel="drevil" data-content="报名截止时间:'+time+'" ...
- Chrome 62 的大坑:修改密码后始终使用保存的旧密码登录
最近有用户向我们反馈,修改密码后,怎么也登录不了我们网站,总是提示密码错误.用户确认密码肯定没错,通过用户发给我们的操作截图看,用户修改密码的操作也没问题. 开始我们没能重现出这个问题,我们检查了相关 ...
- javascript算法(一)
1.实现一个函数,运算结果可以满足如下预期结果: add(1)(2) // 3 add(1, 2, 3)(10) // 16 add(1)(2)(3)(4)(5) // 15 实现: function ...
- angular指令的4种设计模式
指令的功能集非常丰富,不过我们已经发现了指令的帕累托分布:使用angular编写的大量指令只会用到可用性和设计模式中很小的比例,这些指令大概可以分为4类: 只渲染指令--这些指令将渲染作用域中的数据, ...
- lua中的require机制
lua中的require机制 为了方便代码管理,通常会把lua代码分成不同的模块,然后在通过require函数把它们加载进来.现在看看lua的require的处理流程.1.require机制相关的数据 ...
- CentOs7相对于CentOs6的常用命令变化
比如说防火墙在CentOS6中为 iptables,在CentOS7中变为 firewalld. service iptables stop/start/restart systemctl stop/ ...
- Ubuntu开启ApacheRewrite功能
参考原文 : http://www.knowsky.com/888354.html 1.安装好apache2之后,手动命令启用 执行加载Rewrite模块: a2enmod rewrite 执行 ...
- 浅谈postgresql的GIN索引(通用倒排索引)
1.倒排索引原理 倒排索引来源于搜索引擎的技术,可以说是搜索引擎的基石.正是有了倒排索引技术,搜索引擎才能有效率的进行数据库查找.删除等操作.在详细说明倒排索引之前,我们说一下与之相关的正排索引并与之 ...
- 使用Docker运行Microsoft SQL Server 2017
最近每天都在空闲时间努力编写Apworks框架的案例代码WeText.在文本发布和处理微服务中,我打算使用微软的SQL Server for Linux来做演示,于是也就在自己的docker-comp ...
- Python 列表浅拷贝与深拷贝
浅拷贝 shallow copy 和深拷贝 deep copy list.copy() 浅拷贝:复制此列表(只复制一层,不会复制深层对象) 等同于 L[:] 举例: 浅拷贝: a = [1.1, 2. ...