Command Injection

Web hacking/이론 / / 2022. 8. 24. 14:11
반응형

웹에서 서버 시스템 자체의 데이터를 가공하여 보여줘야 하는 경우가 많다.

이때 직접 개발하는 방법 보다는 시스템 자체의 직접 명령어를 사용해 개발하는 것이 편리하고 빠르다.

 

예로는 서버 어떠한 경로안에 어떤 파일들이 있는지 웹에 보여줘야 한다면 시스템에서 ls 명령어를 사용하는 것이 좋을것이다.

그래서 웹에 주로 사용되는 언어에서는 아래와 같이 시스템에 내장되어 있는 프로그램을 직접 호출할 수 있는 함수를 지원한다.

 

PHP = system

Node = child_process

Python = os.system

 

system("ls -l") 함수를 호출하면 시스템에 ls -l을 한것과 동일한 output을 보여준다.

이 함수에 들어가는 인자값을 제대로 검사하지 않고 사용자 마음대로 넣을 수 있다면 서버에 대한 정보 유출이나 공격을 당할 수 있다.

 

보통은 메타 문자를 사용하여 공격을 진행하는데, sql injection을 할때 싱글 쿼터나 더블 쿼터 주석을 사용하는것과 비슷하다.

 

메타문자들은 아래와 같다.

 

 

1. 명령어 치환

``$()로 사용할 수 있고 문자 안에 있는 명령어를 실행한 결과로 값이 치환 되는 것인데, 차이점으로는  $()를 사용하면 중복으로 사용할 수 있다는 것이다.

echo injection의 결과 injection텍스트를 touch의 인자값으로 들어간 모습

 

2. 명령어 연속실행

한 줄에 여러 명령어를 사용하고 싶을때 사용한다. ||&&로 사용할 수 있고

 논리적으로 보면 ||는 OR  &&는 AND  로 생각하면 된다.

 

||는 앞 명령어에서 에러가 발생해야 뒷 명령어를 실행한다.

 

{"originWidth":404,"originHeight":128,"style":"alignCenter","caption":"/는 현재 디렉터리이기 때문에 cat을 사용할 수 없어 에러 때문에

 

 

&&은 앞 명령어에서 에러가 발생하지 않아야 뒷 명령어를 실행한다.

{"originWidth":456,"originHeight":131,"style":"alignCenter","caption":"&&에서는 전부 출력하지만

 

3. 명령어 구분자

한 줄에 여러 명령어를 사용하고 싶을 때 사용한다. ;으로 사용할 수 있고  2번과 사용하는 이유는 같지만 ;은 단순히 명령어를 구분하기 위해 사용하며, 앞 명령어의 에러 유무와 관계 없이 뒷 명령어를 실행한다.

2번과 다른점은 앞 명령어의 영향을 전혀 받지 않는다는것

 

4. 명령어 값 사용

앞 명령어의 결과가 뒷 명령어의 입력으로 들어간다. |하나로 사용하고, 명령어 치환과 차이점은 치환은 직접 실행하지만

|하나로는 앞 명령어의 값을 뒤에 명령어로 옮긴다는 차이점이 있다.

왼쪽의 명령어를 풀면 오른쪽의 실행방식과 동일하다.

ifconfig 문자열을 /bin/zsh를 실행한 뒤에 입력하여 ifconfig 리스트가 출력된것이다. 

 

 

 

반응형