티스토리 뷰

반응형

 

 

 

가. 원인

  - 외부입력값을 검증하지 않고 운영체제 명령문의 일부 또는 전체로 구성되어 실행

 

 

나. 영향

  - 공격자가 입력한 명령어가 웹서버 권한으로 실행

  - 시스템 중요파일 삭제

  - 백도어 실행

  - 부적절한 권한변경

 

 

다. 보안대책

  - 어플리케이션에서 운영체제 명령어를 실행하지 않도록 설계

  - 미리 정의되어 있는 허용목록을 검색하여 명령어가 실행되도록 설계

 

 

라. 안전한 코드

1. 허용하는 명령어 목록 사용

 

  List<String> allowedCommands = new ArrayList<String>();

  allowedCommands.add("notepad");

  allowedCommands.add("calc");

 

  String cmd = args[0];

  if ( allowedCommands.contains(cmd) ) {

     Runtime.getRuntime().exec( cmd );

     ...

   }

 

 

  String[] allowedCommands = { "type", "dir" };

  int index = Integer.parseInt( request.getParameter("index") );

  if ( index >= 0 && index < allowedCommands.length ) {

     cmd = new String[] { "cmd.exe", "/c", allowedCommands[index] };

     Runtime.getRuntime().exec(cmd);

     ...

  }

 

 

2. 멀티 명령어 필터링

 

  String data = request.getParameter("data");

  data = data.replaceAll("|", "").replaceAll(";", "").replaceAll("&", "");

  data = data.replaceAll(":", "").replaceAll(">", "");

 

  String command = new String ("cmd.exe /c backupload.bat" + data);

  Runtime.getRuntime().exec( command );

 

 

 

마. 진단방법

<운영체제 명령어 삽입>

  1. 운영체제 명령어를 실행할 수 있는 함수( exec(), system(), getRuntime() 등 )가 호출되는지 확인

  2. 외부 입력값이 시스템명령의 일부 또는 전체로 사용하는지 확인

  3. 명령어가 화이트리스트로 사용되는지 확인

  4. 멀티 명렁어를 위한 특수기호를 필터링하는지 확인

 

 

바. 정/오탐 케이스

<정탐 케이스>

  1. 검증없이 외부 입력값을 사용하여 문자열을 만들고, 명령어로 사용

  2. 개별 사용 프로퍼티를 사용하여 검증없이 명령문 실행에 사용

 

<오탐 케이스>

  1. 시스템 프로퍼티를 사용하는 경우

  2. 외부 입력값이 운영체제 명령어를 실행하는데 사용되지 않을 경우

  3. 파일명을 명령어에 삽입 시 공격에 필요한 특수기호가 없으므로 안전한 것으로 판단

반응형
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday