1)
디렉터리 경로 조작
디렉터리 경로 조작은 크게 상대, 절대 디렉터리 경로 조작으로 나눌 수 있다.
I. 상대
디렉터리 경로 조작(Relative Path Traversal)
상대 디렉터리
경로 조작은 외부의 입력을 통하여 ‘디렉터리 경로 문자열’ 생성이
필요한 경우, 외부 입력값에 대해 경로 조작에 사용될 수 있는 문자를 필터링하지 않으면, 예상 밖의 접근 제한 영역에 대한 경로 문자열 구성이 가능해져 시스템 정보누출, 서비스 장애 등을 유발 시킬 수 있다. 즉, 경로 조작을 통해서 공격자가 허용되지 않은 권한을 획득하여, 설정에
관계된 파일을 변경할 수 있거나 실행시킬 수 있다.
n 안전한 코딩
기법
①
외부의 입력이 직접 파일이름을 생성하도록 사용될 수 없도록 한다. 불가피하게 직접 사용하는 경우, 다른 디렉터리의 파일을 접근할 수
없도록 replaceAll() 등의 메소드를 사용하여 위험 문자열(“, /, \)을 제거하는 필터를 거치도록 한다.
②
외부의 입력을 받아들이되, 내부적인 처리는 미리
정의해놓은 데이터를 사용하도록 화이트 리스트를 관리한다. 즉, 외부에서
받아들인 데이터 중 미리 정의된 케이스를 제외하고는 모두 무시하도록 한다.
II. 절대
디렉터리 경로 조작(Absolute Path Traversal)
외부 입력이 파일 시스템을 조작하는 경로를 직접 제어할 수 있거나
영향을 끼치면 위험하다. 사용자 입력이 파일 시스템 작업에 사용되는 경로를 제거하는 것을 허용하면, 공격자가 응용프로그램에 치명적인 시스템 파일 또는 일반 파일을 접근하거나 변경할 가능성이 존재한다. 즉, 경로 조작을 통해서 공격자가 허용되지 않은 권한을 획득하여, 설정에 관계된 파일을 변경할 수 있거나 실행시킬 수 있다.
n 안전한 코딩
기법
①
외부의 입력을 통해 파일이름의 생성 및 접근을 허용하지 말고, 외부 입력에 따라 접근이 허용된 파일의 리스트에서 선택하도록 프로그램을 작성하는 것이 바람직하다.
1. String fileName = request.getParameter("");
2. deleteFile(filename);
3.
4. private void deleteFile(String request) {
5. String result = new String(request);
6.
7. result = result.replaceAll("\\", "");
8. result = result.replaceAll("/", "");
9. result = result.replaceAll(".", "");
10. result = result.replaceAll("&", "");
11.
12. File file = new File("/user/local/tmp/" + name);
13. if (file != null) file.delete();
14.
15. /* 나머지 구현 */
16. }
댓글 없음:
댓글 쓰기