안녕하세요.
해킹과 방어 시리즈를 연재하고 있는 Ziqon입니다.
이번 편에서는 외부 인터페이스(웹)를 통해 시스템에 직접적으로 command를 전달할 수 있는 취약점을 이용하여
command injection 공격과 방어를 해보겠습니다.
[공격]
http://www.mypage.com:8080/WebGoat-5.4.1/attack에 접속하여 Webgoat의 [Injection Flaws]의 [Command Injection]에 접속하고, AccessControlMatrix.html 파일을 선택한 후 [View File]을 클릭하여 버프에서 패킷을 확인합니다.
패킷의 마지막에 HelpFile=AccessControlMatrix.help 을 HelpFile=AccessControlMatrix.help%22+%26+netstat+-rn&SUBMIT=View 로 치환하여 인젝션을 하면 아래와 같이 netstat -rn 명령어를 입력한 결과가 화면에 뿌려지게 됩니다.
여기서 "& netstat -rn을 인코딩한 값이며 윈도우에서는 명령어 연결자로 &를 사용합니다.
[방어]
- 커맨드 인젝션의 원인은 바로 외부 입력값을 그대로 시스템 함수의 파라미터로 넣기 때문입니다. 보통 시스템 명령어는 외부에서 직접적으로 입력 받아서 실행해서는 안되며 필요한 시스템 함수를 정의하여 약속된 파라미터가 드러올 경우 해당 시스템명령어를 실행할 수 있도록 구현해야 합니다.
-FindBugs에서 탐지된 아래 취약점 결과를 선택합니다.
-역시나 커맨드를 파라미터로 받아 시스템에 직접 실행시킬 수 있는 exec 메소드를 사용하고 있네요.
-앞서 시큐어코딩을 진행했던 것과 동일하게 SecurityFilter에 필터를 추가합니다.
String으로 입력값을 받는 경우와 배열형태로 입력값을 받는 경우 두가지를 고려해 아래와 같이 필터를 코딩합니다.
인젝션에 사용되는 &, ;, | 문자를 치환하는 필터입니다.
-만든 필터를 적용해봐야겠죠? command를 입력받아 실행하는 두군데 모두 입력값 실행 전에 필터를 적용합니다.
-아래와 같이 인젝션에 실패하는 것을 확인할 수 있습니다.
-이번 포스팅에서는 확률적으로는 많이 발생하지는 않지만 발생할 경우 시스템에 치명타를 줄 수 있는 command injection에 대해 알아보았습니다. 보통 웹시스템에서는 많이 발생하지 않지만 그래도 주의주의해서 코딩해야 합니다.
-다음편에서는 가장 치명적이고 잘 발생하는 upload취약점을 이용한 공격과 방어를 실습해보도록 하겠습니다.