ps:在toUpperCase()函数中,字符ı会转变为I,字符ſ会变为S。在toLowerCase()函数中,字符İ会转变为i,字符K会转变为k。利用这些特性可以绕过xss的某些防御。
toUpperCase(): ı ==>I ſ ==>S toLowerCase(): İ ==>i K ==>k
toUpperCase():
toLowerCase():
参考资料:
Fuzz中的javascript大小写特性
转自:http://www.leavesongs.com/HTML/javascript-up-low-ercase-tip.html
某比赛实在有点坑人,题目涉嫌抄袭不说,还不停改来改去。算了不吐槽了,说一则javascript小特性吧。
toUpperCase()是javascript中将小写转换成大写的函数。toLowerCase()是javascript中将大写转换成小写的函数。但是这俩函数真的只有这两个功能么?
不如我们来fuzz一下,看看toUpperCase功能如何?
<script> for (var j = 'A'.charCodeAt(); j <= 'Z'.charCodeAt(); j++) { var s = String.fromCodePoint(j); for (var i = 0; i < 0x10FFFF; i++) { var e = String.fromCodePoint(i); if (s == e.toUpperCase() && s != e) { document.write("char: "+e+"<br/>"); }; }; } </script>
结果我们可以看到:
其中混入了两个奇特的字符”ı“、”ſ“。
这两个字符的“大写”是I和S。也就是说“ı“.toUpperCase() == ‘I’,”ſ“.toUpperCase() == ‘S’。通过这个小特性可以绕过一些限制。
同样,toLowerCase也有同样的字符:
<script> for (var j = 'a'.charCodeAt(); j <= 'z'.charCodeAt(); j++) { var s = String.fromCodePoint(j); for (var i = 0; i < 0x10FFFF; i++) { var e = String.fromCodePoint(i); if (s == e.toLowerCase() && s != e) { document.write("char: "+e+"<br/>"); }; }; } </script>
这个”K“的“小写”字符是k,也就是”K“.toLowerCase() == ‘k’.
用这个特性可以完成 http://prompt.ml/9 。还有某比赛的神题,当然有更简单的方法。
ps: http://prompt.ml/9的题目如下:
function escape(input) { // filter potential start-tags input = input.replace(/<([a-zA-Z])/g, '<_$1'); // use all-caps for heading input = input.toUpperCase(); // sample input: you shall not pass! => YOU SHALL NOT PASS! return '<h1>' + input + '</h1>'; }
因此我们可以通过输入:<ſcript>prompt(1)</script>来绕过。
转载请注明:jinglingshu的博客 » javascript大小写特性toUpperCase()与toLowerCase()