OS injection
OS Command Injection이란?
취약한 변수에 악의적인 코드나 명령어를 주입하여 서버 운영체제에 접근하는 공격 → 웹페이지에 시스템 명령어를 주입하여 쉘을 획득하는 공격이다.
- shell_exec(), eval( ), system( ) 등의 명령어 실행을 위해 사용되는 함수에서 주로 발생되는 취약점이다.
+) OS : 운영체제
+) Command : 운영체제를 다루기 위한 명령어
+) 쉘 : 명령어와 프로그램을 실행할 때 사용하는 인터페이스
커널과 사용자간의 다리 역할을 하는 것 → 사용자의 명령을 해석하고 운영체제가 알아들을 수 있게 지시하는 것이다.
사용자에게 받은 지시를 해석하여 하드웨어 지시어로 바꾼다.
터미널에서 명령어를 입력하는 환경이 바로 쉘이다.
쉘의 종류 : bash, sh, csh 등이 있다.
<쉘의 기능>
- 명령어 해석기 기능 : 사용자와 커널 사이에서 명령을 해석하여 전달한다.
- 프로그래밍 기능 : 일련의 명령어와 쉘 자체로 프로그램을 만들 수 있다.
- 사용자 환경설정 기능 : 리눅스의 세션 변수들을 정의하여 사용자가 리눅스 환경을 설정할 수 있다.
+) 커널 : 하드웨어에 직접적으로 명령을 내려주는 것.
공격이 이뤄지는 과정
: OS Command Injection은 서버 명령줄에 임의의 명령을 사용하여 공격이 수행된다.
1. 웹페이지는 HTML 폼, HTTP 헤더, 쿠키, GET파라미터 등을 통해 사용자로부터 데이터를 입력 받는다.
2. 입력 받은 데이터는 시스템 쉘에 제공한다.
3. 데이터를 제공하는 과정에서 입력값에 대한 유효성 검증이 구현되어있지 않거나, 안전하지 않은 방식으로 검증을 하게 되면 공격이 이뤄진다.
<OS 인젝션의 유형>
- 직접 명령 인젝션 (Direct Command Injection) : 사용자가 입력한 데이터가 OS 명령의 인자로 직접 포함되는 경우이다.
- 간접 명령 인젝션 (Indirect Command Injection) : 파일이나 환경변수를 통해 웹페이지의 시스템 쉘로 OS 명령이 전달되는 경우이다.
- 블라인드 명령 인젝션 (Blind Command Injection) : 직접 명령 인젝션과 같이 사용자의 입력 데이터가 OS 명령에 포함되어 시스템 쉘로 전달되지만 HTTP 응답 메시지에 명령의 실행 결과가 표시되지 않는 경우이다.
OS 인젝션의 영향
: 웹페이지에서 구동되는 계정의 권한에 따라 범위가 다양해진다. 데이터베이스에 접근하여 고객의 개인 정보 등 민감한 데이터를 훔칠 수 있으며, 데이터를 임의로 조작하거나 삭제하는 등의 데이터베이스를 손상시키는 영향을 줄 수 있다.
추가적으로 서버 또는 시스템을 제어하여 웹페이지의 내장된 모든 기능을 악용할 수도 있다.
<OS Injection으로 발생할 수 있는 문제들>
- 전체 시스템 탈취
- 서비스 거부
- 서버 내 중요한 정보 유출(password, 암호키 등)
- 다른 시스템에 대한 공격용 패드
OS Injection 예방 방법
1. 가장 좋은 방법은 웹페이지에서 system(), exec()와 같은 쉘 함수를 사용하여 명령을 실행하지 않는 것이다.
2. 사용자 입력을 OS 명령에 포함시켜야 하는 경우 사용자 입력에 대한 엄격한 검증을 수행한다. ->화이트리스트 방식을 사용(허용되는 입력값 목록을 만들고 허용되지 않는 입력값에 대한 필터링 수행)
3. 화이트리스트 방식의 필터링이 아닌 블랙리스트 방식을 사용해야 한다면 운영체제 종류에 따라 특수문자들에 대해 이스케이프 처리를 하거나 요청을 차단해준다.
(윈도우의 경우 : ( ) < > & * ' | = ? ; [ ] ^ ~ ! . " % @ / \ : + ` 문자들 앞에 '^'를 추가하여 이스케이프 하기, 요청을 차단하기)
<취약점 발생 가능한 함수들>
Java - system(), exec()
PHP - exex(), system(), passthru(), popen() m require(), include(), eval(), preg_replace(), shell_exec(), proc_open()
python - os.system(), call()