촉촉한초코칩

DreamHack Web Hacking Stage 7 본문

Study/Web Hacking

DreamHack Web Hacking Stage 7

햄친구베이컨 2022. 7. 27. 01:22

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