[ 커맨드인젝션 공격이란? ]
웹을 통해 시스템명령어(커맨드)를 실행하는 공격이다. 웹 내부에서 시스템 명령어를 실행하는 경우, 만약 사용자가 입력값을 제대로 검사하지 않으면, 해커는 이 값을 조작하여 마음대로 시스템 명령어를 실행하게 된다.
사용자가 정상적으로 어떤 웹페이지를 접속하는데 이때, 어떤 웹페이지는 IP 주소를 입력하면 서버에서 ping 명령어를 실행하고 그 결과를 알려주는 페이지라고 생각해보자.
(ping 명령어는 IP 주소를 가진 어떤 시스템이 현재 동작하고 있는지 확인하는 명령어이다.)
이때, 해커는 IP주소 뒤에 ;을 입력하고 다른 시스템 명령어를 추가로 전송한다. cat /etc/passwd는 리눅스의 사용자 목록을 확인할 때 사용하는 명령어이다. 만약, 웹 애플리케이션이 해커가 보낸 값이 IP 주소 형식을 가진 값인지 제대로 검사하지 않는다면 ping 뒤에 해커가 보낸 문자열을 모두 붙여서 실행하게 된다.
리눅스는 ;을 사용할 경우 모든 명령어를 사용하기 때문에 ping 뿐만 아니라 /etc/passwd의 결과도 해커에게 넘어가게 된다
[ 커맨드 인젝션 공격 실습 ]
로우 단계 실습)
dvwa의 보안을 low로 변경한 후, Command Execution 탭에 접속한다. 이 페이지는 IP 주소를 입력한 후 ping을 실행하면 결과를 리턴해주는 페이지이다.
로컬 IP인 127.0.0.1을 입력하면 다음과 같은 결과가 나오는 것을 확인할 수 있다.
소스코드를 살펴보려고 하였으나 DVWA를 다르게 설치한 탓인지 강사님의 화면과 달라 강사님의 실습 화면도 가지고 왔다.
*nix로 주석 표시가 되어있는 부분이 리눅스일때 실행되는 코드이고, 시스템 명령을 내리는 함수인 shell_exec 함수가 실행되는 것을 알 수 있다. 명령어의 구성을 살펴보면 'ping -c 4' 뒤에 target 변수가 오는데 이 target 변수는 request 즉, 웹 요청으로부터 전달받은 ip 주소임을 알 수 있다. 따라서 전달 받은 ip주소에 대해서 ping 명령어를 실행하게 된다.
터미널에서 명령어를 입력하는 경우도 동일하다고 볼 수 있다. 터미널에서 'ping -c 4 127.0.0.1' 입력하면 다음과 같은 결과를 확인할 수 있다. 여기서 -c 는 ping을 보내는 횟수를 의미하며 4라고 입력했기 때문에 4번 진행되는 것을 볼 수 있다.
디렉토리 결과를 보여주는 명령어인 ls를 덧붙여 작성해본 결과, ping 결과가 실행된 이후에 ls 명령어에 대한 결과가 함께 출력되는 것을 볼 수 있었다. 세미콜론만 입력하면 ls 명령어 외에도 다른 명령어를 사용할 수 있다.
다음과 같이 dvwa의 Command Execution 부분에 ; ls를 입력하면 현재 디렉토리가 출력되는 것을 볼 수 있다.
; cat /etc/passwd 를 입력할 경우 오른쪽 이미지와 같이 시스템 사용자 리스트가 나오는 것을 볼 수 있다.
; id를 입력하면 현재 권한을 알 수 있게 된다. 여기서 현재 권한은 www-data임을 확인할 수 있었다.
여기서부터 미디엄 단계, 하이 단계 실습 시 실행결과가 잘 나오지 않아 강사님의 화면을 활용 함
미디엄 단계 실습)
미디엄 단계로 변경한 후 ; id를 입력하였더니 아까와 다른 결과가 나온 것을 볼 수 있었다.
소스코드를 살펴보니 세미콜론을 지움으로써 Command injection 공격에 대응하고 있음을 확인할 수 있고, 윈도우에서 ; 과 같은 역할을 하는 &&도 제거하여 윈도우에서도 Command injection 공격이 시행되지 않도록 제거되었다.
하지만 이것으로는 부족하다. 우선 파이프(|)는 앞 명령의 결과를 뒤 명령어의 결과로 넘겨주는 특수문자인데, 위 실습 화면과 같이 지난 명령어의 결과가 실행되는 모습을 볼 수 있다. 백그라운드로 명령을 실행하기 위해 사용하는 특수문자인 & 또한 문제없이 실행되는 것을 확인할 수 있다.
하이 단계)
하이 단계에서 | id 와 & id 를 모두 실행하면 오른쪽 화면과 같이 실행되지 않는 것을 확인할 수 있다.
소스코드를 확인해보면 Command Injection을 대응할 수 있는 특수문자들이 늘어난 것을 확인할 수 있다.
하지만 이 코드를 자세히 보면 개발자가 실수한 부분이 하나 있다. 바로 특수문자들을 그냥 제거한 것이 아닌 공백을 넣은 것이다. 이렇게 되면 |(파이프) 뒤에 공백없이 명령어를 바로 작성하게 되면 에러 없이 실행되는 것을 볼 수 있었다.
[ 커맨드인젝션 공격 대응 ]
커맨드 인젝션 공격의 가장 좋은 대응 방법은 사용자의 입력값이 원래 의도에 맞는지 검사하는 것이다.
ip 주소를 입력받는 경우 입력된 값이 실제로 IP 주소인지 확인하는 과정이 필요하다
소스코드를 확인해보면 'ip' 주소를 .(점)으로 구별하고 있는 것을 볼 수 있다. 커맨드 인젝션 공격에 대응하기 위해서는 입력값을 제대로 구별해주어야 한다. 어쩔 수 없이 문자열을 허용해야 한다면 불필요한 특수문자의 입력은 확실해 제한해주는 것이 좋다.
[참고자료] 인프런_화이트해커가 되기 위한 8가지 웹 해킹 기술
'Security > Web hacking' 카테고리의 다른 글
파일 업로드 공격 (0) | 2023.01.08 |
---|---|
파일인클루젼 공격 (0) | 2023.01.07 |
CSRF 공격 (0) | 2023.01.02 |
브루트 포스 공격 (0) | 2023.01.02 |
화이트해커와 웹 보안 (0) | 2023.01.02 |