标签:
XSS(Cross Site Scripting)跨站脚本攻击是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。为了与层叠样式表(Cascading Style Sheets)的缩写CSS区分开,跨站脚本攻击通常简写为XSS。
原理就是:恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。
注意:XSS攻击的对象是网站客户,不是网站本身。
根据XSS跨站脚本攻击存在的形式及产生的效果,可以将其分为以下三类:
将用户输入的数据直接或未经过完善的安全过滤就在浏览器中进行输出,导致输出的数据中存在可被浏览器执行的代码数据。
例如:以下网站地址接受一个txtSearch的查询参数,服务器接收后在将参数显示到页面上。正常的情况下,页面显示正常;当用户输入带有js的代码的时候,问题就来了。直接得到了用户cookie信息。你可能会说,只是个弹出框而已,没什么啊。这里只是一个方便理解的简单示例,当然没什么危害。当黑客通过诱骗,讲含有恶意代码的链接发送给了用户,用户点击了链接,就有可能被盗取cookie数据。具体看危害部分。
正常的输入
含有恶意代码的输入
存储型XSS脚本攻击是指Web应用程序会将用户输入的数据信息保存在服务端的数据库或其他文件形式中,网页进行数据查询展示时,会从数据库中获取数据内容,并将数据内容在网页中进行输出展示,因此存储型XSS具有较强的稳定性。
在博客或新闻发布系统中,黑客将包含有恶意代码的数据信息直接写入文章或文章评论中,所有浏览文章或评论的用户,都会在他们客户端浏览器环境中执行插入的恶意代码。如示例:
在http://test.com/hack.js中含有如下代码:
当其他用户访问含有此评论的页面的时候,你的用户名密码就被发送到了http://test.com/index.php
说明:script标签的src是可以跨域调用的,这也是jsonp的原理。
基于DOM的XSS跨站脚本攻击是通过修改页面DOM节点数据信息而形成的XSS跨站脚本攻击。不同于反射型XSS和存储型XSS,基于DOM的XSS跨站脚本攻击往往需要针对具体的javascript DOM代码进行分析,并根据实际情况进行XSS跨站脚本攻击的利用。
我们在这个页面的input中输入一个图片url,并在页面中进行展示。代码如下:
黑客是怎么利用该种类型代码实现XSS跨站脚本攻击的呢?黑客可以通过构造如下数据,输入“#’ onerror=’javascript:alert(/DOM Based XSS Test/)”,在浏览器中提交后,发现代码果然被执行,出现了弹窗提示:
Hppt是无状态协议,为了保持客户端(浏览器)和服务器的状态信息。服务器端会在session中生成一个会话标识,一般称之为sessionId。客户首次请求服务器,服务器会把sessionId通过http传递给浏览器,浏览器中通过cookie保存这个信息。
通过前面的hack.js的例子,我们看到可以通过如下代码获得cookie里面的sessionId信息
var sessionId=CookieHelper.getCookie(‘sessionId‘).value;
然后把这个信息发送到黑客的服务器,黑客可以轻松的利用一些工具,使用得到的sessionId假冒合法用户对正常网站进行访问。这样自己的后院就被别人为所欲为了。
通过chrome的开发者工具,修改cookie。
我们可以看到增加的sessionId
相对于用户隐私泄露,SNS网络的XSS蠕虫的危害就要更大了。蠕虫是指可以通过网络进行传播和感染的恶性病毒,其最大的特点就是可以自己借助网络环境进行自我复制和感染。
详细分析,可以参考如下文章:
从新浪微博被攻击事件看SNS网站的安全问题
http://www.rising.com.cn/newsletter/news/2011-08-18/9621.html
HttpOnly最初是由微软提出的,目前已经被多款流行浏览器厂商所采用。HttpOnly的作用不是过滤XSS跨站脚本攻击,而是浏览器将禁止页面的Javascript访问带有HttpOnly属性的Cookie,解决XSS跨站脚本攻击后的Cookie会话劫持行为。
httpOnly是在Set-Cookie时进行标记的,设置的Cookie头格式如下:
Set-Cookie: <name>=<value>[; <name>=<value>]
[; expires=<date>][; domain=<domain_name>]
[; path=<some_path>][; secure][; HttpOnly]
各语言的实现可自行百度,在java中实现可以参考如下资料:
http://coffeesweet.iteye.com/blog/1271822
<>、()、&、#、%、?等
‘<’--->$lt、’&’---->&等
对属于的用户名、手机号、电子邮箱等进行客户端&服务器端的正则验证。
这里收集了常见的验证正则表达式
注意:为什么不能过滤关键字,例如<script>、alert()
因为有很多绕过方式:
<scRIpt>
<scr%00ript>
<scr\nript>
eval(‘<scr‘+‘ipt>‘)
< script >
标签:
原文地址:http://my.oschina.net/hc24/blog/527099