Czym jest XPATH injection?

13 lipca 2013, 11:32 | Teksty | komentarzy 7
: zin o bezpieczeństwie - pobierz w pdf/epub/mobi.

O XPATH (XML Path Language) pisaliśmy niedawno temu w kontekście jego możliwego wykorzystania w niektórych przypadkach podatności SQL injection.

Podatność XPATH injection jest pewnym stopniu podobna do SQL injection:

  • w podobny sposób wygląda testowanie na obecność luki (oczywiście trzeba pamiętać, że mamy tu do czynienia ze składnią XPATH – a nie z SQL),
  • dzięki wykorzystaniu podatności również można uzyskać nieautoryzowany dostęp do całej „bazy danych” (w tym przypadku jest to plik XML),
  • w końcu – również mamy tu warunki (odpowiednik WHERE z SQL-a) oraz często wykorzystywany w SQLi operator „UNION” (w XPATH jest to znak: | – czyli pipe).

Jeśli chodzi o różnice – XPATH injection występuje znacznie rzadziej od SQL injection (XPATH to jednak dość niszowy mechanizm), nie da się tutaj uzyskać uprawnień na poziomie systemu operacyjnego czy uzyskać dostęp w trybie „zapisu” do pliku. Jak już wspomniałem – w porównaniu z SQL-em mamy również inną składnię samych zapytań.

Poniższe informacje podane są jedynie w celach edukacyjnych.

Ewentualne testy z wykorzystaniem zamieszczonych tu informacji  należy realizować jedynie na systemach, których bezpieczeństwo możemy oficjalnie sprawdzać.

Zapytania XPATH

Małe przypomnienie czym jest XPATH. Otóż jest to mechanizm umożliwiający pobieranie z pliku XML wybranego fragmentu. Zobaczmy przykładowe zapytanie XPATH, które w swoim tutorialu prezentuje w3schools (zapytanie widoczne jest w prawym górnym rogu na zrzucie poniżej):

xpath_przyklad

Jak widzimy, rozpoczyna się ono znakiem / (slash), warunki (odpowiednik WHERE z SQL) – można znaleźć w nawiasach kwadratowych, z kolei ostatni element po slashu to wskazanie jakie konkretne dane chcemy pobrać z XML-a (w przykładzie powyżej są to tytuły książek). Zapytanie powyżej zwraca zatem ciąg będący tytułami dwóch książek, których cena jest większa od 35:

XPATH, poza prostymi zapytaniami jak powyżej, umożliwia użycie w zapytaniu funkcji realizujących:

  • operacje matematyczne (np. round, abs)
  • operacje na ciągach znakowych (np. substr, string-length)
  • operacje na strukturze XML-a (np. funkcja name(.) zwraca nazwę tzw. bieżącego węzła)
  • itd.

Przykład zapytania z funkcją:

xpath2

Użycie funkcji w XPATH

Pobierze ono ceny wszystkich książek – ponieważ warunek w nawiasach kwadratowych jest zawsze prawdziwy:

  • fragment title=’test’ jest zawsze fałszywy (nie mamy książki o takim tytule)
  • fragment name(.)=’book’ jest zawsze prawdziwy – nazwa bieżącego węzła w XML jest zawsze w tym kontekście równa book

Jeszcze innym przydatnym operatorem w XPATH jest | (pipe). Działa on podobnie do operatora UNION z SQL – tj. łączy sumuje zapytań XPATH. Przykład:

xpath3

Użycie znaku | w XPATH

Takie zapytanie po prostu wyświetli wszystkie zawartości tagów <year> oraz <title> z pliku XML widocznego na wcześniejszym zrzucie.

W porządku, zobaczmy więc jak wygląda przykładowe wstrzyknięcie XPATH:

xpath

Przykład XPATH injection

Można je też zobaczyć „na żywo” w tym miejscu.

Czas na hackme

Nasze zadania:

  1. Poinformuj znajomych o naszych hackme :-) Więcej uczestników to dla nas większa motywacja do tworzenia nowych odcinków. Użycie maila, facebooka czy twittera niewiele kosztuje ;-)
  2. Wyświetl wszystkie podsystemy statku tutaj.
  3. Pobierz kod aktywujący backdoor na statku kosmicznym.
  4. Pobierz całą strukturę XMLa, w którym przechowywane są informacje o sybsystemach statku.
  5. Wyniki prześlij na sekurak@sekurak.pl z tytułem „hackme xpathi”.

Miłej zabawy :-)

PS
Swoją drogą, jest to jedno z wielu ćwiczeń, które realizują uczestnicy mojego szkolenia z bezpieczeństwa aplikacji www (przy okazji – zapraszam:)

–michal.sajdak<at>securitum.pl

 

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

  1. fuzzy

    Kolejne ciekawe hackme i kolejna porcja nabytej wiedzy.

    Dzięki! :)

    P.S.: A swoją drogą to te zaadania z prędkością karabinu wypuszczacie – co bardzo mnie cieszy :D.

    Odpowiedz
    • Cieszę się że hackme się podoba :)
      Co do szybkości, to akurat teraz będzie mała przerwa z zadaniami – w końcu są wakacje ;-p
      –ms

      Odpowiedz
  2. Michał B

    Fajne byłoby też takie większe hackme: jedna porządniejsza aplikacja najeżona różnego rodzaju błędami – kto jako pierwszy znalazłby wszystkie (lub kto znalazłby najwięcej w określonym czasie), ten wygrywa :)

    Odpowiedz
    • Michał: dobry pomysł, choć trzeba na to trochę czasu… pewnie następne hackme w okolicach połowy sierpnia ;-)
      –ms

      Odpowiedz
  3. rigzbe

    Po wpisaniu ‚or’1’=’1’ w http://training.securitum.com/4/details.php?id=1
    otrzymałem :
    „Warning: SimpleXMLElement::xpath(): Invalid predicate in /var/www/4/details.php on line 114

    Warning: SimpleXMLElement::xpath(): xmlXPathEval: evaluation failed in /var/www/4/details.php on line 114

    Not found :-/ ”
    LOL

    Odpowiedz
  4. Fajnie wytłumaczone. Dzięki :)

    Odpowiedz
  5. Tomek

    Fajne oby tak dalej!!!

    Odpowiedz

Odpowiedz