【说明】
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>