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()

