这两个概念总是会在不经意之间又被提及,很遗憾的是,我总会忘记他们具体的内容。
这次当我这次需要了解字符集导致的浏览器跨站脚本攻击时,看到gb2312和GBK字符集在IE处理这些宽字符集的时候存在问题,可导致程序的一些安全规则被Bypass,引发严重的跨站脚本安全漏洞,又不甚理解,为什么UTF-8不会产生如此问题。
先讲下原因:
1 Bypass某些js的检查规则
〈HTML>
〈HEAD>
〈TITLE>80sec test〈/TITLE>
〈meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
〈/HEAD>
〈BODY>
〈script>
window.οnerrοr=function(){
alert('Vul');
return true;
}
〈/script>
〈script>x='〈?php echo chr(0xC1);?>';y='[User_IN_PUT]‘;〈/script>
〈/BODY>
〈/HTML>
这里即使是过滤了〈>’/等字符一样可以利用非法字符集序列来实现/的作用,因为它会把原来存在的’给结合掉,然后前面的’找不到闭合,后面[User_IN_PUT]就可以用来执行js代码了。
差了些资料,理解了一些原因,列举下:
UTF-8字符集对应的16进制对应二进制如下,可以看见,相对而言,UTF-8具有很强的规律性,所有字节都是以0、11、111、1111等为开头,因此较容易切分。即使插入一个11******的字节,但是它无法和后面的字节组成字。真是很严谨的字符集。相对而言,GBK就逊色了。
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx