PHP2Shell 실서버 챌린지서 참가자 1명 비밀 파일 추출…AI 대화 기록 제출
James Pavur의 PHP2Shell 실서버 챌린지에서 두 IP가 비밀 파일 실행 파일을 작동시켰고, 한 참가자가 파일 내용을 추출했습니다. 참가자는 익스플로잇 개발 과정의 AI 대화 기록도 제출했지만, 이 사례만으로 AI의 기여도나 일반적인 PHP 서버의 공격 성공률을 판단할 수는 없습니다. 추출된 WIF 키는 파생 경로의 상위 키여서 상금 비트코인은 공격으로 이동하지 않았습니다.
본문
보안 연구자 James Pavur는 2026년 10월 30일 개인 블로그에 PHP2Shell을 실제 인터넷 서버에서 시험한 챌린지 결과를 공개했습니다. Pavur는 10월 24일 Debian VPS에 PHP 사이트와 비밀 파일을 올리고, 파일을 읽도록 설정한 print-flag 실행 파일을 설치했습니다. Hacker News에 참가자를 모집해 공개된 취약점으로 파일 내용을 추출할 수 있는지 시험했습니다.
챌린지가 약 26시간 이어지는 동안 두 IP가 print-flag를 실행했고, 한 참가자가 파일 내용을 서버 밖으로 가져갔습니다. 참가자는 파일의 전체 값과 해시, 실행 시각·IP 주소·페이로드, 익스플로잇 설명과 개발 과정의 AI 대화 기록을 Pavur에게 보냈습니다. Pavur는 제출된 값이 서버의 비밀 파일과 일치하고 실행 시각과 주변 웹 요청 기록도 들어맞는지 대조했습니다. AI 대화 기록은 참가자가 개발 과정에서 AI를 활용한 정황을 보여주지만, 이 사례만으로 참가자의 숙련도나 AI의 기여 정도를 판단할 수는 없습니다.
로그의 범위는 종류에 따라 달랐습니다. PHP 오류와 print-flag 실행 기록은 챌린지 약 26시간 동안 남았지만, 일반 웹 요청 기록은 약 1,600분 가운데 600분가량만 보존됐습니다. 요청 기록이 안정적이었던 10시간 동안 홈페이지 방문을 넘어 챌린지에 실질적으로 참여한 고유 IP 주소는 약 2만 개였습니다. Pavur는 수만 명이 공격을 시도했다고 썼지만, 누락된 네트워크 흐름 기록으로 전체 시도 횟수를 통계적으로 추정할 수 없다고도 밝혔습니다. 참여 IP 수는 익스플로잇 시도 수와 같지 않으므로 이 수치를 성공률의 분모로 삼기 어렵습니다.
서버 구성은 실험 도중 바뀌었습니다. Pavur는 PHP 인터프리터가 실제 요청을 처리하는 경로를 시험할 수 있도록 10월 25일 12:59 UTC에 PHP 버전과 시각을 반환하는 페이지를 추가했습니다. 15:44 UTC에는 POST 요청에 pong으로 답하는 ping.php를 더했고, 3분 뒤 print-flag 실행이 기록됐습니다. 우승자의 공격은 ping.php를 사용하지 않았습니다. 결과는 Pavur가 구성한 한 대의 서버에서 나왔으며, 다른 PHP 설치나 배포 구성을 견준 비교 결과는 포함되지 않았습니다.
우승자가 공개한 PoC는 메모리 고갈과 후속 요청을 결합한 공격 흐름을 설명합니다. 작은 multipart 업로드로 메모리 한도를 넘긴 뒤, 세션 업로드 진행 정보를 처리하다 오류가 난 PHP worker에 남은 상태를 재사용합니다. 이 과정에서 세션 쿠키를 통해 힙과 PHP 코드의 주소 정보를 얻고, 마지막 요청에 조작된 PHP 구조체를 넣어 명령 실행 경로에 도달한다는 설명입니다. PoC의 오프셋은 Alpine PHP 8.4.26 CLI 서버와 worker 4개 구성에 맞춰 조정됐습니다. PHP 버전 문자열이 같아도 다른 빌드에서는 바이너리 배치가 달라 주소 정보를 맞추지 못할 수 있다고 설명합니다.
PoC 작성자는 실제 원격 실행 때 전체 HTTP 요청과 응답 헤더를 저장하지 못해, 이후 코드와 남은 메타데이터를 바탕으로 요청을 재구성했다고 적었습니다. Pavur가 직접 대조한 근거는 비밀 파일의 값과 당시 서버 기록의 일치이며, 구체적인 공격 순서는 참가자가 공개한 PoC에 담겼습니다.
파일에 들어 있던 값은 비트코인 지갑에 쓰이는 WIF 형식의 키였습니다. Pavur는 나중에 이 키가 상금 주소를 제어하는 키가 아니라 파생 경로의 상위 키였음을 확인했습니다. 참가자는 서버 파일을 읽었지만 그 키로 상금 지갑의 비트코인을 옮기지 못했고, Pavur가 이후 상금을 별도로 전달했습니다. 이 챌린지에서 확인된 결과는 서버 파일 추출이며, 비트코인은 공격으로 이동하지 않았습니다.
자료: James Pavur 개인 블로그·우승자의 공개 PoC / 정리·해설: Trawling