沈阳电脑维修网,沈阳上门维修电脑服务
当前位置: 主页 > 沈阳网站推广>关于Web安全的那些事(XSS攻击) >

关于Web安全的那些事(XSS攻击)

时间:2017-5-23来源:www.sypcwx.cn 作者: 沈阳电脑维修网点击:
沈阳电脑维修,上门维修电脑
  沈阳电脑维修上门服务13889116605: 概述XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联...

概述

XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼,它带来的危害是巨大的,是web安全的头号大敌。

攻击的条件

实施XSS攻击需要具备两个条件: 一、需要向web页面注入恶意代码; 二、这些恶意代码能够被浏览器成功的执行。 看一下下面这个例子: <divid= 这段代码在旧版的IE8和IE8以下的版本都是可以被执行的,火狐也能执行代码,但火狐对其禁止访问DOM对象,所以在火狐下执行将会看到控制里抛出异常:documentisnotdefined(document是没有定义的) 再来看一下面这段代码: <div> <imgsrc= 相信很多程序员都觉得这个代码很正常,其实这个代码就存在一个反射型的XSS攻击,假如输入下面的地址: http://www.xxx.com/?id= 最终反射出来的HTML代码:    <div>    <imgsrc=    </div> 也许您会觉得把ValidateRequest设置为true或者保持默认值就能高枕无忧了,其实这种情况还可以输入下面的地址达到相同的攻击效果: http://www.xxx.com/?id=xx    

根据XSS攻击的效果可以分为几种类型

