Covenant

본 포스트는 https://www.udemy.com/의 강좌 화이트헤커가 되기 위한 8가지 웹 해킹 기술 강좌를 바탕으로 작성했습니다.


커멘드인젝션 공격이란?

 커맨드 인젝션은 명령어를 삽입한다는 뜻으로 요청에 시스템 명령어를 보내 이를 실행하도록 하는 방법이다. 내부에서 시스템 명령어를 실행하는 경우 사용자가 입력한 값이 올바른지 검사하지 않고 시스템 명령어의 일부분으로 전달한다면, 해커는 값을 조작하여 다른 시스템 명령어를 실행할 있다.

 

[공격 시나리오]

  웹페이지가 있다. 웹페이지는 사용자가 IP주소를 입력을 받는다. 서버에서 사용자가 입력한 IP 시스템 명령어인 ping명령어를 실행하여 ping 결과를 알려주는 페이지가 있다고 하자. (ping 명령어는 IP주소를 가진 어떤 시스템이 동작하는지 확인하는 명령어이다.) 그런데 해커가 ping IP; cat /etc/passwd라고 입력했다고 하자. 여기서 cat /etc/passwd 리눅스에서 사용자 목록을 확인할때 사용하는 명령어이다. ; 리눅스에서 2개의 명령어를 모두 실행하게 된다. 해커가 입력한 값이 IP주소인지 검사하지 않고 서버로 전송하면 원래 실행되야할 ping명령어 뿐만 아니라 etc/passwd 또한 실행되서 해커가 사용자 정보를 얻을 있다.

 

[실습 방법]

Low level

커멘드 인젝션 페이지로 간다. IP주소를 입력하면 핑을 보내주는 시스템이다. 로컬 아이피 주소

127.0.0.1입력 소스코드를 보면 shell_exec함수가 있다. 시스템 명령을 내리는 함수이다.

ping -c 4 127.0.0.1 : -c는 핑을 보내는 횟수이다. 4번 핑 하는 것이다.

리눅스에서 ;을 이용해서 여러개의 명령어를 실행할 수 있다. ping -c 4 127.0.0.1; ls하면 핑 결과가 나오고 ls 경과가 나온다.

 

Medium level

&&은 윈도우에서 ;와 같은 역활을 한다.

그러나 |(파이프라인) 을 막아주지는 못한다.

 

High level

대응하는 문자열이 많이 들어났다. &, + , , , || 등등 불필요한 문자열을 지우거나 바꿈으로서 공격에 대응하고 있다.

그러나 개발자가 실수한 부분이 있다.

 

[공격 대응]

실제로 사용자가 입력한 값이 IP인지 검증을 하면 된다.

실습처럼 IP주소를 입력받는 경우 .으로 이루어져 있는지, 각각의 값이 숫자로 이루어져 있는지 검증해야 한다