ServerSide: Command Injection

강혜인·2025년 5월 29일

WEB_Hack

목록 보기
18/18

Command Injection


인젝션(Injection)은 악의적인 데이터를 프로그램에 입력하여 이를 시스템 명령어, 코드, 데이터베이스 쿼리 등으로 실행되게 하는 기법을 말한다.

인젝션의 종류로는 SQL Injection도 존재한다. 이중, 이용자의 입력을 시스템 명령어로 실행하게 하는 취약점을 Command Injection이라고 부른다.

Command Injection은 명령어를 실행하는 함수에 이용자가 임의의 인자를 전달할 수 있을 때 발생한다. 앞서 소개한 시스템 함수를 사용하면 이용자의 입력을 소프트웨어의 인자로 전달할 수 있다.

파이썬으로 개발된 웹 애플리케이션에서 입력한 임의 IP에 ping을 전송하고 싶다면,

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

그러나, 이러한 함수를 사용할 때, 이용자의 입력을 제대로 검사하지 않으면 임의 명령어가 실행될 수도 있는데, 이는 리눅스 셸 프로그램이 지원하는 다양한 메타 문자 때문이다.

시스템 함수는 셸 프로그램에 명령어를 전달하여 실행하는데, 셸 프로그램은 다양한 메타 문자를 지원한다.

‘ ‘ - 명령어 치환

‘ ’ 안에 들어있는 명령어를 실행한 결과로 치환된다.

$ echo 'echo theori'
theori

$( ) - 명령어 치환

$( )안에 들어있는 명령어를 실행한 결과로 치환된다.

이 문자는 위와 다르게 중복 사용이 가능하다.

$ echo $(echo theori)
theori

&& - 명령어 연속 실행

한 줄에 여러 명령어를 사용하고 싶을 때 사용한다. 앞 명령어에서 에러가 발생하지 않아야 뒷 명령어를 실행한다. (Logical And)

$ echo hello && echo theori
hello
theori

|| - 명령어 연속 실행

한 줄에 여러 명령어를 사용하고 싶을 때 사용한다. 앞 명령어에서 에러가 발생해야 뒷 명령어를 실행한다.(Logical Or)

$ cat /  || echo theori
cat: /: Is a directory
theori

; - 명령어 구분자

한 줄에 여러 명령어를 사용하고 싶을 때 사용한다.

;은 단순히 명령어를 구분하기 위해 사용하며, 앞 명령어의 에러 유무와 관계 없이 뒷 명령어를 실행한다.

$ echo hello ; echo theori
hello
theori

| - 파이프

앞 명령어의 결과가 뒷 명령어의 입력으로 들어간다.

$ echo id | /bin/sh
uid=1001(theori) gid=1001(theori) groups=1001(theori)

주목해야 할 것은, &&, ;, | 등을 사용하면 여러 개의 명령어를 연속으로 실행시킬 수 있다는 것.

따라서 공격자는 메타 문자를 통해 임의 명령어를 실행해 셸을 획득할 수 있다.

0개의 댓글