2026년 10월 21일 PHP 개발진(php.net)이 인증 없이 원격으로 코드를 실행할 수 있는 취약점 두 건(CVE-2026-109618·CVE-2026-109619, 통칭 「PHP2Shell」)을 긴급 수정했습니다. 사이트 코드가 아니라 PHP 해석기 자체의 결함이라, 그누보드·XE(Rhymix)·워드프레스·직접 만든 PHP 사이트까지 PHP 로 돌아가는 웹사이트라면 버전에 따라 모두 해당될 수 있습니다. 이 글은 내 서버의 PHP 버전이 수정판인지 확인하는 법, 울타리 NEO 의 무료 웹 취약점 점검으로 밖에서 확인하는 법, 그리고 공격 시도를 계속 지켜보는 법(모니터링)을 정리합니다.
PHP2Shell 요약 — 무엇이, 어느 버전이 위험한가
| 구분 | 내용 |
|---|---|
| 공개·수정 | 2026-10-21, php.net 긴급 보안 릴리스 |
| CVE | CVE-2026-109618 · CVE-2026-109619 |
| 종류 | 인증 없는 원격 코드 실행(RCE) — 공격자가 로그인 없이 서버에서 명령을 실행할 수 있음 |
| 원인 | PHP 해석기 자체의 결함 — 사이트 코드가 멀쩡해도 해당 |
| 수정판 | 8.5.12 · 8.4.27 · 8.3.36 · 8.2.35 이상 |
| 8.1 이하 | 공식 지원이 끝난 판 — 수정판이 나오지 않습니다. 지원되는 판으로 올려야 합니다 |
| 해결 | 업데이트만이 해결입니다. 설정 변경으로는 완전히 막을 수 없습니다(php.net) |
공개 전부터 공격이 돌았다는 보고가 있어, 「아직 공격받은 적 없다」가 안전의 근거가 되지 않습니다. 공격 요청의 정확한 모양은 이 글을 쓰는 시점에 공개되지 않았습니다 — 아래 「못 보는 것」을 함께 읽어 주세요.
내 서버의 PHP 버전 확인하는 법
- 서버에 접속할 수 있다면 —
php -v. 웹 서버가 쓰는 PHP 가 명령줄과 다를 수 있으니(PHP-FPM 여러 판) 웹에서 도는 판도 확인합니다. - 웹호스팅(카페24·가비아·닷홈 등)을 쓴다면 — 호스팅 관리 화면의 「PHP 버전」 항목을 보고, 수정판이 아니면 호스팅사에 적용 일정을 문의합니다.
- 배포판 패키지(Ubuntu·Debian·RHEL 계열) —
8.1.2-1ubuntu…처럼 꼬리가 붙은 판은 번호가 옛것이어도 보안 수정이 번호 그대로 뒤로 옮겨져 들어갔을 수 있습니다. 번호만으로 판단하지 말고 배포판 보안 공지·패키지 변경 기록(apt changelog,dnf updateinfo)에서 두 CVE 가 반영됐는지 확인합니다. - phpinfo 화면으로 확인했다면 곧바로 지웁니다. 공개된 phpinfo 는 공격자에게 버전과 설정을 그대로 알려 줍니다.
울타리 NEO 무료 웹 취약점 점검 — 밖에서 보이는 만큼 확인
「내 사이트」에 도메인을 등록하고 소유권을 확인한 사이트라면 ultarineo.com/sites 에서 「웹 취약점 점검」을 누를 수 있습니다. 읽기만 합니다 — 공격 요청·침투 시험은 하지 않고, 홈과 흔히 새는 경로 몇 곳에 GET 요청만 보냅니다(10분에 3번까지).
- PHP2Shell 판정 — 응답 머리글(
X-Powered-By)·phpinfo 에 보이는 PHP 버전을 수정판과 대조합니다. 수정판 미만이면 「위험」, 8.1 이하는 「지원 종료」, 배포판 꼬리는 「번호로 판정 불가」. - 버전을 숨긴 서버는 「안전」이 아니라 「못 봄」으로 적습니다. 그누보드·XE·워드프레스 같은 PHP 흔적은 보이는데 버전이 없으면 그렇게 알려 드립니다.
- 새는 파일 —
.env·.git·phpinfo·서버 상태 화면이 열려 있는지 봅니다..env가 열려 있어도 값은 가져오지 않고 열려 있다는 사실만 적습니다. - SSL/TLS 인증서 — 만료·신뢰할 수 없는 발급처·도메인 이름 불일치·14일 안 만료, 옛 암호화 규격(TLS 1.0·1.1)을 아직 받아 주는지.
- 서버·워드프레스 버전 — nginx·Apache·IIS·WordPress 버전을 공개 자료(endoflife.date·WordPress.org·CISA KEV)와 대조해 지원 종료·실제 공격에 쓰인 취약점·최신판 여부를 봅니다.
- 더 넓은 A-Z 점검 — 백업·DB 덤프·phpMyAdmin·디렉터리 목록 노출, http→https 전환, 쿠키 보호 표시, 옛 jQuery, 메일 위조 방지(SPF·DMARC).
- AI 방어 — 페이지·스크립트에 박힌 AI API 키(OpenAI·Anthropic·Hugging Face 등, 값은 가져오지 않음), 인증 없이 열린 AI 모델 API(Ollama·OpenAI 호환), 공개 MCP 엔드포인트, robots.txt 의 AI 크롤러 규칙.
- 해킹 흔적 — 첫 화면에 숨긴 도박·성인 스팸 링크, 브라우저 채굴 스크립트, 난독화 스크립트, 숨긴 외부 iframe.
모니터링 — 점검 뒤에도 공격 시도를 계속 지켜보기
한 번의 점검은 그 순간의 사진입니다. 「내 사이트」의 해자(垓字) 센서를 켜 두면 사이트로 들어오는 요청을 계속 봅니다 — Cloudflare Worker 센서, Cloudflare 읽기 전용 토큰, 또는 이 PC 에서 읽는 웹서버 로그 중 하나로 붙입니다.
.env·클라우드 키·.git·셸·CGI·phpMyAdmin 같은 관리 도구·백업 파일을 노리는 탐침을 종류별로 셉니다.- SQL 인젝션 시도와, 그 요청에 서버가 성공(2xx)으로 답했는지를 따로 짚습니다 — 「두드렸다」와 「열렸다」를 구분합니다.
- 로그인·가입 폭주, 봇의 글 게시, 세션을 단 관리 구역 진입(장악 의심)을 출발지별로 봅니다. IP 원문은 남기지 않습니다.
- 판정은 운영자의 PC·서버 안에서 하고, 대응(차단 규칙·속도 제한 조각)은 운영자가 직접 적용합니다.
솔직하게 적습니다: PHP2Shell 공격 요청만 골라내는 전용 탐지 규칙은 아직 없습니다. 공격 요청의 모양이 공개되면 규칙을 더하고 이 글을 고치겠습니다. 그 전까지는 버전 확인과 업데이트가 유일한 해결이고, 센서는 PHP 사이트를 노리는 일반적인 탐침·침입 흔적을 봅니다.
지금 할 일 — 순서대로
- PHP 를 수정판(8.5.12 · 8.4.27 · 8.3.36 · 8.2.35 이상)으로 올립니다. 8.1 이하라면 지원되는 판으로 옮길 계획부터 세웁니다.
- 호스팅을 쓴다면 호스팅사에 적용 여부·일정을 문의합니다.
- 공개된
phpinfo.php·info.php, 웹 루트의.env·.git을 지우거나 막습니다. - 응답 머리글의 버전 노출을 끕니다(
expose_php = Off,ServerTokens Prod). 숨기는 것은 보완이고, 해결은 업데이트입니다. - Cloudflare 를 쓴다면 무료 요금제에도 알려진 공격을 막는 관리형 규칙이 있습니다 — 켜져 있는지 확인합니다.
- 업데이트 뒤 울타리 웹 취약점 점검으로 밖에서 다시 확인하고, 해자 센서를 켜 둡니다.
울타리가 못 보는 것
- 서버 안쪽 설정 — 업로드 진행 설정 같은 PHP 내부 설정, 서버에 이미 들어온 웹셸은 밖에서 보이지 않습니다(못 봄).
- 버전을 숨긴 서버 — 판정할 수 없고, 안전하다고 말하지 않습니다.
- 사이트 코드 자체의 취약점(SQL 인젝션·XSS 등)은 점검에서 공격 요청을 넣어 보지 않습니다. 원칙상 읽기만 하기 때문입니다.
- 워드프레스 플러그인·테마의 업데이트 여부는 밖에서 보이지 않습니다 — 관리 화면에서 확인해 주세요.
자주 묻는 것
그누보드·XE(Rhymix)·워드프레스를 쓰는데 해당되나요?
세 가지 모두 PHP 로 돌아갑니다. CMS 버전이 아니라 서버에 깔린 PHP 버전이 기준입니다. 수정판 미만이면 해당됩니다.
남의 사이트도 점검할 수 있나요?
아니요. 소유권을 확인한 내 사이트만 점검합니다. 점검 도구가 남의 사이트를 고르는 데 쓰이지 않게 하기 위해서입니다.
비용이 드나요? 인증은 어떻게 하나요?
개인 계정은 무료이고, 업무용(회사) 계정은 업무용 라이선스가 있어야 합니다. 울타리 계정 로그인과 소유권 확인(DNS TXT 레코드·/.well-known 파일·홈페이지 <head> 의 meta 태그·사이트 제목·SEO 설명·HTML 주석 중 하나)이 필요합니다. 사이트 빌더처럼 코드를 못 고치는 곳이라면 사이트 제목이나 SEO 설명 칸에 인증 문구를 잠시 넣으면 됩니다.