1. 정의
상대 디렉토리 경로 조작 (Relative Path Traversal)
외부의 입력을 통하여 "디렉토리 경로 문자열" 생성이 필요한 경우, 외부 입력값에 대해 경로 조작에 사용될 수 있는 문자를 필터링하지 않으면, 예상 밖의 접근 제한 영역에 대한 경로 문자열 구성이 가능해져 시스템 정보누출, 서비스 장애 등을 유발 시킬 수 있다. 즉, 경로 조작을 통해서 공격자가 허용되지 않은 권한을 획득하여, 설정에 관계된 파일을 변경할 수 있거나 실행시킬 수 있다.
2. 해결방법
- 외부의 입력이 직접 파일이름을 생성하여 사용될 수 있도록 한다. 불가피하게 직접 사용하는 경우, 다른 디렉토리의 파일을 접근할 수 없도록 replaceAll() 등의 메소드를 사용하여 위험 문자열(",/,\)을 제거하는 필터를 거치도록 한다.
- 외부의 입력을 받아들이되, 내부적인 처리는 미리 정의해놓은 데이터를 사용하도록 코딩한다. 즉, 외부에서 받아들인 데이터 중 미리 정의된 케이스를 제외하고는 모두 무시하도록 한다.
3. 예제
========================== 안전하지 않은 코드의 예 ==========================
String name = request.getProperty("filename");
if( name != null )
{
File file = new File("/usr/local/tmp/" + name);
file.delete();
}
============================================================================
위의 코드에서는 외부의 입력(name)이 삭제할 파일의 경로설정에 사용되고 있다. 만일 공격자에 의해 name의 값으로 ../../../root.txt 와 같은 값을 전달하면 의도하지 않았던 파일이 삭제되어 시스템에 악영향을 준다.
============================== 안전한 코드의 예 =============================
String name = request.getProperty("user");
if ( name != null && !"".equals(name) )
{
name = name.replaceAll("/", "");
name = name.replaceAll("\\", "");
name = name.replaceAll(".", "");
name = name.replaceAll("&", "");
name = name + "-report";
File file = new File("/usr/local/tmp/" + name);
if (file != null) file.delete();
}
============================================================================
위의 코드와 같이 외부에서 입력되는 값에 대하여 Null 여부를 체크하고, 외부에서 입력되는 파일 이름에서 상대경로(/,\\,&,. 등 특수문자)를 설정할 수 없도록 replaceAll을 이용하여 특수문자를 제거한다.
'04. 시큐어코딩' 카테고리의 다른 글
시큐어코딩(13) - HTTP Response Splitting (0) | 2017.11.17 |
---|---|
시큐어코딩(12) - Absolute Path Traversal (0) | 2017.11.17 |
시큐어코딩(10) - Cross-Site Request Forgery (0) | 2017.11.17 |
시큐어코딩(9) - LDAP Injection (0) | 2017.11.16 |
시큐어코딩(8) - XPath injection (0) | 2017.11.16 |