슈개's IT/SW개발보안

[SW개발보안] SR1-4. 시스템 자원접근 및 명령어 수행 입력값 검증

슈개 2021. 1. 23. 10:05
반응형

[SW개발보안] SR1-4. 시스템 자원접근 및 명령어 수행 입력값 검증

 

 

SR1-4 시스템 자원접근(경로조작 및 자원삽입) 및 명령어 수행 입력값(운영체제 명령어 삽입)

 

 

자원삽입

외부 입력값을 검증, 제한하지 않고 자원의 식별자로 사용하는 경우

의도하지 않은 자원 참조 및 사용이 발생

→ 시스템 충돌 또는 자원 선점 등을 통해 정상적인 서비스를 방해

 

run.jsp

================================================

String portno = request.getParameter("port_no");

Socket s = new Socket(Integer.parseInt(portno));

 

[의도한 입력]

run.jsp?port_no=4323

⇒ 4323 포트를 이용한 소켓을 생성

 

[의도하지 않은 입력]

run.jsp?port_no=80

⇒ 웹 서버의 서비스 포트(80)로 소켓을 생성 ⇒ 의도하지 않은 자원 참조 및 사용 발생 ⇒ 시스템 장애 등을 통해 정상 서비스를 방행

 

[안전한 코드]

// 허용 목록

int[] allowedPortNo = { 4323, 4324 };

String portno = request.getParameter("port_no");

try {

// 허용 목록 범위 내에서 입력값이 사용

// 입력값이 처리에 직접 사용되지 않고, 허용 목록을 참조하는데 사용

Socket s = new Socket(allowedPortNo[Integer.parseInt(portno)]);

} Exception (e) {

:

// 숫자가 아닌 데이터가 전달되는 경우

// 0, 1이 아닌 데이터가 전달되는 경우 

}

 

경로조작

참조하는 자원이 파일인 경우, 

외부 입력값이 파일 자원의 식별자로 사용되는 경우

경로 조작 문자열 포함 여부를 확인하지 않고 사용하면 권한 밖에 시스템 자원(파일)에 대해 접근이 가능

 

[대응방안]

외부 입력값을 파일의 식별자로 사용하는 경우, 

경로 조작 문자열(. .. / \ 등) 포함 여부를 확인 후 사용

 

download.jsp

============================================

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

File f = new File("/upload/data/" + fname);

:       ~~~~~~~~~~~~~~ 

 

[의도했던 입력]

download.jsp?fname=myphoto.gif

⇒ /upload/data/myphoto.gif 읽어서 다운로드 

 

[의도하지 않은 입력]

download.jsp?fname=../../../../../../../etc/passwd

⇒ /etc/passwd 파일을 읽어서 다운로드 

⇒ 권한 밖의 데이터(파일)에 대해서 접근이 가능

 

검증, 제한 방법

  1. 허용 목록 방식으로 검증, 제한한다. = 처리에서 사용할 값을 목록으로 만들고, 목록에 등록된 값만 사용되도록 제한한다.

  2. 외부에서 전달된 값을 처리에 직접 사용되지 않도록 한다. = 외부에서 전달되는 값은 프로그램 내부에서 허용 목록을 참조하는 용도록 사용되도록 한다. → 허용 목록 범위 내에서 값이 사용되는 것을 보장할 수 있고, 내부 처리 로직을 감출 수 있다.


 

허용목록 vs 제한목록

화이트 리스트 방식 = 허용 목록 ⇒ 해당 목록에 등록된 값만 믿고 사용

블랙 리스트 방식 = 제한 목록 ⇒ 해당 목록에 등록된 값은 사용하지 않음

 

입력유형   ⇒ a  b  c  x  y  z 

테스트결과 ⇒ o  x  x  ~~~~~~~ 검증되지 않은 새로운 입력 유형

 

화이트 리스트 ⇒ [ a ] → a ⇒ 새로운 입력 유형이 만들어져도 동일한 보안성을 보장

블랙 리스트 ⇒ [ b c ] → a x y z

 

 

운영체제 명령어 삽입

운영체제 명령어를 실행하는 부분이 존재하는 경우, 

외부 입력값을 검증, 제한하지 않고, 운영체제 명령어 또는 운영체제 명령어의 일부로 사용하는 경우 발생

의도하지 않은 명령어가 실행되게 되는 것

⇒ 해당 서버의 제어권을 탈취

 

[대응방안]

  1. 운영체제 명령어 실행이 반드시 필요한지 확인하고, 대체 기능을 강구

  2. 허용할 명령어를 정의하고 목록 내의 값만 사용하도록 제한 

  3. 추가 명령어 실행에 사용되는 &, |, ;  등의 문자를 필터링

외부 입력값을 운영체제 명령어로 사용하는 경우

 

do.jsp

=========================================

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

Runtime.getRuntime().exec(cmd);  

 

[의도한 입력]

do.jsp?cmd=dir

⇒ 해당 서버의 디렉터리 정보를 반환

 

[의도하지 않은 입력]

do.jsp?cmd=ipconfig

⇒ 의도하지 않은 ipconfig 명령어 실행 결과가 반환

do.jsp?cmd=dir %26 ipconfig

⇒ 의도하지 않은 ipconfig 명령어가 추가로 실행된 결과가 함께 반환


 

외부 입력값을 운영체제 명령어의 일부로 사용하는 경우

 

help.jsp

===========================================

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

Runtime.getRuntime().exec("cmd.exe /c type C:\\help_files\\" + help);

                                           ~~~~~~~~~~~~~~~~~~~~~~~~

                                           type 명령어의 파라미터로 사용

 

[의도한 입력]

help.jsp?help=test.html

⇒ c:\help_files\test.html 파일의 내용을 반환

 

[의도하지 않은 입력]

help.jsp?help=test.html %26 ipconfig

⇒ c:\help_files\test.html 파일의 내용과 함께 의도하지 않은 ipconfig 명령어의 실행 결과가 함께 반환

반응형