XSS解决方案系列之三: 例解过后,再回首您正在维护的产品

2013-06-07 318117人围观 ,发现 46 个不明物体 WEB安全

【说明】

1. 举例子所占篇幅较大,详细的例子只举一个吧,目前只举较典型的二维编码的例子

2. 如果您想运行此例,那么你需要自己实现例子当中的类似于urlEncoder/jsEncoder/htmlEncoder函数,关于这些函数实现由于跨国公司需要考虑多语言问题,经常会遇到诸多的bug,许多开源组件当中的编码函数做的并不彻底,自己实现最靠谱,以后有机会,专门写文阐述

3. 同样,本文不参考任何文档,不涉及任何版权,皆为原创

4. 由于本站点代码展示模块未做HTML编码的编码,导致我的html编码后的字符串被自动解码成了原文,没办法,只能用小截图来完成

5. 关于组合解码对应的组合编码的问题,组合数许多许多,无法一一列举,希望能抛砖引玉,触类旁通,请相信,本ID所述的XSS解决方案是【武当少林】等上三门级别的,绝非【左道旁门】,哈哈。

以下示例代码是一个简化了的客户端与服务端处理程序同存于一个文件的JSP Document:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>js_in_html_onlyhtmlfilter.jsp</title>
    </head>
    <body>
        <h1>Hello XssSolution Fans!-js_in_html_onlyhtmlfilter.jsp</h1>
        <%
           String searchBox = "";
            try {
                searchBox = request.getParameter("searchbox").toString();
            } catch (NullPointerException ex) {
                searchBox = "";
            }
        %>

        *****Output Filter****<br><br>

        <form name="searchform1" action="/xssSolution/js_in_html_onlyhtmlfilter.jsp"  method="GET" accept="*">
            <input size="120" type="text" value="" name="searchBox" />
            <input type="submit" value="Search Me -1" name="submit"/>
        </form>
        <input type="button" name="letusgo" value="Let's Go" onclick="alert('<%=htmlEncoder("searchBox")%> ' )" />

    </body>
</html>

代码解读:

两部分,*****Output Filter ****之前的Java代码是服务端处理用户请求的代码, ****Output Filter*****之后的JAVA代码是用来做输出的代码,此例子当中,依据上文章所述,<%=htmlEncoer(“searchBox”%>处的解码环境应该是:先做HTML解码,再做JS解码,最终的字符串值给了alert()函数。所以,解决问题的正确的法应该是: alert(‘<%=htmlEncoder(jsEncoder(“searchBox”))%>’)

有心的同行会问:如果我不这么做,我只对它进行HTML编码不行吗?OK,只做HTML编码,运行结果的SourceCode如下:

1. 运行URL: http://localhost:8080/xssSolution/js_in_html_onlyhtmlfilter.jsp?searchBox=<script>alert(“this is jiayzhan”)</script>&submit=Search+Me+-1

本URL注入了字符串【<script>alert(“this is jiayzhan”)</script>】资源文件片段如下:

2. 以上资源文件可以看出,似乎该编码的地方已经编码了,点击Letusgo按钮,发现字符串【<script>alert(“this is jiayzhan”)</script>】被正常alert出来,而我注入的脚本被没有执行。

不应该有问题的了,对吗? 答案肯定是不对的,现在我们重新构造XSS攻击串:【a’);alert(‘hacked by jiayzhan】

3. 运行URL: http://localhost:8080/xssSolution/js_in_html_onlyhtmlfilter.jsp?searchBox=a’);alert(‘hacked by jiayzhan&submit=Search+Me+-1, 资源文件:

点击按钮Letusgo, 此时情况就不一样了,给一下截图吧:

上面的alert出的内容已经不合预期了,那再点确定:

表明,注入的脚本已经执行,这个理应该做JS与HTML组合编码的地方,由于只做了HTML编码导致了XSS问题依然存的问题您是否遇到过? 是否困惑过? 检查一下自己的产品,是否还会类似的问题存在?

【过程分析】

1. 当字符串 a’);alert(‘hacked by jiayzhan】被htmlEncoder之后变成了:

当浏览渲染行:

 

时,先对onclick的属性值进行一次HTML解码,导致

被还原成了a’);alert(‘hacked by jiayzhan】,最终原始程序当中的alert执行前变成了:【alert(   a’);alert(‘hacked by jiayzhan)】, 您明白了吗?


【练习】

自己分析一下以下语法环境下应该作何种编码,如果不做组合编码,后果是什么?

1.  

<script>
        function clickme()
        {
            document.writeln("<%=request.getParameter("searchBox")%>");
            
        }    
        </script>

2.

<script>
            function GoBackURL()
            {
                var link = "<%=request.getParameter("searchBox")%>";

                    location.href=link;

                }

        </script>

这些评论亮了

  • jiayzhan (5级) 硅谷某知名IT企业中国区高级应用安全工程师 回复
    @anlfi  原本计划是准备写书的,但是我观察了一下,国内目前整个应用安全行业尚未孕育成熟,真正可以解决问题的书没有“黑客思维”“如何攻击”“攻击的本质”“各种帽子”类的书受欢迎。择机准备把文章整理整理出它一本,到时候送你一本?:-)
    )11( 亮了
  • Justin (1级) 回复
    从上一篇跟过来了~~~~
    来猜下第一题:按照上一篇的说法,浏览器在经过render之后,必然会经过一次JS的decode,所以如果不对parameter进行JS encode,可能会出现JS被串改的可能,比如出现");alert("aaa之类的情况。再者,该JS执行的是document.write的操作,会进行DOM的修改,为防止DOM结构遭到注入,因此需要HTML encode。
    总结:从执行的角度讲,render时会JS decode,又parameter需要HTML encode,所以,parameter的encode顺序应该先HTML encode,再JS encode。
    同理可证第二个脚本~~~~
    )9( 亮了
  • jiayzhan (5级) 硅谷某知名IT企业中国区高级应用安全工程师 回复
    @superhacker 不要被黑客的攻击思维左右而开始动手去做"花一年也难学到一个系统的防御方法"的活,防御不是与黑客对着干--你攻我一下我堵你一下,而是让黑客无处下手。但了解黑客的攻击方式是必要的,不要认为自己一定得从一个黑客入手才能如之何,不要把自己放到井底,以至于步步为营的学习十年也只在地面。思维是逐步形成的,抓住切入点直接进入,不要犹豫、质疑、迟疑,大方向是对的,现在就出发,基础知识的准备也是在学习未知的内容过程积累的,而不是先打基础再去学新内容,那是保守传统而又不划算的学习方式。个人心得,望有所帮助。
    )8( 亮了
发表评论

已有 46 条评论

取消
Loading...
css.php