关于XSS漏洞的一个小问题

时间:2010-11-08 17:59:28

标签: php xss

我想在实时服务器上使用css样式切换器。我一直在询问irc,一个人说有一个很大的XSS漏洞。我不太了解XSS漏洞。我希望有人可以帮助我保护它!

我将本教程用于css切换器: http://net.tutsplus.com/tutorials/javascript-ajax/jquery-style-switcher/

并且该人说该漏洞位于脚本的PHP端!

任何提示都将受到高度赞赏!

此外,如果有人能够以更安全的方式重新制作整个脚本,因为 - 请使用net.tutsplus.com的许多人使用它会感谢你!

3 个答案:

答案 0 :(得分:7)

我在此脚本中看到的问题是,有一个值来自客户端$_COOKIE['style'],并且直接在页面中输出。

<link id="stylesheet" type="text/css" href="css/<?php echo $style ?>.css" rel="stylesheet" />

在一些特定的条件下,外部网站可以使用cookie进行高价劫持。此外,Cookie值也会在style-switcher.php中设置,而不会根据GET参数进行任何过滤。

我建议你限制你想要的风格的可能性。

示例:

<?php  
   if(!empty($_COOKIE['style'])) $style = $_COOKIE['style'];  
   else $style = 'day';  

   // List of possible theme //
   $listStyle = array('day', 'night', 'foobar');
   if (!in_array($style, $listStyle)) {
        $style = $listStyle[0];
   }
?> 

答案 1 :(得分:6)

href="css/<?php echo $style ?>.css"

每次输出文本字符串为HTML时,都必须对值使用htmlspecialchars(),否则使用<&之类的带外字符,或者在这种情况下" 1}}将突破上下文(属性值)并允许攻击者在页面中插入任意HTML,包括JavaScript内容。

这是在HTML注入漏洞中,你应该修复它。但是,它还不是直接的XSS漏洞,因为$style的来源是$_COOKIE。该cookie必须由您的脚本或用户自己设置;与$_GET$_POST值不同,它不能由第三方在用户的浏览器上设置。如果您允许第三方将用户的cookie设置为任意值,则它只会成为漏洞。

然而,style-switcher.php正是如此:

$style = $_GET['style'];  
setcookie("style", $style, time()+604800);

没有检查$style是否为已批准的值,并且没有检查用户自己切换样式的请求,而不是第三方站点上的任意链接:即,它容易受到XSRF的攻击。假设攻击者在用户访问的页面中包含链接或img src,指向:

http://www.example.com/style-switcher.php?style="><script>steal(document.cookie);</script>

每次用户从您的网站加载页面时,都会运行该脚本。 (从技术上讲,此示例中的";< / >字符需要使用%进行网址编码,但我已将其保留为了便于阅读,请点击这里。)

(另外,你应该使用POST表单,因为它有副作用。)

更糟糕的是,同一个脚本包含一个直接回声注入,其中绝对是XSS易受攻击的:

if(isset($_GET['js'])) {  
    echo $style;  
}

此孔允许任意内容注入。虽然通常你会期望这个带有js的脚本被XMLHttpRequest调用(通过jQuery get()),但没有什么可以阻止攻击者通过将用户链接到像这样的URL来调用它:

http://www.example.com/style-switcher.php?style=<script>steal(document.cookie);</script>&js=on

作为回应,他们会将<script>回显到一个未明确设置Content-Type标头的页面中,默认为text/html,导致攻击者选择的JavaScript在您网站的安全环境中执行。

header("Location: ".$_SERVER['HTTP_REFERER']);

由于其他原因,这不是一个好主意。 Referer标头无法保证进入您的服务器。要确保这一点,请将参数中的URL-return-to传递给脚本。

我可能不会为PHP方面而烦恼。我只是从JavaScript和location.reload()设置相关的cookie或操纵样式表DOM来更新。 PHP脚本试图使切换器在没有JavaScript的情况下工作,但除非您可以通过XSRF保护来正确和安全地实现它,否则这是一种责任。

如果您将替代样式表包含为<link rel="alternate stylesheet">,则无论如何都会为没有JavaScript的用户提供样式表切换支持。

答案 2 :(得分:0)

对您的应用进行全面的安全测试,以查看漏洞的位置。试试Skipfish