欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

使用XML内部实体绕过Chrome和IE的XSS过滤

来源:本站整理 作者:佚名 时间:2016-10-21 TAG: 我要投稿


简介
假如你要让Web应用在后台执行某些XML处理任务的话,那么你将很有可能受到XSS攻击(跨站脚本攻击)。我之所以会这样说,是因为安全研究人员发现,攻击者现在可以使用XML内部实体来绕过目前常见浏览器的XSS过滤器,受影响的浏览器包括Chrome、IE、以及Safari在内。当然了,这种攻击手段对火狐浏览器也同样能够奏效,但很明显火狐浏览器中并不存在XSS过滤器。
黑吧安全网小百科:XSS攻击
跨站脚本攻击(XSS)是一种经常出现在Web应用中的计算机安全漏洞,它允许Web攻击者将恶意代码植入到提供给其它用户使用的页面中,比如说HTML代码和客户端脚本等。对于跨站脚本攻击,黑客界的共识是:跨站脚本攻击是新型的“缓冲区溢出攻击”,而JavaScript则是一种新型的“ShellCode”。
XML实体
所谓XML实体,实际上就是一些内容占位符。它不仅可以用于内容转义,而且还可以代表一些重复的、无法通过键盘输入的、或者与XML 规范保留字相冲突的字符数据。从这一点来看,它有些似类于 C# 中的转义字符。
由此可以看出,XML实体的作用主要有以下几点:
1. 代替无法输入的字符。键盘只有26个字母和一些简单的标点符号,而字符集中有很多符号是无法通过键盘直接输入的,此时就使用实体来代替。
2. 代替一些与XML规范保留字相冲突的内容,如:“”等。
3. 代替大段的重复文本。
绕过常见浏览器的XSS过滤器
Oracle的“eBusiness Suite”电子商务套件其v12.x以及之前版本的BneApplicationService Servlet中存在一个跨站脚本漏洞。当时,安全研究专家正在尝试寻找外部XML实体处理过程中存在的安全漏洞,但是却意外发现了这个跨站脚本漏洞。
如果我们在浏览器中发送下面这段请求:

https://example.com/oa_servlets/oracle.apps.bne.webui.BneApplicationService?bne:page=BneMsgBox&bne:messagexml=XXX
那么我们将会得到如下所示的响应信息:
The following error has occurred
Exception Name: oracle.apps.bne.exception.BneFatalException -
oracle.apps.bne.exception.BneFatalException: XML parse error in file at line 1, character 1.
Log File Bookmark: 392699
于是,我们修改了请求,然后将其封装在了一个XML标签内:

https://example.com/oa_servlets/oracle.apps.bne.webui.BneApplicationService?bne:page=BneMsgBox&bne:messagexml=%3CFOO%3EXXXXX%3C/FOO%3E
现在,我们所得到的响应信息如下所示:
The following error has occurred
Exception Name: oracle.apps.bne.exception.BneFatalException - java.lang.ClassCastException:
oracle.xml.parser.v2.XMLText cannot be cast to oracle.xml.parser.v2.XMLElement
Log File Bookmark: 602808
所以接下来,我们就要尝试弄清楚相关类文件在底层到底是如何处理这些请求的。在对源代码进行了审查之后,我们在createBodyBneStyle方法中发现了下列信息:
XMLDocument localXMLDocument = BneXMLDomUtils.parseString(this.m_messagesXML);
XMLElement localXMLElement1 =
(XMLElement)localXMLDocument.getDocumentElement();
 NodeList localNodeList = localXMLElement1.getChildNodes();
 for (int i = 0; i
 {
     String str1 = "";
     String str2 = "";
     String str3 = "";
     String str4 = null;
     String str5 = null;
     Node localNode = null;
     XMLElement localXMLElement2 = (XMLElement)localNodeList.item(i);
     NamedNodeMap localNamedNodeMap = localXMLElement2.getAttributes();
     localNode = localNamedNodeMap.getNamedItem("bne:type");
     if (localNode != null) {
         str1 = localNode.getNodeValue();
     }
     localNode = localNamedNodeMap.getNamedItem("bne:text");
     if (localNode != null) {
         str2 = localNode.getNodeValue();
     }
     localNode = localNamedNodeMap.getNamedItem("bne:value");
     if (localNode != null) {
         str3 = localNode.getNodeValue();
     }
     localNode = localNamedNodeMap.getNamedItem("bne:cause");

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载