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 함수의 사용을 되도록 자제
'IT > 웹 보안' 카테고리의 다른 글
[Server Side Request Forgery (SSRF)] (0) | 2024.06.08 |
---|---|
[File Upload/Download Vulnerability] (0) | 2024.06.08 |
[No SQL Injection] Simple Injection, Blind Injection (0) | 2024.06.08 |
[SQL Injection #1] Simple Injection, Blind Injection (2) | 2024.06.08 |
[Cross Site Request Forgery (CSRF)] (0) | 2024.06.08 |