第一、XSS反射型攻击,恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的。 第二、XSS存储型攻击,恶意代码被保存到目标网站的服务器中,这种攻击具有较强的稳定性和持久性,比较常见场景是在博客,论坛等社交网站上,但OA系统,和CRM系统上也能看到它身影,比如:某CRM系统的客户投诉功能上存在XSS存储型漏洞,黑客提交了恶意攻击代码,当系统管理员查看投诉信息时恶意代码执行,窃取了客户的资料,然而管理员毫不知情,这就是典型的XSS存储型攻击。 XSS攻击能做些什么 1.窃取cookies,读取目标网站的cookie发送到黑客的服务器上,如下面的代码: vari=document.createElement( 2.读取用户未公开的资料,如果:邮件列表或者内容、系统的客户资料,联系人列表等等,如代码: <!--读取当前页面的内容提交到黑客服务器上进行分析--> varh= <!--读取当前页面的内容提交到黑客服务器上进行分析--> varxhr=newXMLHttpRequest(); xhr.open( 3.前面两个是读的操作,其实还可进行写的操作,比如说:删除用户的博客,转发指定的微博,向用户的联系人发送带有恶意代码的信息,进行下一步的传播,如下面代码: varxhr=newXMLHttpRequest(); xhr.open( 当然XSS攻击方法远不止这些,黑客有很多天马行空的方法,只要是读和写的操作,那么我们有什么防御的方法呢?

XSS攻击防御

一、输出检查 根据XSS攻击的条件,我们可以对用户输出进行检查,使用系统的安全函数进行转义将数据和代码分开,asp.net的安全函数可以参考http://msdn.microsoft.com/en-us/library/system.web.httputility.aspx,根据不同的场景使用正确的安全函数,否则效果适得其反,如果下面例子: <ahref= 这个例子在HTML标签的属性内输出使用HttpUtility.HtmlAttributeEncode函数进行转义看似合情合理,但这个是特殊的属性,它被解析为元素的事件,这类型的属性在某特定条件下触发事件并执行里面的代码,如本例当用户点击这个链接是会执行里面的代码。 比如输入:http://www.a.com/text.aspx?n=// 经过HttpUtility.HtmlAttributeEncode函数转义后,输出: <ahref= 点击标签将会弹出“/xss/”而不是“字符,所以脚步被成功注入。 正确的做法应该是使用javascriptStringEncode函数或者javascriptStringEncode和HtmlAttributeEncode函数:  <ahref=

二、输入检查

通常用于检测用户输入的数据是否符合预期的格式,比如日期格式,Email格式,电话号码格式等等;输入检查必须在服务端进行;当然为了提高用户体验和减轻服务端的资源客户端也要进行一次检查,但服务端检查始终是必须的,有个别程序员却调过来了认为客户端检查是必须的,服务端检查是可选的,其实这是错误的逻辑,因为客户端很容易被黑客绕过。 1.使用ASP.NETMvc的属性特性进行验证: usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.ComponentModel.DataAnnotations; usingSystem.Linq; usingSystem.Web; namespaceMvcApplication1.Models { publicclassItem { [Key] [Display(Name=).gifborder=0align=middleonload="resizeimg(this,575,600)"> [Required] [DisplayName(} } } 2.当然也可以自己实现自定义验证的特性,如下面代码: [Serializable] [AttributeUsage(AttributeTargets.Property,Inherited=true,AllowMultiple=false)] publicclassFormValidationAttribute:Attribute,IProperty { ///////<summary> ///////错误信息 ///////</summary> ////publicstringErrorMessage{get;set;} ///<summary> ///必需的 ///</summary> publicboolRequired{get;set;} ///<summary> ///电子邮件格式 ///</summary> publicboolIsEmailFormat{get;set;} ///<summary> ///电话号码 ///</summary> publicboolIsTelephoneNumber{get;set;} ///<summary> ///是中文名或者英文名称,中文少于2个字符,英文不少于3个字符 ///</summary> publicboolIsChineseNameOrEnglishName{get;set;} ///<summary> ///正则表达式 ///</summary> publicstringRegularExpression{get;set;} publicRegexOptionsRegexOptions{get;set;} ///<summary> ///最大的长度 ///</summary> publicintMaxLength{get;set;} publicPropertyInfoProperty {get;set;} } 应用到属性上 publicclassItem { [FormValidation(MaxLength=200)] publicstringName{get;set;} [FormValidation(IsTelephoneNumber=true)] publicstringMobile{get;set;} [FormValidation(IsEmailFormat=true,Required=true)] publicstringEmail{get;set;} } 写个扩展方法通过反射类型进行验证对象的属性是否有效: publicclassFormValidationException:Exception{ publicFormValidationException(PropertyInfofield) :this(field,null) { } publicFormValidationException(PropertyInfofield,stringmessage) :base(message) { Property=field; Field=field.Name; } publicstringField{get;privateset;} publicPropertyInfoProperty{get;privateset;} publicoverridestringMessage { get { stringmsg=base.Message; if(!string.IsNullOrWhiteSpace(Field)) { if(string.IsNullOrWhiteSpace(msg)){msg=Field;} else{msg=string.Format( } }  最后使用起来就很方便了,如下面代码: try{Itemdata=Request.GetInstance<Item>();} catch(FormValidationExceptionexp){ //验证失败通过FormValidationException异常获取哪个子段没有合法。 }

三、转换为安全的类型

类型检查或者类型转换到安全的类型,比如:int,float,枚举类型等等,如在前面一个例子中将id转换为int类型即可:   <div>    <imgsrc=    </div>

四、智能过滤恶意代码

通过正确的输出检查我们能够将数据安全的输出到浏览器中,但有些时候会带来不好的用户体验,当用户通过html编辑器提交的数据:mynameis<b>Jackson</b> 如果用前面的方法进行转义: <%=HttpUtility.HtmlEncode( 那么输出结果:mynameis&lt;b&gt;Jackson&lt;/b&gt; 被浏览器解析后:mynameis<b>Jackson</b>显然这个肯定不是用户想要的展示结果,所以我们要对这种富文本进行过滤,把恶意代码摘除;如一些敏感关键字:等等,那么是不是把这些关键词摘除掉就高枕无忧了呢?答案是否定的,来看一下下面的代码: <EMBEDSRC= 火狐浏览器解析后弹出:/xss/   <ahref=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041> haha... </a>  用户点击标签后弹出:/xss/说明恶意代码成功注入 那么我们应该如何过滤富文本呢?在标签、属性,以及CSS等代码中,应该启用白名单策略,避免使用黑名单策略,上面的做法就是黑名单策略,白名单策略告诉系统那些是标签、属性,或者CSS是安全的,如标签:<a>、<b>、<div>、<img>;属性:id、class、alt;CSS:color:red,width:22px等等。 最后给大家推荐两个较好的XSSFilter: Anti-Samy是OWASP上的一个开源项目,最早基于Java,现在已经扩展到.NET2.0,3.0,3.5,目前还没有4.0以上的版本。 下载地址:file:///F:/attachment/uploadfile/files/2014/0905/antisamy-project-1.5.3.zip 官方下载地址:http://owaspantisamy.googlecode.com/archive/d4575adf19850f01ac6882823662d29795de532f.zip XSSAttacksFilters是我将Anti-Samy项目重构的一个项目,仅仅保留其白名单安全策略配置文档,不过也做了细微的调整,这个项目暂时还没有支持ASP.NET4.0以下的版本。 下载地址:file:///F:/attachment/uploadfile/files/2014/0905/XSSAttachs.zip (完)
上一篇:轻松实现移动硬盘加密
查看[关于Web安全的那些事(XSS攻击)]所有评论
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:
推荐内容
关于我们 服务价格 联系我们 企业网站优化 沈阳网站建设 沈阳维修电脑