Web Hacking - Command Injection

  • Command Injection
  • 혼자 실습 : command-injection-1

Serverside : Command Injection

웹 애플리케이션을 개발하다보면, 어떤 기능에 대해 스스로 코드를 작성하기보다 이미 설치된 소프트웨어를 사용하는 것이 편리하기도 하다. 웹 애플리케이션 제작용 언어는 시스템에 내장되어있는 프로그램들을 호출할 수 있는 함수를 지원하며, 각 언어벌 시스템 함수로는 PHP의 system, NodeJS의 child_process, 파이썬의 os.system이 있다. 이러한 함수는 전달된 인자를 셸 프로그램에 전달해 명령어를 실행한다. 예를 들어, system(“cat /etc/passwd”)를 호출하면, 셸 프로그램으로 cat /etc/passwd를 실행한 것과 같다. 시스템 함수의 사용은 이미 설치된 소프트웨어들을 쉽게 이용할 수 있다는 장점이 있으나, 함수의 인자를 셸의 명령어로 전달한다는 점에서 치명적인 취약점으로 이어진다.

Command Injection

이용자의 입력을 시스템 명령어로 실행하게 하는 위챡점으로, 명령어를 실행하는 함수에 이용자가 임의의 인자를 전달할 수 있을 때 발생한다. 임의의 IP에 ping을 보내고 싶다면 os.system(“ping [user-input]”), 임의의 파일을 읽고 싶다면 os.system(“cat [user-input]”) 과 같은 형태로 시스템 함수를 사용할 수 있다.

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

실습



Command Injection 취약점은 이용자의 입력을 적절한 검사 업싱 명령어로 사용할 때 방생하며, 공격에 사용되면 웹 애플리케이션에 임의 명령어를 시행할 수 있어 공격의 파급력이 높다. 입력 값에 대해 메타 문자의 유무를 철저히 검사하거나, 시스템 메타 문자를 해석하지 않고 그대로 사용하는 함수를 사용(system 함수의 사용 지양)하면 이러한 취약점을 막을 수 있다.

Quiz



답은 B인데 왜 C가 안 될까?

가설

{ip}가 ““로 묶여있으므로 해당 형식에 맞춰주려면 ““로 묶여있어야 할 것 같기도 하다. 근데 왜 ;가 두 번 들어갈까 앞에만 있어도 될 것 같은데 ..

드림핵 웹 [혼자실습] command-injection-1

플래그는 flag.py에 있다고 하는데, 문제 파일에는 flag.py가 없다. command injection을 통해 flag.py로 접근해야하는 것 같다.

1) ping에 8.8.8.8을 입력하고 실행하면 아래와 같은 결과가 뜬다



2) 대충 코드를 작성하고 ;를 통해 다중 명령을 전달하려 했지만, 요청한 형식과 일치시키라는 문구가 뜬다



input의 html을 확인해 본 결과, pattern 속성을 통해 정규표현식을 사용한 형식 지정이 있다.

<input type="text" class="form-control" id="Host" placeholder="8.8.8.8" name="host" pattern="[A-Za-z0-9.]{5,20}" required="">



3) 위의 pattern 속성을 지운 후 명령문을 제대로 작성하고 ping을 보냈다





4) FLAG