-
커맨드 인젝션 (Command Injection) 예제보안(Security)/Injection 2018. 9. 10. 09:44
※ 크롬, 오페라 등 브라우저는 인터넷 익스플로러와 비교해 구현 방법에 차이가 있다. 같은 html 문서를 작성해도 브라우저에 따라 결과가 다를 수 있다는 말이다. 보안 포스팅을 위해 문제 상황을 발생시키기에 인터넷 익스플로러가 적합해 보안 포스팅에서는 항상 인터넷 익스플로러를 실습 브라우저로 사용한다. 이번 예제는 수강중인 교육 강사님이 주신 예제를 통해 확인했다.
SQL 인젝션과 마찬가지로 명령어 또한 임의로 삽입할 수 있다.
* 커맨드 인젝션은 시스템 명령어를 호출하는 어플리케이션의 인자값을 조작하여 의도치 않은 명령어를 수행하도록 유도하는 기법이다.
파로스(Paros)를 켜 프록시 서버를 통해 Request, Response 정보를 가공해보았다.파로스를 켜 Trap 탭에서 Trap request에 체크한다. URL 요청에 대한 정보를 파악할 수 있고, 응답을 가공할 수 있다.
@RequestMapping("/attack/injection/commandAttack") public ModelAndView commandAttack(HttpServletRequest request) { String command = request.getParameter("programs"); // FIXME Command Injection White List 로 변경 try { Runtime.getRuntime().exec("cmd.exe /c " + command); } catch (IOException e) { throw new RuntimeException(e.getMessage(), e); } ModelAndView view = new ModelAndView("attack/sqlInjection/sqlInjection"); return view; }
요청 처리 컨트롤러. 셀렉트 태그의 값을 getParameter 메소드로 받아온다.
<form method="post" action="/HuCloud/attack/injection/commandAttack"> <table> <tr> <td> 실행할 프로그램을 선택하세요 : <select name="programs"> <option value="calc.exe">계산기</option> <option value="notepad.exe">메모장</option> </select> </td> <td><input type="submit" value="Execute" /></td> </tr> </table> </form>
jsp 파일. option 태그를 보면 실행될 프로그램에 대한 정보를 파악할 수 있다. 문제점은 value 속성에 실행할 프로그램에 대한 정보를 그대로 노출시켰다는 점이다. 이를 통해 해커들은 페이지가 동작하는 원리를 유추할 수 있고, 커맨드 인젝션을 사용할 수 있음을 파악한다.
Command Injection을 위한 예제. Execute 버튼을 누르면 계산기와 메모장을 열도록 해준다.
계산기 선택 후 Execute 버튼 누르면 파로스에서 요청에 대한 정보를 확인할 수 있다.programs 태그의 값으로 option 태그의 value가 들어옴을 확인할 수 있다.
이를 notepade.exe로 변경 이후 Continue 버튼을 누른다. Continue는 말 그대로 이후 절차를 수행하도록 하는 버튼이다. 사용자가 원했던 계산기 대신 메모장이 요청으로 전달될 것이다.
다음과 같이 메모장이 실행된다. 무서운 점은 각종 시스템 명령어 또한 입력이 가능하다는 점이다.
"shutdown /s" 를 입력해 컴퓨터를 종료시키게 할 수도 있고, format 명령어를 사용하면 포맷까지 시켜버릴 수 있다는 점이다. 이러한 위험에 노출을 줄이기 위해 사용자에게는 정보 노출을 최소화 하도록 한다.shutdown 으로 고친 후 continue 누르면 1분 후에 컴퓨터가 종료된다는 다이얼로그 창이 호출된다.
<form method="post" action="/HuCloud/attack/injection/commandAttack"> <table> <tr> <td> 실행할 프로그램을 선택하세요 : <select name="programs"> <option value="1">계산기</option> <option value="2">메모장</option> </select> </td> <td><input type="submit" value="Execute" /></td> </tr> </table> </form>
jsp 코드. value 속성의 값을 의미 없는 값으로 둬 컨트롤러에서 어떤 프로그램이 수행될 지 유추를 힘들게 한다.
@RequestMapping("/attack/injection/commandAttack") public ModelAndView commandAttack(HttpServletRequest request) { String command = request.getParameter("programs"); // FIXME Command Injection White List 로 변경 if (command.equals("1")) { command = "calc.exe"; } else if (command.equals("2")) { command = "notepad.exe"; } else { // 이외의 OS 명령어 막기. command = ""; } if (!command.equals("")) { try { Runtime.getRuntime().exec("cmd.exe /c " + command); } catch (IOException e) { throw new RuntimeException(e.getMessage(), e); } } ModelAndView view = new ModelAndView("attack/sqlInjection/sqlInjection"); return view; }
컨트롤러. value에 따라 수행시킬 프로그램을 지정한다. 이를 White List 기법이라 한다.
value에 없는 객체라면 command를 "" 로 만들어 exec 메소드의 호출 여부를 확인할 수 있도록 한다.'보안(Security) > Injection' 카테고리의 다른 글
SQL Injection 예제 (0) 2018.09.10