촉촉한초코칩
DreamHack Web Hacking Stage 7 본문
Stage 7 Command Injection
ServerSide: Command Injection
- 다양한 웹 애플리케이션 제작용 언어는 시스템에 내장되어있는 프로그램들을 호출할 수 있는 함수를 지원한다.
- 각 언어별 시스템 함수
언어 | 시스템 함수 | 언어 | 시스템 함수 |
PHP | system | Node JS | child_process |
파이썬 | os.system |
- 전달된 인자를 셸 프로그램에 전달해 명령어를 실행한다.
- ex) system(“cat /etc/passwd”) > 셸 프로그램으로 cat /etc/passwd를 실행한 것과 동일
- 시스템 함수를 사용하면 이미 설치된 소프트웨어들을 쉽게 이용할 수 있다는 장점이 있지만 함수의 인자를 셸의 명령어로 전달한다는 점에서 취약점으로 이어지기도 한다.
> 명령어를 실행해주는 함수를 잘못 사용하여 발생하는 Command Injection 취약점에 대해 배우기
Command Injection
- 인젝션(Injection) : 악의적인 데이터를 프로그램에 입력하여 이를 시스템 명령어, 코드, 데이터베이스 쿼리 등으로 실행되게 하는 기법
- 인젝션 종류 : SQL Injection, Command Injection (이용자의 입력을 시스템 명령어로 실행하게 하는 취약점)
- Command Injection : 명령어를 실행하는 함수에 이용자가 임의의 인자를 전달할 수 있을 때 발생
시스템 함수를 사용하면 이용자의 입력을 소프트웨어의 인자로 전달할 수 있다. - ex) 파이썬으로 개발된 웹 애플리케이션에서 입력한 임의 IP에 ping을 전송하고 싶을 때 > os.system(“ping [user-input]”)
임의 파일을 읽고 싶을 때 > os.system("cat [usr-input]") - 함수를 사용할 때, 이용자의 입력을 제대로 검사하지 않으면 임의 명령어가 실행될 수도 있다. > 리눅스 셸 프로그램이 지원하는 다양한 메타 문자 때문
- 시스템 함수는 셸 프로그램에 명령어를 전달하여 실행하는데, 셸 프로그램은 다양한 메타 문자를 지원한다.
메타문자 | 설명 | Example |
` ` | 명령어 치환 ` ` 안에 들어있는 명령어를 실행한 결과로 치환 |
$ echo `echo theoir` 결과 : theoir |
$ ( ) | 명령어 치환 $ ( ) 안에 들어있는 명령어를 실행한 결과로 치환 위와 다르게 중복 사용 가능 |
$ echo $(echo theoir) 결과 : theoir |
&& | 명령어 연속 실행 한 줄에 여러 명령어를 사용하고 싶을 때 사용 앞 명령어에서 에러가 발생하지 않아야 뒷 명령어를 실행한다. (Logical And) |
$ echo hello && echo theoir 결과 : hello 결과 : theoir |
| | | 명령어 연속 실행 한 줄에 여러 명령어를 사용하고 싶을 때 사용 앞 명령어에서 에러가 발생해야 뒷 명령어에서 실행한다. (Logical Or) |
$ cat / || echo theoir 결과 : cat /: Is a directory 결과 : theoir |
; | 명령어 구분자 한 줄에 여러 명령어를 사용하고 싶을 때 사용 단순히 명령어를 구분하기 위해 사용하며 앞 명령어의 에러 유무와 관계 없이 뒷 명령어를 실행한다. |
$ echo hello; echo theoir 결과 : hello 결과 : theoir |
| | 파이프 앞 명령어의 결과가 뒷 명령어의 입력으로 들어간다. |
$ echo id | /bin/sh 결과 : uid=1001(theoir) 결과 : gid=1001(theoir) 결과 : groups=1001(theoir) |
* &&, ;, | 등을 사용하면 여러 개의 명령어를 연속으로 실행시킬 수 있지만 공격자가 메타 문자를 통해 임의 명령어를 실행하여 셸을 획득할 수도 있다.
Command Injection 실습
- 코드 : URL 쿼리를 통해 전달되는 ip 값을 ping 명령어의 인자로 전달한다.
- 해결 방법 : 명령어를 실행하기 위해서는 메타 문자를 사용해야 id 명령어를 실행한다.
Command Injection 막는 방법
- 입력 값에 대해 메타 문자 유무를 철저히 검사
- 시스템 메타 문자를 해석하지 않고 그대로 사용하는 함수 사용하기
정리
- 인젝션(Injection): 악의적인 데이터를 프로그램에 입력하여 이를 시스템 명령어, 코드, 데이터베이스 쿼리 등으로 실행되게 하는 기법. 웹 애플리케이션을 대상으로 하는 인젝션 공격은 SQL Injection, command injection등이 있음.
- 커맨드 인젝션(Command Injection): 인젝션의 종류 중 하나. 시스템 명령어에 대한 인젝션을 의미함. 취약점이 발생하는 원인은 단순하지만, 매우 치명적인 공격으로 이어질 수 있음. 개발자는 이용자의 입력을 반드시 검사해야 하며, 되도록 system 함수의 사용을 자제해야 함.
- 메타 문자(Meta Character): 셸 프로그램에서 특수하게 처리하는 문자. ;를 사용하면 여러 개의 명령어를 순서대로 실행시킬 수 있음.
'Study > Web Hacking' 카테고리의 다른 글
Dreamhack - web-misconf-1 (0) | 2022.07.27 |
---|---|
Dreamhack - command-injection-1 (0) | 2022.07.27 |
Dreamhack - Mango (0) | 2022.07.23 |
DreamHack Web Hacking Stage 6 -2 (0) | 2022.07.23 |
Dreamhack - simple_sqli (0) | 2022.07.15 |