IT/앱사용방법

시큐어코딩) 파이썬 경로조작, 자원삽입 공격 예방하는 방법(기초 예시)

볼통통알파카 2022. 6. 1. 22:24
반응형
경로조작 및 자원삽입 공격 설명

외부 입력값을 통해 파일 및 서버 등 시스템 자원에 대한 접근 또는 식별을 허용할 경우, 입력 값 조작을 통해 시스템이 보호하는 자원에 임의로 접근할 수 있는 보안취약점.

공격자는 게시글 혹은 데이터의 수정, 삭제, 정보노출, 시스템 장애 등을 유발 할 수 있음.

즉, 공격자가 허용되지 않은 권한을 취득하여 설정에 관계된 파일을 변경하거나 실행시킬 수 있는 공격

 

경로조작 시큐어코딩 예시

필터링 적용 예(Django프레임워크)

def get_info(request):
 # 외부 입력 값으로 받은 파일 이름은 검증하여 사용한다
 request_file = request.POST.get('request_file')    
 filename, file_ext = os.path.splitext(request_file)     
 file_ext = file_ext.lower()    
 if file_ext not in ['.txt', '.csv']:       
        return render(request, '/error.html', {'error':' .'}) 파일을 열수 없습니다
 
# 파일 명에서 경로 조작 문자열을 필터링 한다(/ . \\을 공란으로 변환)
 filename = filename.replace('.', '')
 filename = filename.replace('/', '')
 filename = filename.replace('\\', '')

 with open(filename + file_ext) as f:         
        data = f.read()

 

설명

1. request_file을 받았을 때 filename과 file_ext로 문자열을 변수로 받고 filename에서 . / \\이 있을 경우 공란으로 변환시킨다.

2. 필터링은 replace함수 외 re.sub, filter함수를 사용하여 필터링 할 수 있다.

Tip. Django외 다른 프레임에서도 필터링을 하는 방법을 사용하여 경로조작을 예방하는 방법이 있다.

 

자원삽입시큐어코딩 예시

화이트리스트로 필터 적용(Django프레임워크)

ALLOW_PORT = [4000, 6000, 9000]

def get_info(request):
 port = int(request.POST.get('port'))

 # 사용 가능한 포트 번호를 화이트리스트로 제한
 if port not in ALLOW_PORT:
    return render(request, '/error', {'error':' '}) 소켓연결 실패

 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind(('127.0.0.1', port))
    ......
 return render(request, '/success')

 

설명

ALLOW_PORT라는 리스트를 만들어 포트번호를 설정하고, 사용가능한 요청한 포트번호가 다를 경우 연결제한 하였다.

 

경로조작, 자원삽입 공격 예방 정리

1. 경로를 순회하여 공격할 수 있는 위험이 있는 문자(/, \, .. 등)를 제거할 수 있는 필터를 이용한다.

2. 외부 입력값을 자원식별자로 사용하는 경우 적절한 검증을 한다.

3. 사전에 정의된 리스트(화이트리스트)에서 선택되도록 한다.

반응형