IT/웹 보안

[Command Injection] 발생 원리, exploit 예시, 예방

kykyky 2024. 6. 8. 08:39

Command Injection

: 시스템 명령어를 실행하는 함수에 이용자가 입력을 통해 임의의 인자를 전달할 수 있을 때 발생

- 공격에 사용되면 웹 애플리케이션에 임의 명령어를 실행할 수 있어 공격 파급력이 높음

인젝션(Injection)
: 악의적인 데이터를 프로그램에 입력하여, 이를 시스템 명령어, 코드, 데이터베이스 쿼리 등으로 실행되게 하는 기법
- 웹 애플리케이션을 대상으로 하는 인젝션 공격은 SQL Injection, command injection 등이 있음

 

 

발생하는 이유

웹 애플리케이션을 개발하다보면, 어떤 기능에 대해서는 스스로 코드를 작성하기보다 이미 설치된 소프트웨어를 사용하는 것이 편리할 때가 있다. 

업로드 디렉토리에 있는 파일들의 이름을 출력하는 웹 애플리케이션을 만든다고 할 때,

디렉토리를 조회하고 파일들을 나열하고 출력하는 코드를 직접 작성하는 것보다, 시스템에 내장되어있는 ls 명령어를 사용하는 것이 훨씬 간편

그래서, 다양한 웹 애플리케이션 제작용 언어는 시스템에 내장된 프로그램들을 호출할 수 있는 함수를 지원한다. 

PHP의 system, Node JS의 child_process, 파이썬의 os.system

 

이러한 시스템 함수는 전달된 명령어를 셸 프로그램에 전달해 명령어를 실행한다. 

system("cat /etc/passwd")를 호출하면, 셸 프로그램으로 cat /etc/passwd를 실행한 것과 같다.

파이썬으로 개발된 웹 애플리케이션에서 입력한 임의 IP에 ping을 전송하고 싶다면 os.system(“ping [user-input]”)을,

임의 파일을 읽고 싶다면 os.system(“cat [user-input]”)등의 형태로 시스템 함수를 사용할 수 있다.


이처럼 시스템 함수를 사용하면, 이미 설치된 소프트웨어들을 쉽게 이용할 수 있다는 장점이 있다. 

 

그러나, 함수의 인자를 셸의 명령어로 전달할 때 이용자의 입력을 제대로 검색하지 않으면,

공격자는 리눅스 셸 프로그램이 지원하는 다양한 메타 문자를 통해 임의 명령어를 실행하여 

셸을 획득하는 등의 치명적인 취약점으로 이어지기도 한다.

 

※ 메타 문자 (Meta Character)

특히, &&, ;, | 등을 쓰면 여러 개의 명령어를 연속으로 실행시킬 수 있다. 

 

 

Command Injection 취약점이 있는 예제 코드

위 코드에서는, URL 쿼리를 통해 전달되는 ip 값을 ping 명령어의 인자로 전달한다.

 

Command Injection 공격

위 명령들은 메타 문자를 사용해 id 명령어를 실행한다.

 

 

Command Injection 취약점의 예방

- 개발 단계에서 이용자의 입력 값에 대해 메타 문자의 유무를 철저히 검사함

- 시스템 메타 문자를 해석하지 않고 그대로 사용하는 함수를 사용해야 함

- system 함수의 사용을 되도록 자제