운영체제 명령 실행 취약점은 외부 입력값에 대한 유효성 검증이 부족하거나, 개발자가 입력값을 직접 system(), exec(), shell_exec() 등 운영체제 명령 호출 함수에 넘겨줄 경우 발생하는 보안 취약점이다. 공격자는 이를 통해 임의의 명령 실행, 권한 탈취, 백도어 설치 등을 시도할 수 있다.
주요 원인: 사용자 입력값을 직접 명령어에 삽입
발생 환경: PHP, Python, Node.js, Java 등 대부분의 스크립트 언어
🎯 2. 공격 목적
서버 아키텍처 및 운영체제 정보 수집 (예: uname -a)
시스템 명령 실행을 통한 권한 상승
파일 다운로드 및 백도어 설치
민감 정보 유출 및 시스템 장악
🎬 3. 실습 시나리오
💻 시나리오 개요:
웹 애플리케이션의 주소창에 사용되는 파라미터 q가 서버 명령과 연결되어 있음
입력값 검증이 없거나 미흡한 상태
공격자는 q 파라미터를 조작하여 시스템 명령을 직접 실행
📌 실습 공격 예시:https://target.site/qa.php?q=system('uname -a')
이 요청은 서버 측 코드에서 아래와 같은 PHP 코드로 처리될 가능성이 있음:
결과적으로 공격자는 uname -a 명령의 실행 결과(서버 운영체제 정보)를 응답으로 받아보게 됨.
🛡️ 4. 보안 대응방안
✅ 운영체제 명령 호출 금지
사용자 입력을 OS 명령어와 직접 연결하지 않도록 설계
운영체제 명령 호출이 꼭 필요하다면 입력값을 화이트리스트로 제한
✅ 특수문자 필터링
명령어 연결자 및 해석자 차단 (&, ;, |, \, ', ", $, ` 등)
escapeshellarg() / escapeshellcmd() 등 보안 함수 사용 권장 (PHP 기준)
✅ 서버 측 필터링 필수
클라이언트 측 필터링(JS 등)은 우회 가능하므로, 서버 측에서 검증 및 차단 수행
입력값은 반드시 사전에 정의된 값 중에서만 선택 가능하도록 제한
✅ 보안 함수 제한
system(), exec(), shell_exec() 등 OS 명령 실행 함수 사용을 지양