원문 캡처 · php-rce.cloudflare.app
원문 캡처 · php-rce.cloudflare.app

Cloudflare가 CVE-2026-109618과 CVE-2026-109619에 대한 웹 애플리케이션 방화벽(WAF) 우회와 PHP 샌드박스 공격을 다루는 CTF를 열었다. 참가자는 지정된 대상에서 취약점을 악용해 /flag의 현재 내용을 확인해야 하며, 버그 바운티를 받으려면 HackerOne에 재현 가능한 보고서를 제출해야 한다.

이 과제는 CVE-2026-109618과 CVE-2026-109619, 즉 php2shell의 배경이 된 두 PHP 취약점을 다룬다. 대상은 기본 PHP 확장 기능을 포함한 PHP 8.5.11, mod_php를 통한 Apache 2, 비어 있는 index.php로 구성된 Cloudflare Container다. 앞단에는 해당 취약점에 대한 Cloudflare의 기본 WAF 보호 규칙이 적용된다. 샌드박스에는 /flag 파일이 있으며, 플래그 파일을 포함해 샌드박스는 몇 분마다 초기화된다. 자세한 내용은 Cloudflare의 블로그 안내에서 확인할 수 있다.

참가자는 WAF 보호가 적용된 대상의 /php/* 엔드포인트에 POST 요청을 보내는 경우에만 테스트할 수 있다. 예시로 제시된 업로드 진행 상황 확인 요청은 다음과 같다. payload.bin을 테스트 파일로 바꿔 사용하라는 안내와 함께, 이 요청만으로는 취약점 악용이나 WAF 우회가 입증되지 않는다고 명시돼 있다.

curl -i 'https://php-rce.cloudflare.app/php/index.php' \\ --cookie 'PHPSESSID=researchdemo00000000000000' \\ --form-string 'PHPSESSID=researchdemo00000000000000' \\ --form 'upload=@./payload.bin;filename="<?php echo 1337; ?>"'

성공 여부는 샌드박스 안에서 /flag를 읽고 CTF 화면에 값을 입력해 확인해야 한다. WAF를 통과하거나 HTTP 성공 응답을 받는 것만으로는 악용 성공으로 인정되지 않는다. 확인이 끝나면 시도한 페이로드가 포함된 고유 확인 링크를 만들 수 있으며, 링크를 가진 누구나 기록을 볼 수 있으므로 테스트 데이터만 사용해야 한다.

Cloudflare의 HackerOne 버그 바운티 프로그램을 통해 운영되며, 참가자는 시작 전에 HackerOne 계정을 만들고 이용 약관과 Cloudflare 프로그램 규칙을 확인하고 동의해야 한다. 보상을 청구하려면 승인된 POST 요청으로 샌드박스 안에서 공격자가 제어하는 PHP 코드 또는 명령 실행을 입증하고, 이를 통해 현재 /flag 내용을 회수한 뒤 CTF 화면에서 확인해야 한다. 샌드박스 초기화 전에 확인을 마치고 성공 결과를 보관해야 한다.

성공한 참가자는 HackerOne에 비공개 보고서를 제출해야 한다. 보고서 제목에 PHP CTF를 포함하고 다음 내용을 제공해야 한다.

  • 엔드포인트, 전체 페이로드, 요청 순서와 관련 헤더·인코딩·본문 바이트
  • 전체 과정을 재현할 수 있는 원시 요청·응답 기록 또는 읽기 쉬운 PoC
  • WAF 우회 방식, 실행한 코드나 명령, 그 실행으로 /flag를 읽은 방법
  • 시도 ID, UI 확인 결과, 악용 및 확인 시각(UTC). 확인을 위해 필요하다면 플래그를 비공개로 포함
  • 해당 방법이나 페이로드가 실질적으로 다른 점과 알고 있는 관련 제출 사례

CTF 화면에서 성공을 확인해도 HackerOne 보고서가 제출되는 것은 아니며, 보고 우선순위가 정해지는 것도 아니다. RCE 없이 파일만 공개한 경우, 플래그 회수와 UI 확인 없이 RCE만 성공한 경우, 로컬에서만 가능한 공격, 이미 알려진 PHP 취약점의 재발견, 전체 목표를 달성하지 못한 WAF 탐지 차이나 부분 공격은 대상이 아니다. 같은 PHP CVE를 이용하더라도 보상을 받으려면 실질적으로 구별되는 우회 방식이나 익스플로잇 페이로드가 필요하다. 새 플래그, 초기화, 시도 ID, 동등한 인코딩을 포함한 외형상 변경은 고유한 방법으로 인정되지 않는다. 수정되지 않은 중복 제출도 중복으로 처리하며, 완전하고 재현 가능한 첫 HackerOne 보고서만 검토한다. 중복 여부와 보상은 Cloudflare가 최종 결정한다.

Cloudflare는 보고서 분석을 위해 시도 메타데이터와 요청 페이로드를 기록한다. 따라서 테스트 데이터만 사용하고 자격 증명, 개인정보 등 연구 기록에 남기고 싶지 않은 정보를 보내지 않아야 한다. 테스트 전에는 사이트의 개인정보 처리 안내를 확인해야 한다.

허용 범위는 과제 호스트의 WAF 보호 /php/* 엔드포인트에 대한 POST 요청뿐이다. 다른 Cloudflare 서비스, 기반 인프라에 대한 직접 접근, PHP 프로젝트 자체, 제3자 시스템은 범위에 포함되지 않는다. 서비스 거부 공격, 대량 스캔, 지속성 확보, 사회공학, 다른 참가자에 대한 공격도 금지된다. 429 또는 503 응답을 받으면 요청을 줄여야 한다.

블로그 게시물과 버그 바운티 약관이 충돌하면 약관이 우선한다. Cloudflare는 언제든 과제를 중단하거나 종료할 수 있으며, HackerOne에서 프로그램이 삭제되면 공식 종료된 것으로 본다. 현재 진행 여부는 Cloudflare HackerOne 페이지에서 확인할 수 있다.