跨站脚本攻击xss
如今,大多数网站都在网页上添加了动态内容,使用户的体验更加愉悦。 动态内容是由某些服务器进程生成的内容,该内容在交付时可以根据用户的设置和需求表现并向用户显示不同的内容。 动态网站具有静态网站所没有的威胁,称为“跨站点脚本编制”,也称为“ XSS”。
“网页包含服务器生成并由客户端浏览器解释的文本和HTML标记。仅生成静态页面的网站能够完全控制浏览器用户如何解释这些页面。生成动态网站的网站页面不能完全控制客户端如何解释其输出,问题的核心是,如果可以将不可信内容引入动态页面,则网站和客户端都没有足够的信息来识别这种情况已发生并采取保护措施”,根据CERT协调中心的说法,该中心是由联邦政府资助的研发中心,旨在研究Internet安全漏洞并提供事件响应。
跨站点脚本越来越容易在网站上找到,因此在攻击者中越来越流行。 每个月都会在商业站点中发现跨站点脚本攻击,并发布有关威胁的公告。 如果无人看管,您的网站的安全运行能力以及公司的声誉可能会成为攻击的受害者。
本文旨在提高人们对这种新兴威胁的认识,并提出针对Web应用程序的解决方案实现,以避免此类攻击。
跨站点脚本编写会带来服务器应用程序风险,包括但不限于以下风险:
已知网站上的应用程序容易受到跨站点脚本的攻击后,攻击者可以发起攻击。 攻击者最常使用的技术是注入JavaScript,VBScript,ActiveX,HTML或Flash,以利用受害者的特权在受害者的系统上执行。 一旦攻击被激活,从帐户劫持,更改用户设置,cookie盗窃和中毒,或虚假广告等一切事情都是可能的。
以下方案图说明了一些更相关的攻击。 但是,我们将无法列出该漏洞的所有变体。 要了解有关已记录的攻击以及如何保护自己作为供应商或用户的更多信息,请参阅“ 相关主题”部分。
在这种情况下,攻击者向受害者发送一封特制电子邮件,其中包含恶意链接脚本,如下所示:
当毫无戒心的用户单击此链接时,该URL将被发送到legitimateSite.com
其中包含恶意代码。 如果合法服务器将包含clientprofile
值的页面发送回用户,则恶意代码将在客户端Web浏览器上执行, 如图1所示。
如果网站的任何部分使用cookie,则有可能从其用户那里窃取它们。 在这种情况下,攻击者将带有恶意脚本的页面归档到站点中容易受到攻击的部分。 当显示该页面时,恶意脚本将运行,收集用户的cookie,并将收集到的cookie发送到攻击者的网站。 使用此技术,攻击者可以获得敏感数据,例如密码,信用卡号以及用户输入的任何任意信息, 如图2所示。
在这种情况下,用户在跟踪邮件中的恶意链接时会在不知情的情况下执行攻击者编写的脚本。 由于恶意脚本是在似乎来自合法服务器的上下文中执行的,因此攻击者可以完全访问检索到的文档,并且可以将页面中包含的数据发送回其站点。
如果嵌入式脚本代码具有与合法服务器的其他交互功能而又没有警告受害者,则攻击者可以开发并利用该发布的数据到合法Web服务器上的其他页面, 如图3所示。
如上所述,当攻击者能够使合法的Web服务器将包含攻击者选择的恶意脚本的页面发送到受害用户的Web浏览器时,就可以实现跨站点脚本。 然后,攻击者利用源自合法Web服务器的合法脚本的特权运行恶意脚本。
既然我们知道了攻击的基础,那么该怎么做才能保护自己免受此漏洞的侵害?
网站开发人员可以通过确保动态生成的页面不包含不需要的标签,来保护其站点免遭与这些攻击相关的滥用。
从Web用户的角度来看,存在两种选择来减少遭受此漏洞攻击的风险。 第一种-在Web浏览器和启用HTML的电子邮件客户端中禁用脚本语言-提供最大的保护,但具有禁用功能的副作用。 第二个-仅跟随主网站上的链接进行查看-会大大减少用户的访问量,同时仍保持功能。
但是,Web用户可以采用的解决方案都不是完整的解决方案。 最后,由Web页面开发人员修改他们的页面以消除这些类型的问题。 这可以通过对接收到的输入进行适当的过滤和验证,并对返回给用户的输出进行适当的编码或过滤来实现。
这种方法的基础是永远不要信任用户输入,并且始终过滤HTML规范中定义的元字符(“特殊”字符)。 每个输入字段(包括链接参数)都将针对脚本标签进行验证。 当找到并依赖于上下文时,输入将被拒绝,从而防止恶意HTML呈现给用户。
更复杂的是,许多Web浏览器都试图纠正HTML中的常见错误。 结果,根据规范,有时它们将字符视为特殊字符。 因此,请务必注意,个别情况可能需要在特殊字符列表中包括其他字符。 Web开发人员必须检查其应用程序,并确定哪些字符会影响其Web应用程序。
输入端的过滤效果较差,因为可以通过HTTP以外的方法将动态内容输入到网站数据库中。 在这种情况下,Web服务器可能永远不会将数据视为数据输入过程的一部分,并且数据元素仍然受到污染。 另外,建议在将数据呈现为动态页面之前,将过滤作为数据输出过程的一部分进行。 正确完成后,此方法可确保对所有动态内容进行过滤。
当Web服务器充分确保生成的页面经过正确编码以防止意外执行脚本时,可以避免跨站点脚本攻击。
ISO-8859-1规范中的每个字符都可以使用其数字输入值进行编码。 服务器端编码是一个过程,其中所有动态内容都将通过编码功能,在该功能中,脚本标记将替换为所选字符集中的代码。
一般来说,建议使用编码,因为它不需要您决定哪些字符可以合法输入并需要通过。 不幸的是,对所有不受信任的数据进行编码可能会占用大量资源,并且可能会对某些Web服务器的性能产生影响。
基于CGI的Web应用程序或支持在浏览器上进行字段编辑检查的应用程序可能会通过扩展现有的字段编辑检查以覆盖跨站点脚本漏洞来适应过滤策略。 请注意,尽管浏览器端字段编辑检查将一些运行保存回服务器,但它仅适用于诚实用户,并且需要彻底的代码演练以确保检查所有输入字段以符合补救建议。 但是,内置了服务器端验证的Web应用程序可以选择适应其中一种或两种策略。
为了使过滤策略正常工作,Web开发人员需要确保根据其应用程序的需求更新用于过滤的元字符列表。 另一方面,编码策略不具有上述维护工作,并且对现有应用程序代码以及应用程序功能的影响也较小。 由于这些原因,编码策略似乎是最喜欢的实现选择。 接下来描述示例编码实现。
Web服务器确保所生成的页面正确编码的一种简单而有效的方法是,通过编码功能将动态内容中的每个字符传递给编码功能,其中动态内容中的脚本标记将替换为所选字符集中的代码。 。 此任务非常适合自定义标签库。
定制标记库由一个或多个Java语言类(称为标记处理程序)和XML标记库描述文件(TLD)组成,该文件规定了新的标记名称和这些标记的有效属性。 标记处理程序和TLD确定在请求时如何从JSP页面内部解释和处理标记,它们的属性及其主体。 定制标记库提供的体系结构在封装复杂操作时比Java Bean更灵活。
除了命名XSS
之外,我们的自定义标签库还有什么更好的名称? 标记库是插入Servlet容器的软件组件。 Servlet容器创建标签处理程序,对其进行初始化,并按该顺序调用doStartTag()
, doEndTag()
和release()
方法。
通过这些交互,我们的XSS定制标记库将能够应用“定制”动作,对在JSP页面上找到的动态数据进行编码。 实施自定义标签非常简单,步骤如下:
(.tld)
。 taglib
指令添加到使用标记的JSP文件中。 doStartTag()
或doEndTag()
方法的标记处理程序。 标记库描述符是一个XML文件,其元素描述了特定的标记库。 清单1中显示了XSS
定制标记库的tld文件。 标签元素定义了encode
动作,包括属性property
。 tagclass
元素定义标签处理程序类EncodeTag
。
DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
1.0
1.1
encode
dw.demo.xss.EncodeTag
empty
property
true
taglib指令标识标记库描述符,并定义将后续标记与库关联的标记前缀。 下面显示了一个示例taglib指令,该指令使用XSS
定制标记库显示在JSP中:
<%@ taglib uri="/WEB-INF/tlds/xss.tld" prefix="xss" %>
标记处理程序是Web容器中的一个对象,有助于在执行JSP页面时评估操作。 EncodeTag
类是encode动作的标记处理程序。 清单2显示了它的doStartTag
方法,该方法将动态内容编码为ISO-8859-1字符集。
public int doStartTag() throws JspException {
StringBuffer sbuf = new StringBuffer();
char[] chars = property.toCharArray();
for (int i = 0; i < chars.length; i++) {
sbuf.append("" + (int) chars[i]);
}
try{
pageContext.getOut().print(sbuf.toString());
} catch (IOException ex) {
throw new JspException(ex.getMessage());
}
return SKIP_BODY;
}
XSS
定制标记库是Web应用程序的一部分,它作为附加文件打包到Web应用程序的WAR文件中,如下所示:
以下方案说明了如何使用定制标记库。 假设一个用于接收文章的虚拟网站包含一个页面,用于查看您已订阅的文章。 动态内容(适合您的文章项目)是使用<%= expression %>
语法在JSP文件中准备的。
让我们假设攻击者成功地将包含恶意脚本的页面填充到网站中供订阅的成员使用。 图4演示了这种成功攻击的效果,当在用户浏览器上执行该攻击时,将导致显示弹出窗口。
在下一种情况下,假设的网站将确保使用XSS
自定义标记库对生成的页面进行正确编码,并能够保护自己免受攻击。 保留不受信任的数据,以使其在浏览器中具有视觉外观, 如图5所示。
在本文中,我们讨论了攻击者如何使用跨站点脚本作为对网站发起攻击的技术。 我们还证明,当网站使用简单的自定义标签库正确编码动态内容时,可以消除大多数攻击。 XSS
原样使用XSS
定制标记库,或者更好的是,对其进行更改以适合您的Web应用程序需求,并免受这种新兴威胁的影响。
翻译自: https://www.ibm.com/developerworks/tivoli/library/s-csscript/index.html
跨站脚本攻击xss