今天在刺的ppt里看到一个非常[有趣]的xss例子
<script type="text/javascript">
<!-- 输出到 html 事件中
var y= 'x\');alert(1);//'; // 同时做了 htmlencode 和 jsencode 都不管用, 都会造成XSS
document.write('<a onclick="alert(\'' + y + '\')">test<\/a>');
//-->
</script>
有点绕是吧
那咱先看下这个例子
<script>
var x ='thanks';
alert(''+x+'');
</script>
输出:thanks
可以从中体会下引号是怎么用的,尤其是var x=thanks和 var x=‘thanks’的区别
因为程序员也常写出var x='$thanks'这种错
那么我们现在再回头看刚才那个例子
1.首先x\');alert(1);//;这个字符串是精心构造的既html encode('是')又js encode(就是\转义)
2.接下来,以上这个y字符串被插入<a>中
3.onclick事件的时候,进行了一次 js decode,\被转出来
注意,是onlick事件即js2html有了这次js decode,而不是执行alert本身会decode,不信可以alert('\'+y+'\');试试
4.document.write事件时,再进行html decode,从而全部转义完成,dom xss完成
我的体会是这样的,无论是js2html或是html2js,相互调用时总是有相应的一个decode的过程
摘自:Thanks' blog
查看更多关于二次渲染xss的问题 - 网站安全 - 自学php的详细内容...