我想在实时服务器上使用css样式切换器。我一直在询问irc,一个人说有一个很大的XSS漏洞。我不太了解XSS漏洞。我希望有人可以帮助我保护它!
我将本教程用于css切换器: http://net.tutsplus.com/tutorials/javascript-ajax/jquery-style-switcher/
并且该人说该漏洞位于脚本的PHP端!
任何提示都将受到高度赞赏!
此外,如果有人能够以更安全的方式重新制作整个脚本,因为 - 请使用net.tutsplus.com的许多人使用它会感谢你!
答案 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
。