명령어 삽입
IT위키
더 많은 작업
명령어 삽입(OS Command Injection, 운영체제 명령어 삽입)은 프로그램이 외부 입력을 검증하거나 무력화하지 않은 채 운영체제 명령 문자열에 넣어 실행할 때, 공격자가 명령 구분자 같은 특수 문자를 끼워 넣어 의도하지 않은 운영체제 명령을 서버 권한으로 실행하게 만드는 취약점이다.
웹 애플리케이션이 ping, nslookup, 파일 변환 도구처럼 운영체제 명령을 셸로 불러 쓰는 경우가 많다. 이때 사용자가 준 값을 명령 문자열에 그대로 이어 붙이면, 셸은 그 값 안의 ;, &&, |, 백틱, $( ) 같은 문자를 명령 구분자나 치환으로 해석한다. MITRE 의 CWE-78 은 이를 외부 영향을 받은 입력으로 운영체제 명령의 전부나 일부를 구성하면서, 명령을 바꿀 수 있는 특수 요소를 무력화하지 않거나 잘못 무력화하는 약점으로 정의한다.[1] 행정안전부·KISA 의 소프트웨어 보안약점 기준에서는 입력데이터 검증 및 표현 항목의 '운영체제 명령어 삽입'에 해당한다.
// 취약한 예 (C) char cmd[256]; snprintf(cmd, sizeof cmd, "ping -c 1 %s", host); // host 는 사용자 입력 system(cmd);
사용자가 host 에 8.8.8.8; cat /etc/passwd 를 넣으면 셸은 ping 뒤에 cat 명령도 실행한다. 웹 서버 계정의 권한으로 파일 열람, 웹셸 설치, 다른 서버 공격까지 이어질 수 있어 원격 코드 실행의 대표 원인이 된다.
- 셸을 거치지 않는다 -
system(),popen(), 셸 옵션을 켠 프로세스 실행 대신, 인자를 배열로 넘기는 API(execve, 자바ProcessBuilder, 파이썬subprocess.run([...]))를 쓴다. 입력이 명령이 아니라 인자 하나로만 전달된다. OWASP 는 운영체제 명령을 직접 부르지 말고 언어가 제공하는 라이브러리 함수를 쓰는 것을 첫째 방어로, 명령과 인자를 분리해 넘기는 매개변수화와 입력 검증을 함께 쓰는 것을 다음 방어로 든다.[2] - 허용 목록 검증 - 실행할 명령과 인자 형식을 미리 정해 두고(예: IP 주소 형식만 허용) 그 밖은 거부한다.
- 특수 문자 무력화 - 불가피하게 셸을 쓰면 명령 구분자와 치환 문자를 제거하거나 이스케이프한다. 차단 목록 방식은 빠진 문자가 생기기 쉬우므로 보조 수단으로만 쓴다.
- 최소 권한 - 애플리케이션 계정의 권한을 줄여 성공해도 피해를 줄인다.
| 취약점 | 공격자가 조작하는 것 | 결과 |
|---|---|---|
| 명령어 삽입 | 셸로 넘어가는 운영체제 명령 문자열 | 임의의 OS 명령 실행 |
| SQL 인젝션 | 데이터베이스로 넘어가는 SQL 문 | 데이터 조회·변조 |
| 포맷 스트링 공격 | printf 계열 함수의 형식 문자열 | 메모리 읽기·쓰기 |
| 버퍼 오버플로우 | 버퍼 크기를 넘는 입력 | 인접 메모리·복귀 주소 덮어쓰기 |
| 경쟁 상태 | 두 실행 흐름 사이의 시점 | 검사와 사용 사이의 틈 악용 |
printf(name)처럼 사용자 입력을 형식 문자열 자리에 넘기는 코드는 명령어 삽입이 아니라 포맷 스트링 취약점이다. 운영체제 명령을 실행하는 부분이 없다.
- ↑ 「CWE-78: Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')」, MITRE, https://cwe.mitre.org/data/definitions/78.html, 확인일: 2026-11-04.
- ↑ 「OS Command Injection Defense Cheat Sheet」, OWASP Cheat Sheet Series, https://cheatsheetseries.owasp.org/cheatsheets/OS_Command_Injection_Defense_Cheat_Sheet.html, 확인일: 2026-11-04.