xss攻击(跨站脚本)
原理
跨站脚本(Cross site script,简称xss)是一种“HTML注入”,由于攻击的脚本多数时候是跨域的,所以称之为“跨域脚本”。
我们常常听到“注入”(Injection),如SQL注入,那么到底“注入”是什么?注入本质上就是把输入的数据变成可执行的程序语句。SQL注入是如此,XSS也如此,只不过XSS一般注入的是恶意的脚本代码,这些脚本代码可以用来获取合法用户的数据,如Cookie信息。
其原理如下图所示:

XSS从攻击原理上,分为三类:
1:反射型XSS
将用户输入“反射”回浏览器,即将用户的输入变成HTML传输回客户端。如:
Response.Write(“<script>alert(/xss/);</script>”)
就是一个典型的反射型XSS。
2:存储性XSS
存储性XSS本质上也是一种反射型XSS,但是它把攻击脚本放置在服务器端,一旦被注入,可被多人多次利用。如,发表博文,就可以引入存储性的XSS。
3:DOM BASED XSS
如果用户的输入被用于修改原有HTML的DOM内容,就会引入这一类攻击。
最典型的是输入的内容用于作为某个节点的innerHTML,如果不对输入作验证,则会被注入攻击代码。
如下的一段脚本注入后,就会获取用户的Cookie
<script language=”javascript”>
var cockieInfo =window.cockie;
//send cockieInfo to luminji
</javascript>
实际案例
使用Fiddler,查看到某系统添加公共信息有一处Post,我们伪造如下的请求:
POST xxx.com/AddPublicInfo HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Content-Type: application/json; charset=utf-8
Accept-Encoding: gzip, deflate
Host: 192.168.80.136
Content-Length: 187
Cookie: ASP.NET_SessionId=qk1qvprjrikp2peveg2ini45; LanguageKey=zh_cn; LoginId=dean;
{"type":"ExtBulletin","title":"1111asdf11","content":"22sdfs22<script>alert(/xss/);</script>","validPeriod":"1","beginDate":"","endDate":"","language":"None","linkFile":"0","fileName":""}
然后,刷新公共信息页面,发现注入代码成功。如果该站点同时存在会话劫持方法的漏洞,则将注入脚本改称获取cookie,攻击者就可以伪造任意访问了本信息的用户来登录系统。
通过该例子我们也可以看到,对于XSS的防范,所有的处理应该是在服务器端的,因为客户端的验证,如使用JS来验证输入是完全可以通过伪造请求被绕过的。所以在安全架构方面对于JS脚本的定位为:JS仅用于改善用户体验。
应对策略
1. 在服务器段限制输入格式,输入类型,输入长度以及输入字符
要注意避免使用一些有潜在危险的html标签,这些标签很容易嵌入一些恶意网页代码。如<img> <iframe><script><frameset><embed><object>< style>等。
注意,不要仅仅在客户端使用js代码加以验证。因为客户端的js脚本可以被绕过。
2. 格式化输出。将输入的内容通过HttpUtility.HtmlEncode处理,这样就不能直接看出输出的内容。
3:对于asp.net站点,可以确保:
<configuration>
<system.web>
<pages validateRequest="true" />
</system.web>
</configuration>
注意,默认情况下为true。
4:IE本身也有机制阻止跨站脚本
存在跨站脚本威胁,如果使用的IE8,则这个请求会被拦截,提示“Internet Explorer 已对此页面进行了修改,以帮助阻止跨站脚本。单击此处,获取详细信息...”。
这个错误是由于 IE8 的跨站脚本(Cross-site scripting, XSS)防护阻止了跨站发送的请求。
以下是如何配置它:点击 IE8 的“工具”-“Internet 选项”,进入“安全”选项卡,打开“Internet”下方的“自定义级别”,在“安全设置”对话框中找到“启用 XSS 筛选器”,改为“禁用”即可。 注意,“启用”是默认配置。
当然,浏览器本身的这种机制是不可靠的。
具体措施
n 查找所有code behind中的”.Text”
通过文件查找出所有的为文本赋值的代码行;
n 为赋值Encode
对上一步骤查找出来的赋值,首先Encode。
n 查找所有的WCF方法中返回字符串的
通过文件查找”.svc”,找到全部的WCF方法,筛选出返回string的方法
n 处理字符串再返回
对上一步骤查找出来的返回的string,先找到序列化方法,然后对实体的可能被用于输出为html的属性,首先Encode
以上统计纳入到如下表格:
|
序号 |
文件 |
代码行 |
处理完成否 |
n 查找所有的文本输入控件
通过文件查找前台所有的””text””,”’text’”,”type=text”,”textarea”,”textbox”字样,筛选出含文本输入的控件,这些控件包括:
<input type="text" />
<textarea></textarea>
<asp:TextBox runat="server"></asp:TextBox>
n 查找所有带参数的URL
通过文件查找所有的”aspx?”,”html?”,”htm?”,”.svc”(随系统的文件后缀方案而定),筛选出所有带参数的URL。
n 查找所有的ajax
通过文件查找前台中所有的”ajax”,筛选出所有的ajax输入。
n 查找所有cookie
通过文件查找所有的”cookie”,找出所有设置cookie的地方。
n 查找所有session
通过文件查找所有的” session”,找出所有设置session的地方。
n 处理以上查找的结果
分别将其对应的输出查找出来,然后汇集为如下的表格:
|
序号 |
前台文件 |
输入出代码行 |
输出文件 |
为输出赋值的代码行 |
处理完成否 |
n 查找遗漏
为了防止遗漏,需要直接查找输出,通过文件查找所有的”Response.Write”(后台),” innerHTML”(前台),”document.write”(前台)。将遗漏更新到上面的表格中。
注意,实际上,如果将应用程序变量和数据库内容赋值给前台控件,通过这种方式还是不能找到遗漏的,只能依赖于前面的输入的查找来一定程度上避免这种情况。
n 根据以下表格中的处理方法来处理上面统计出来的表格中的代码行,为输出Encode
为了防范XSS攻击,我们可以使用Anti-Cross Site Scripting Library(查看http://msdn.microsoft.com/en-us/library/aa973813.aspx,不过当前版本已经到了4.2.1,下载地址为:http://www.microsoft.com/en-us/download/details.aspx?id=28589)
该Library提供如下的几个函数,分别对不同的应用场景作出处理:
|
Encoding Method |
Should Be Used If … |
Example/Pattern |
|
HtmlEncode |
Untrusted input is used in HTML output except when assigning to an HTML attribute. |
<a href="http://www.contoso.com">Click Here [Untrusted input]</a> |
|
HtmlAttributeEncode |
Untrusted input is used as an HTML attribute |
<hr noshade size=[Untrusted input]> |
|
JavaScriptEncode |
Untrusted input is used within a JavaScript context |
<script type="text/javascript"> … [Untrusted input] … </script> |
|
UrlEncode |
Untrusted input is used in a URL (such as a value in a querystring) |
<a href="http://search.msn.com/results.aspx?q=[Untrusted-input]">Click Here!</a> |
|
VisualBasicScriptEncode |
Untrusted input is used within a Visual Basic Script context |
<script type="text/vbscript" language="vbscript"> … [Untrusted input] … </script> |
|
XmlEncode |
Untrusted input is used in XML output, except when assigning to an XML attribute |
<xml_tag>[Untrusted input]</xml_tag> |
|
XmlAttributeEncode |
Untrusted input is used as an XML attribute |
<xml_tag attribute=[Untrusted input]>Some Text</xml_tag> |
n 确保配置web.config中的validateRequest="true"
n 确保Cookie的httponly
通过文件查找所有的”cookie”,找出所有设置cookie的地方,为用于认证的cookie设置如下的格式:
Set-Cookie: cookieName=cookieValue;httponly
xss攻击(跨站脚本)的更多相关文章
- AntiXSS - 支持Html同时防止XSS攻击
AntiXSS - 支持Html同时防止XSS攻击 跨站脚本攻击(XSS)已经不是什么新鲜的话题了,甚至很多大公司也为此吃尽苦头.最简单直接的防范方法,就是不允许任何html标签输入,对用户输入进行编 ...
- XSS攻击 && CSRF攻击 基础理解
一个网站,不管多么的帅气,多么的风骚,如果你不安全,那始终都是一个弟弟啊~ 今天又看了下XSS和CSRF攻击的文章,我也想发点什么普及下大家的安全意识,毕竟作为一名拥有伟大梦想的程序员,基本的安全意识 ...
- 【网络安全】给你讲清楚什么是XSS攻击
给你讲清楚什么是XSS攻击 1. 什么是XSS攻击 跨站脚本攻击(Cross Site Scripting)本来的缩写为CSS,为了与层叠样式表(Cascading Style Sheets,CSS) ...
- XSS攻击及防范
1.什么是XSS攻击 跨站脚本攻击(Cross Site Scripting),攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到 ...
- XSS(跨站脚本攻击)的最全总结
从OWASP的官网意译过来,加上自己的理解,算是比较全面的介绍.有兴趣的可私下交流. XSS 跨站脚本攻击 ============================================== ...
- 关于XSS(跨站脚本攻击)和CSRF(跨站请求伪造)
我们常说的网络安全其实应该包括以下三方面的安全: 1.机密性,比如用户的隐私被窃取,帐号被盗,常见的方式是木马. 2.完整性,比如数据的完整,举个例子,康熙传位十四子,被当时四阿哥篡改遗诏:传位于四子 ...
- Magicodes.WeiChat——使用AntiXssAttribute阻止XSS(跨站脚本攻击)攻击
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往Web页面里插 ...
- Web安全测试之XSS(跨站脚本攻击)
XSS 全称(Cross Site Scripting) 跨站脚本攻击, 是Web程序中最常见的漏洞.指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会在用户的 ...
- 跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击
跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击 一.总结 一句话总结:比如用户留言功能,用户留言中写的是网页可执行代码,例如js代码,然后这段代码在可看到这段留言的不同一户的显示上就会 ...
随机推荐
- mybatis_ The content of element type association must match (constructor,id,result,ass ociation,collection,discriminator)
一般遇到这种问题肯定要看一看association中元素编写顺序, <resultMap id="orderRslMap" type="orders"&g ...
- 【Java每日一题】20170324
20170323问题解析请点击今日问题下方的“[Java每日一题]20170324”查看(问题解析在公众号首发,公众号ID:weknow619) package Mar2017; public cla ...
- Netty实战十一之预置的ChannelHandler和编解码器
Netty为许多通用协议提供了编解码器和处理器,几乎可以开箱即用,这减少了你在那些相当繁琐的事务上本来会花费的时间与精力.我们将探讨这些工具以及它们所带来的好处,其中包括Netty对于SSL/TLS和 ...
- C#设计模式之十四命令模式(Command Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第二个模式,该模式是[命令模式],又称为行动(Action)模式或交易(Transaction)模式,英文名称是:Command Pattern.还是老套路 ...
- Itween 动画插件中 的画线
1.首先在你的层次视图中创建所需的节点 ,节点的位置顺序排列 2.导入Itween 插件 1.可以直接从项目外部拖拽到本项目中 2.通过AssetStore 中导入 3.在你的父节点上创建脚本 ,对象 ...
- 为啥JQuery被淘汰了?
摘要: 技术进步永不止步. 原文:jQuery的没落和技术发展的一般规律 作者:凌霄光 Fundebug经授权转载,版权归原作者所有. jQuery的成就 jQuery是一个伟大的库, 它解决了dom ...
- 关于RecyclerView你知道的不知道的都在这了(上)
目录 前言 目录 正文 1. LayoutManager 2. ViewHolder 3. LayoutParams 4. Adapter 5. RecyclerView 6. Recycler 7. ...
- js 判断数组中的值是否都相等
function isAllEqual(array) { if (array.length > 0) { return !array.some(function(value, index) { ...
- 2017-11-09 中文代码示例之Vuejs入门教程(一)
"中文编程"知乎专栏原链 为了检验中文命名在主流框架中的支持程度, 在vuejs官方入门教程第一部分的示例代码中尽量使用了中文命名. 所有演示都在本地测试通过, 源码在这里. 下面 ...
- 利用SurfaceView显示正弦曲线,仿造示波器
众所周知,view是通过刷新来重绘视图的,Android系统通过发出VSYNC信号来进行屏幕重绘,刷新的时间间隔为16ms,如果在16ms内view完成你所需要的所有操作,那么用户在视觉上就不会产生卡 ...