본문 바로가기
Web hacking/개념 정리 & 심화

[Dreamhack] W - STAGE 7 Command Injection

by m_.9m 2023. 5. 4.

1. Background: Relational DBMS


다양한 웹 제작용 언어는 시스템에 내장되어있는 프로그램들을 호출할 수 있는 함수를 지원한다. 각 언어별 함수로는 PHP의 system, Node JS의 child_process, 파이썬의 os.system이 있다. 이런 함수는 전달된 인자를 셀 프로그램에 전달해 명령어를 실행한다. 시스템 함수를 사용하면 이미 설치된 소프트웨어를 쉽게 이용할 수 있다는 장점이 있지만 치명적인 취약점으로 이어질 가능성도 높다.
 

1-1 Command Injection


Command Injection은 명령어를 실행하는 함수에 이용자가 임의의 인자를 전달할 수 있을 때 발생한다. 앞서 말한 시스템 함수를 통해 이용자가 임의의 인자를 전달할 수 있다. 파이썬으로 개발된 웹 애플리케이션에서 입력한 임의 IP에 ping을 날리고 싶다면 os.system(”ping [user-input]”)을, 임의 파일을 읽고 싶다면 os.system(”cat [user-input]”)등의 형태로 시스템 함수를 사용할 수 있다. 이러한 함수를 사용할 때 이용자의 입력을 제대로 검사하지 않으면 임의 명령어가 실행될 수 있다. 이는 리눅스 셀 프로그램이 지원하는 다양한 메타 문자 때문이다. &&, ;, | 등을 사용하면 여러 개의 명령을 실행시킬 수 있어 취약점이 발생할 있다.
메타 문자설명Example

메타문자 설명 Example
`` 명령어 치환``안에 들어있는 명령어를 실행한 결과로 치환됩니다. $ echo `echo theori`theori
$() 명령어 치환$()안에 들어있는 명령어를 실행한 결과로 치환됩니다. 이 문자는 위와 다르게 중복 사용이 가능합니다. (echo $(echo $(echo theori))) $ echo $(echo theori)theori
&& 명령어 연속 실행한 줄에 여러 명령어를 사용하고 싶을 때 사용합니다. 앞 명령어에서 에러가 발생하지 않아야 뒷 명령어를 실행합니다. (Logical And) $ echo hello && echo theorihellotheori
|| 명령어 연속 실행한 줄에 여러 명령어를 사용하고 싶을 때 사용합니다. 앞 명령어에서 에러가 발생해야 뒷 명령어를 실행합니다. (Logical Or) $ cat / || echo theoricat: /: Is a directorytheori
; 명령어 구분자한 줄에 여러 명령어를 사용하고 싶을 때 사용합니다. ;은 단순히 명령어를 구분하기 위해 사용하며, 앞 명령어의 에러 유무와 관계 없이 뒷 명령어를 실행합니다. $ echo hello ; echo theorihellotheori
| 파이프앞 명령어의 결과가 뒷 명령어의 입력으로 들어갑니다. $ echo id | /bin/shuid=1001(theori) gid=1001(theori) groups=1001(theori)

 

1-2 실습문제 풀이