`
carge
  • 浏览: 49990 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Web应用中的安全漏洞

 
阅读更多

 

 

1、【字符导致的XSS】

    Web程序输出页面时会指定(或使用默认的)一个字符集,告诉浏览器如何处理返回的数据,常见字符集有utf-8,GBK,gb2312等等。经证明,IE、Chrome、FF等在处理宽字符集(如gb2312,GBK)时存在问题,可导致一些安全规则被Bypass掉,引发XSS安全漏洞。

      浏览器在解析一个新字符时,首先读取一个字节,如果该字节(Valid字节,V字节,我暂且这样称呼)是指定字符集里的某个字符(该字符至少有由两个字节组成)第一个字节时,则试图用该字节和其后续字节构成一个合法的字符,如果组合成功则输出该字符,不成功则尽量显示一个合理字符。

     在攻击时,攻击者可把一个字符拆分成若干个字节,然后把这一个字节和其它字符一起发送到服务器端,如果这个字节可以和其它字符的字节构成一个字符,这样该字节就吃掉了后面的字符。处理不慎就会导致XSS等安全漏洞。

     例如:

     JavaScript中常用双引号“"”做为字符串的分界符。为防止XSS、SQLI等攻击时,对于从客户端输入到服务器端的双引号,我们会用反斜杠来转义。考虑攻击,如果客户端的输入串中在一个V字节后紧跟一个双引号,到服务器端时,我们会给双引号添加一个反斜杠;这些内容下次发送给浏览器时,浏览器会把V字节和后面的反斜杠解析为一个字符,即V字节吃掉了反斜杠,我们以前的安全处理失效;这样程序就会出现问题。

    请看下面的例子:

示例一:

PHP页面:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>字符导致的XSS</title>
</head>
<body>
<script language="javascript">
function callback(o){
//do nothing
}
callback({"userInput":"normal"});//正常输入
callback({"userInput":"<?php echo substr('我',0,1);?>\"});alert(0);//"});//攻击性输入
callback({"userInput":"<?php echo substr('我',0,2);?>\"});alert(1);//"});//攻击性输入
callback({'userInput':'<?php echo chr(0xC1);?>\'});alert(2);//'});//攻击性输入
</script>
</body>
</html> 

 

PHP页面输出:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>字符导致的XSS</title>
</head>
<body>
<script language="javascript">
function callback(o){
//do nothing
}
callback({"userInput":"normal"});//正常输入
callback({"userInput":"蝄"});alert(0);//"});//攻击性输入
callback({"userInput":"我\"});alert(1);//"});//攻击性输入
callback({'userInput':'羂'});alert(2);//'});//攻击性输入
</script>
</body>
</html> 

 说明:

1.userInput对应的值为用户输入的值;

2.为了解释我们用PHP来截断输出字符中的字节;

3.从程序输出可以看出“我”的第一个字节和表示反斜杠的字节被浏览器识别为“襖”字,从而V字节吃掉了反斜杠

4.meta中指定的 charset=utf-8为时,不会出现上述问题;但是用户强制在页面上把编码转换为gb2312时又会出现该问题。

 

示例二:如何输入半个字符?

PHP页面http://localhost/test2.php

 

<script language="javascript">
var callback = "<?=($_GET["callback"])?>";
</script>

 

在浏览器中输入如下URL:

 

http://localhost/test2.php?callback=%E6";alert%28/XSS/%29;//"

回车,页面输出如下HTML,并弹出alert框“ /XSS/ ”,说明存在XSS漏洞。

 

<script language="javascript">
var callback = "鎈";alert(/XSS/);//\"";
</script>

说明:

(1) PHP中会对所有双引号添加反斜杠来转义,根据输入URL的最后一个双引号的输出结果可看出。

(2) 本来对callback=%E6" 中的双引号也添加有一个反斜杠, 但是%E6(“我”字第一个字节的URL编码)和%5C能构成一个字符“”,所以输出时,%E6就吃掉了后面的双引号。从而导致XSS漏洞


 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics