【说明】

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>

[原文地址]

相关内容:

XSS解决方案系列之一:淘宝、百度、腾讯的解决方案之瑕疵

XSS解决方案系列之二:知其所以然—浏览器是如是解码的

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

XSS解决方案系列之四:关于编码

防御XSS的七条原则

相关讨论:

ivan 2013-06-07 1楼

1.先js编码在html编码

2.先js编码在url编码

不知道对不对呵呵。

jiayzhan (5级) 硅谷某知名IT企业中国区高级应用安全工程师 2013-06-07

@ivan 手机上看的,俩都反了,更重要的是:例证后果

ivan 2013-06-07

@jiayzhan 没反我的意思就是从里到外。

jiayzhan (5级) 硅谷某知名IT企业中国区高级应用安全工程师 2013-06-08

_

jiayzhan (5级) 硅谷某知名IT企业中国区高级应用安全工程师 2013-06-07 2楼

第二个不大对,更重要的是:如果不这么做,后果是什么,也要写出来

anlfi (1级) ??????????????????????????... 2013-06-07 3楼

你赢了 我看你可以去写一本书了

感谢 科普╮(╯▽╰)╭

jiayzhan (5级) 硅谷某知名IT企业中国区高级应用安全工程师 2013-06-07

@anlfi 原本计划是准备写书的,但是我观察了一下,国内目前整个应用安全行业尚未孕育成熟,真正可以解决问题的书没有“黑客思维”“如何攻击”“攻击的本质”“各种帽子”类的书受欢迎。择机准备把文章整理整理出它一本,到时候送你一本?:-)

bounty (1级) 2013-06-07

@jiayzhan 攻击、黑客之类的书是吸引大家对这方面提兴趣的,教学用书一般都不带黑客、帽子字眼的,倒是你这样的适合整理出来给大家做实验教材

wormfox (2级) 2013-06-08

@jiayzhan 也送我一本吧!

jiayzhan (5级) 硅谷某知名IT企业中国区高级应用安全工程师 2013-06-08

@jiayzhan 呵呵,如果有出的那一天,提醒我~_~

wormfox (2级) 2013-06-08

@jiayzhan OK

直觉动物 (1级) 2013-06-07 4楼

我想问,这个用什么编码和编码的先后顺序是和上一篇文章中说的浏览器解码顺序一致的吗?如果像1楼那样顺序反了,会有什么后果?谢谢!

jiayzhan (5级) 硅谷某知名IT企业中国区高级应用安全工程师 2013-06-07

@直觉动物 回到电脑前了,不好意思: 我前文有说,我们编码的顺序刚好与浏览解码机制的顺序相反,这样就天衣无缝了。顺序反了可能会出bug的,安全问题可能也因此解决了,不过出来一个副产品:bug: 改变了用户的输入 甚至页面上功能不能工作了,特定情况下,顺序反了也可能导致安全问题本身没有解决。都要依据具体的语法环境来看。

直觉动物 (1级) 2013-06-07

@jiayzhan 明白了,谢谢!

Justin (1级) 2013-06-07 5楼

从上一篇跟过来了~~~~

来猜下第一题:按照上一篇的说法,浏览器在经过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。

同理可证第二个脚本~~~~

jiayzhan (5级) 硅谷某知名IT企业中国区高级应用安全工程师 2013-06-07

@Justin 呵呵,你确实明白了

dqw3721 (1级) 2013-06-08 6楼

1. 先html编码,再js编码。输入:");alert("a时出现问题

2. 先url编码,再js编码。输入:";alert("a");"时出现问题

但是如果在1的情况下首先进行html编码,而html编码一般都会把引号转码为&quot;那么不管js是否进行编码都应该不能闭合引号,应该不会执行插入的js代码。同理url编码一般也会编码引号和分号。不知道这样理解是不是有问题。

jiayzhan (5级) 硅谷某知名IT企业中国区高级应用安全工程师 2013-06-08

@dqw3721 正确的,最好可以举出不这么做的后果是什么,具体的实例而不只是理论分析。就像我上面的例子那样无需过于详细,看懂就好。

dqw3721 (1级) 2013-06-08

@jiayzhan

1.如果不进行任何转义

输入”);alert(“a最后出现在页面的js变成

document.writeln("");alert("a");[/code]

会运行非法插入的alert(“a”);

进行html编码后出现在页面的js变成

[code]document.writeln("");alert("a");

");alert("a经过html编码后再变为”);alert(“a 作为普通的字符串出现在页面上

dqw3721 (1级) 2013-06-08

@jiayzhan

1.

在不进行任何转义时,输入”);alert(“a最后出现在页面的js变成

document.writeln(“”);alert(“a”);

这样会运行非法插入的alert(“a”)

如果进行html编码后出现在页面的js变成

document.writeln(“”);alert(“a”);

“);alert(“a经过html编码后再变为”);alert(“a 作为普通的字符串出现在页面上

ps:这编辑器真心不好用

dqw3721 (1级) 2013-06-08

@jiayzhan

在不进行任何转义时,输入”);alert(“a最后出现在页面的js变成

document.writeln(“”);alert(“a”);

这样会运行非法插入的alert(“a”)

如果进行html编码后出现在页面的js变成

document.writeln("&quot;);alert(&quot;a");

经过html编码后再变为”);alert(“a 作为普通的字符串出现在页面上

ps:这编辑器真心不好用

jiayzhan (5级) 硅谷某知名IT企业中国区高级应用安全工程师 2013-06-08

@dqw3721 编辑器没有做好编码的问题,只做了一层编码,不做重复编码,导致如果你想表达htmlEncoder之后的字符无法表达,你的思路是正确的。

door2guest (1级) 2013-06-08 7楼

之前一直以为这种情况是浏览器的解析特例,原来跟解码的顺序有关。这是第一次看到从原理上分析,期待后面更精彩的内容。

jiayzhan (5级) 硅谷某知名IT企业中国区高级应用安全工程师 2013-06-08

@door2guest 尽力吧,呵呵

superhacker 2013-06-08 8楼

你好,一个初学者如何才能具备你这样的思维能力呢?

jiayzhan (5级) 硅谷某知名IT企业中国区高级应用安全工程师 2013-06-08

@superhacker 不要被黑客的攻击思维左右而开始动手去做"花一年也难学到一个系统的防御方法"的活,防御不是与黑客对着干–你攻我一下我堵你一下,而是让黑客无处下手。但了解黑客的攻击方式是必要的,不要认为自己一定得从一个黑客入手才能如之何,不要把自己放到井底,以至于步步为营的学习十年也只在地面。思维是逐步形成的,抓住切入点直接进入,不要犹豫、质疑、迟疑,大方向是对的,现在就出发,基础知识的准备也是在学习未知的内容过程积累的,而不是先打基础再去学新内容,那是保守传统而又不划算的学习方式。个人心得,望有所帮助。