Command Injection

chi·2024년 7월 23일

web hacking

목록 보기
11/15

이미 정의된 함수를 사용하는 건 편리하다
하지만 함수의 인자를 쉘로 직접 전한다는 단점이 있다
명령어를 실행해주는 함수를 잘못 사용하여 발생하는 Command Injection

인젝션(Injection) 은 악의적인 데이터를 프로그램에 입력하여 이를 시스템 명령어, 코드, 데이터베이스 쿼리 등으로 실행되게 하는 기법
SQL Injection도 인젝션의 종류 중 하나
이용자의 입력을 시스템 명령어로 실행하게 하는 취약점이 Command Injection

Command Injection은 명령어를 실행하는 함수에 이용자가 임의의 인자를 전달할 수 있을 때 발생한다
그러나 이러한 함수를 사용할 때 이용자의 입력을 제대로 검사하지 않으면 임의 명령어가 실행될 수도 있다
리눅스 셸 프로그램이 지원하는 다양한 메타 문자 때문
시스템 함수는 쉘 프로그에 명령어를 전달하여 실행하는데 쉘 프로그램이 다양한 메타 문자를 사용한다
ex)

- 명령어 치환
안에 들어있는 명령어를 실행한 결과로 치환

$ echo `echo theori`
theori

()명령어치환() - 명령어 치환()안에 들어있는 명령어를 실행한 결과로 치환
중복 사용 가능 위와 다르게 echo $(echo $(echo theori))

$ echo $(echo theori)
theori

&& - 명령어 연속 실행
한 줄에 여러 명령어를 사용하고 싶을 때 사용
명령어에서 에러가 발생하지 않아야 뒷 명령어를 실행함

$ echo hello && echo theori
hello
theori

|| - 명령어 연속 실행
한 줄에 여러 명령어를 사용하고 싶을 때 사용
앞 명령어에서 에러가 발생해야 뒷 명령어를 실행한다

$ cat / || echo theori
cat: /: Is a directory
theori

; - 명령어 구분자
한 줄에 여러 명령어를 사용하고 싶을 때 사용
;은 단순히 명령어를 구분하기 위해 사용하며 앞 명령어의 에러 유무와 관계 없이 뒷 명령어를 실행한다

$ echo hello ; echo theori
hello
theori

| - 파이프
앞 명령어의 결과가 뒷 명령어의 입력으로 들어감

$ echo id | /bin/sh
uid=1001(theori) gid=1001(theori) groups=1001(theori)

&&, ;, | 등을 사용하면 여러 개의 명령어를 연속으로 실행시킬 수 있음
따라서 공격자는 메타 문자를 통해 임의 명령어를 실행하여 쉘을 획득할 수 있음

실습 command-injection-1

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

5~20글자만 입력 가능한 필터링
해당 부분을 지우고 다시 시도한다

0개의 댓글