我想在实时服务器上使用css样式切换器.我一直在询问irc,一个人说有一个很大的XSS漏洞.我不太了解XSS漏洞.我希望有人可以帮助我保护它!
我将本教程用于css切换器:http: //net.tutsplus.com/tutorials/javascript-ajax/jquery-style-switcher/
那家伙说这个漏洞就在脚本的PHP端!
任何提示将非常感谢!
此外,如果有人可以更安全的方式重新制作整个脚本,因为 - 请从net.tutsplus.com做很多人使用它会感谢你!
我在这个脚本上看到的问题是,有一个来自客户端的值,$_COOKIE['style']并且直接在页面中输出.
<link id="stylesheet" type="text/css" href="css/<?php echo $style ?>.css" rel="stylesheet" />
Run Code Online (Sandbox Code Playgroud)
在某些特定条件下,外部网站可以使用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];
}
?>
Run Code Online (Sandbox Code Playgroud)
href="css/<?php echo $style ?>.css"
Run Code Online (Sandbox Code Playgroud)
每次将文本字符串输出到HTML时,都必须使用htmlspecialchars()该值,否则带外字符<,&或者在这种情况下"将突破上下文(属性值)并允许攻击者将任意HTML插入到页面,包括JavaScript内容.
这在HTML注入漏洞中,您应该修复它.但它还不是直接的XSS漏洞,因为它的来源$style是$_COOKIE.该cookie必须由您的脚本或用户自己设置; 与值$_GET和$_POST值不同,它不能由第三方在用户的浏览器上设置.如果您允许第三方将用户的cookie设置为任意值,则它只会成为漏洞.
但是,style-switcher.php确切地说:
$style = $_GET['style'];
setcookie("style", $style, time()+604800);
Run Code Online (Sandbox Code Playgroud)
没有检查$style是否是批准的值,并且没有检查用户自己切换样式的请求,而不是第三方站点上的任意链接:也就是说,它容易受到XSRF的攻击.假设攻击者包含链接或img src用户访问的页面,指向:
http://www.example.com/style-switcher.php?style="><script>steal(document.cookie);</script>
Run Code Online (Sandbox Code Playgroud)
每次用户从您的站点加载页面时,都会运行该脚本.(技术上,",;和</ >在这个例子中的字符必须是URL编码与%,但我把它生在这里的可读性.)
(此外,您应该使用POST表单,因为它有副作用.)
更糟糕的是,同一个脚本包含一个直接回声注入,其中绝对是XSS易受攻击的:
if(isset($_GET['js'])) {
echo $style;
}
Run Code Online (Sandbox Code Playgroud)
该孔允许任意内容注入.虽然通常你会期望这个脚本js被XMLHttpRequest(通过jQuery get())调用,但没有什么能阻止攻击者通过将用户链接到以下URL来调用它:
http://www.example.com/style-switcher.php?style=<script>steal(document.cookie);</script>&js=on
Run Code Online (Sandbox Code Playgroud)
作为回应,他们会<script>在页面中回Content-Type显它们,如果没有明确设置标题,将默认为text/html,导致攻击者选择在您网站的安全上下文中执行JavaScript.
header("Location: ".$_SERVER['HTTP_REFERER']);
Run Code Online (Sandbox Code Playgroud)
出于其他原因,这不是一个好主意.该Referer标题是不能保证做它的方式到你的服务器.要确保此操作正常,请将参数中的URL-return-to传递给脚本.
我可能不会为PHP方面而烦恼.我只是从JavaScript设置相关的cookie,location.reload()或者操纵样式表DOM来更新.PHP脚本试图使切换器在没有JavaScript的情况下工作,但除非您可以通过XSRF保护来正确和安全地实现它,否则它是一种负担.
如果您包含替代样式表,<link rel="alternate stylesheet">那么无论如何您都将为没有JavaScript的用户提供样式表切换支持.