XPath注入


XPath基礎

XPath 即為 XML 路徑語言,是一門在XML文檔中查找信息的語言。XPath 基於 XML 的樹狀結構,有不同類型的節點,包括元素節點,屬性節點和文本節點,提供在數據結構樹中找尋節點的能力,可用來在 XML 文檔中對元素和屬性進行遍歷。XPath 使用路徑表達式來選取 XML 文檔中的節點或者節點集。

XPath節點

XPath中有七種節點類型:元素、屬性、文本、命名空間、處理指令、注釋以及文檔節點(或成為根節點)。文檔的根節點即是文檔結點;對應屬性有屬性結點,元素有元素結點。

  • element (元素)
  • attribute (屬性)
  • text (文本)
  • namespace (命名空間)
  • processing-instruction (處理指令)
  • comment (注釋)
  • root (根節點)

節點關系

節點關系分為以下5類:

  • 父(Parent):每個元素以及屬性都有一個父。
  • 子(Children):元素節點可有零個、一個或多個子。
  • 同胞(Sibling):擁有相同的父的節點。
  • 先輩(Ancestor):某節點的父、父的父,等等。
  • 后代(Descendant):某個節點的子,子的子,等等。

XPath 語法

 

以bWAPP中的heroes.xml文件為例來說明可能會更好:

<?xml version="1.0" encoding="UTF-8"?>
<heroes>
    <hero>
        <id>1</id>
        <login>neo</login>
        <password>trinity</password>
        <secret>Oh why didn't I took that BLACK pill?</secret>
        <movie>The Matrix</movie>
        <genre>action sci-fi</genre>
    </hero>
    <hero>
        <id>2</id>
        <login>alice</login>
        <password>loveZombies</password>
        <secret>There's a cure!</secret>
        <movie>Resident Evil</movie>
        <genre>action horror sci-fi</genre>
    </hero>
</heroes>

 

 

采取節點

XPath 使用路徑表達式在 XML 文檔中選取節點。節點是通過沿着路徑或者 step 來選取的。 下面列出了最有用的路徑表達式:

表達式

描述

nodename

選取此節點的所有子節點。

/

從根節點選取。

//

從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。

.

選取當前節點。

..

選取當前節點的父節點。

@

選取屬性。

 

可以通過XPath在線測試工具來學習。

 

輸入/heroes 可以獲取到根節點下所有子節點。

 

 

注意:如果 XPath 的開頭是一個斜線(/)代表這是絕對路徑。如果開頭是兩個斜線(//)表示文件中所有符合模式的元素都會被選出來,即使是處於樹中不同的層級也會被選出來。

謂語(Predicates)

  • 謂語用來查找某個特定的節點或者包含某個指定的值的節點。
  • 謂語被嵌在方括號中。

/heroes/hero[1]

選取屬於 heroes子元素的第一個 hero 元素。

/heroes/hero[last()]

選取屬於 heroes 子元素的最后一個 hero元素。

/heroes/hero[last()-1]

選取屬於 heroes 子元素的倒數第二個 hero元素。

/heroes/hero[position()=1]

選取屬於 heroes子元素的第一個 hero 元素。

/webinfo//site[@dig]

選取所有擁有名為 dig的屬性的 site 元素。

/webinfo//site[@dig=1]

選取所有 site 元素,且這些元素擁有值為 1dig 屬性。

/bookstore/book[price>35.00]

選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大於 35.00

/bookstore/book[price>35.00]/title

選取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值須大於 35.00。

 

 

輸入/heroes/hero[login='alice'],匹配login等於alice的

 

選取未知節點

XPath 通配符可用來選取未知的 XML 元素。

通配符

描述

*

匹配任何元素節點。

@*

匹配任何屬性節點。

node()

匹配任何類型的節點。

 

 選取若干路徑

 

通過在路徑表達式中使用"|"運算符,您可以選取若干個路徑。

 

XPath 軸(Axes)

軸可定義相對於當前節點的節點集。

軸名稱

結果

ancestor

選取當前節點的所有先輩(父、祖父等)。

ancestor-or-self

選取當前節點的所有先輩(父、祖父等)以及當前節點本身。

attribute

選取當前節點的所有屬性。

child

選取當前節點的所有子元素。

descendant

選取當前節點的所有后代元素(子、孫等)。

descendant-or-self

選取當前節點的所有后代元素(子、孫等)以及當前節點本身。

following

選取文檔中當前節點的結束標簽之后的所有節點。

namespace

選取當前節點的所有命名空間節點。

parent

選取當前節點的父節點。

preceding

選取文檔中當前節點的開始標簽之前的所有節點。

preceding-sibling

選取當前節點之前的所有同級節點。

self

選取當前節點。

 

 

XPath 運算符

 

 

運算符

描述

實例

返回值

|

計算兩個節點集

//book | //cd

返回所有擁有 book 和 cd 元素的節點集

+

加法

6 + 4

10

-

減法

6 - 4

2

*

乘法

6 * 4

24

div

除法

8 div 4

2

=

等於

price=9.80

如果 price 是 9.80,則返回 true。

如果 price 是 9.90,則返回 false。

!=

不等於

price!=9.80

如果 price 是 9.90,則返回 true。

如果 price 是 9.80,則返回 false。

<

小於

price<9.80

如果 price 是 9.00,則返回 true。

如果 price 是 9.90,則返回 false。

<=

小於或等於

price<=9.80

如果 price 是 9.00,則返回 true。

如果 price 是 9.90,則返回 false。

>

大於

price>9.80

如果 price 是 9.90,則返回 true。

如果 price 是 9.80,則返回 false。

>=

大於或等於

price>=9.80

如果 price 是 9.90,則返回 true。

如果 price 是 9.70,則返回 false。

or

price=9.80 or price=9.70

如果 price 是 9.80,則返回 true。

如果 price 是 9.50,則返回 false。

and

price>9.00 and price<9.90

如果 price 是 9.80,則返回 true。

如果 price 是 8.50,則返回 false。

mod

計算除法的余數

5 mod 2

1

 

bWAPP源碼分析

 

if(isset($_REQUEST["login"]) & isset($_REQUEST["password"]))
{
    $login = $_REQUEST["login"];
    $login = xmli($login);


    $password = $_REQUEST["password"];
    $password = xmli($password);

    $xml = simplexml_load_file("passwords/heroes.xml");

    $result = $xml->xpath("/heroes/hero[login='" . $login . "' and password='" . $password . "']");

    if($result)
    {
        $message =  "<p>Welcome <b>" . ucwords($result[0]->login) . "</b>, how are you today?</p><p>Your secret: <b>" . $result[0]->secret . "</b></p>";
    }
    else
    {
        $message = "<font color=\"red\">Invalid credentials!</font>";
    }

因此以下就是它的xpath查詢語句:

/heroes/hero[login='' and password='']

 

 

 

 

Xpath注入應用

登錄萬能用戶名/密碼

以bWAPP為例,輸入' or 1=1 or ''='就可以:

/heroes/hero[login='' or 1=1 or ''='' and password='']

 

XPath盲注

 盲注主要利用XPath的一些字符串操作函數和運算符:

 

 

Xpath查詢語句:

//hero[contains(genre, '')]/movie

獲取ID為1的用戶名:

')][id=1]/login|a[contains(aa,'

 

 

 

獲取ID為1的密碼:

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM