안녕하세요.
해킹과 방어 시리즈를 연재하고 있는 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취약점을 이용한 공격과 방어를 실습해보도록 하겠습니다.