
오래된 Ghost CMS 웹사이트가 CVE-2026-26980으로 인해 손상된 경우 페이지에 스팸 코드 인젝션이 주입될 수 있습니다. 이를 사용하여 코드 인젝션 필드를 일괄 삭제 및 편집하세요.
Admin API를 통해 Ghost CMS 웹사이트의 모든 게시물과 페이지에서 주입된 코드를 제거합니다.
코드 주입 취약점 CVE-2026-26980의 영향을 받은 Ghost 사이트 등, 침해된 Ghost 사이트를 정리할 때 사용하세요. 공격자가 삽입한 <script> 태그와 기타 주입된 마크업을 각 게시물 및 페이지의 Header와 Footer 코드 주입 필드에서 제거합니다.
기본적으로 안전하며(먼저 드라이런, 그다음 적용) 엄격하게 범위가 제한됩니다. 이 도구는 해당 두 개의 게시물별 필드만 비웁니다. 사이트 전체 코드 주입(Ghost Admin → Settings → Code injection), 게시물 콘텐츠 및 기타 모든 설정은 절대 건드리지 않습니다.
requirements.txt 참조):pip install -r requirements.txt
6478abc123def456:8f9e0d1c2b3a4567890abcdef1234567890abcdef1234567890abcdef12345678
스크립트와 동일한 디렉터리에 ghost_cleaner_config.json이라는 파일을 생성하세요:
{
"ghost_url": "https://yourdomain.com",
"admin_api_key": "YOUR_KEY_ID:YOUR_KEY_SECRET"
}
이 단계를 건너뛰면 스크립트가 첫 실행 시 예제 구성 파일을 생성한 후 종료됩니다 — 파일을 채운 뒤 다시 실행하세요.
무엇이든 건드리기 전에 정확히 무엇이 삭제될지 확인하려면 항상 이것을 먼저 실행하세요:
python3 ghost_injection_cleaner.py
예시 출력:
Ghost Injection Remover
Mode : DRY-RUN (read-only)
Target: https://yourdomain.com
NOTE: /ghost/api/admin/settings/ (site-wide injection) is
never read or written by this script.
============================================================
POSTS
============================================================
47 posts fetched.
✦ 'My First Post'
HEAD: '<script>(function(){var _x="...obfuscated..."</script>'
🔍 DRY-RUN - would be cleared.
============================================================
PAGES
============================================================
6 pages fetched.
============================================================
SUMMARY
============================================================
Would clear : 1 posts/pages
Already clean: 52 posts/pages
Re-run with --apply to commit these changes.
드라이런 출력에 만족하면 --apply를 사용하여 실행하세요. 확인을 요청하는 메시지가 표시됩니다:
python3 ghost_injection_cleaner.py --apply
Type YES to confirm changes to posts and pages: YES
...
✅ Cleared.
python3 ghost_injection_cleaner.py --config /path/to/my_config.json
모든 포스트와 페이지에 대해 다음 두 필드를 null로 설정합니다:
| 필드 | Ghost 편집기 내 위치 |
|---|---|
codeinjection_head | 포스트/페이지 설정 → 코드 삽입 → 헤더 |
codeinjection_foot | 포스트/페이지 설정 → 코드 삽입 → 푸터 |
삽입된 코드가 없는 포스트와 페이지는 조용히 건너뜁니다.
Missing dependencies
pip install -r requirements.txt를 실행한 후 다시 시도하세요.
admin_api_key must be in 'id:secret' format
키 가운데에 콜론이 있는지 확인하세요. :로 구분된 두 개의 16진수 문자열 형태여야 합니다. 공백을 추가하지 말고 Ghost Admin에서 직접 복사하세요.
ERROR: Ghost API returned HTTP 401
Admin API 키가 잘못되었거나 통합이 삭제되었을 수 있습니다. Ghost Admin → 설정 → 통합으로 돌아가 확인하세요.
ConnectionError 또는 타임아웃
설정의 ghost_url이 올바른지, 그리고 스크립트를 실행하는 머신에서 사이트에 접근할 수 있는지 확인하세요.
대규모 사이트에서 스크립트가 멈춘 것처럼 보임 50개 포스트로 이루어진 각 페이지마다 새로운 JWT를 생성하고 API 응답을 기다립니다. 이는 정상이며, 잠시 기다리세요.