xss漏洞

xss漏洞的特征是在页面输出里注入html或者脚本,利用script环境和html事件机制,在宿主浏览器端执行某些恶意操作。

比如,截获用户登录cookie.

要防止这种漏洞,需要在输出用户输入字符串的地方进行过滤。

1 对用户自创建的脚本环境和html环境进行过滤,比如对<,>,双引号进行转义,实体输出。

2 对于在html属性中输出的情况,最好用双引号包住变量。

<input type="text" name="param" value=$a/>
<input type="text" name="param" value=$b/>
<input type="text" name="param" value=$c/>
<input type="text" name="param" value="$d"/>
<input type="text" name="param" value='$e'/>

输入

$a='aa' onclick='alert(1)'
$b=aa onclick='alert(2)'
$c="aa" onclick='alert(3)'
$d='aa' onclick='alert(4)'
$e=aa' onclick='alert(5)

无双引号包含的成功注入,变量本身没有<>,"",因此1的转义方式对2 无效。

解决办法是属性加上双引号。

而事件属性比较难以防止,尽量不要在事件属性输出用户变量

<input type="text" name="param" onclick="$a" />
<input type="text" name="param" onclick="jsfun($b)" />

输入

$a=alert(1)
$b=0);alert(2
<input type="text" name="param" onclick="alert(1)" />
<input type="text" name="param" onclick="jsfun(0);alert(2)" />
成功注入 

3 在脚本环境中输出的变量。

<script>
var a = $a
var b = '$b'
var c = "$c"
$jscode
</script>

 输入

$a='';alert(1);
$b=';alert(2);//
$c=";alert(3);//
$jscode=alert(4);
<script>
var a = '';alert(1);
var b = '';alert(2);//'
var c = "&quot;;alert(3);//"
alert(4);
</script>

 成功注入。

解决办法是用双引号输出,或者对变量的单引号进行\'和\"转义。

第四种难以预防,最好服务端不要采用这类方式实现。

总的来说,可以把xss漏洞的预防分为两块

A  html输出,属性记得用双引号,对于<>等html标记必须进行转义,用实体输出。

B  脚本环境输出,var 变量赋值必须用单引号或者双引号输出,如果用双引号,那么必须对把变量的双引号转义成实体或\";如果用单引号,那么必须把单引号进行转义'->\'。

另外最好还要将/转义成\/,防止恶意代码逃逸出脚本环境。

相关推荐