IT/앱사용방법

시큐어코딩) 파이썬 코드 삽입 공격 예방 코드 설명(기초)

볼통통알파카 2022. 5. 21. 15:01
반응형

 

코드 삽입 공격 알기

공격자가 소프트웨어의 의도된 동작을 변경하도록 임의 코드를 삽입하여 소프트웨어가 비정상적으로 동작하도록 하는 보안 약점을 말한다 코드 삽입은 프로그래밍 언어 자체의 기능에 한해 이뤄진다는 점에서 운영체제 명령어 삽입과 다르다.

 

코드 삽입 공격 원리

취약한 프로그램에서 사용자의 입력 값에 코드가 포함되는 것을 허용할 경우 공격자는 개발자가 의도하지 않은 코드를 , 실행하여 권한을 탈취하거나 인증 우회 시스템 명령어 실행 등을 할 수 있다.

 

 

파이썬 출력 함수 사용 주의

eval()
string 값을 넣으면 해당 값을 그대로 실행하여 결과를 출력해 준다.

안전하지 않은 코드 예

# . 외부로 입력받은 값을 검증 없이 사용하면 안전하지 않다
 message = request.POST.get('message', '')     
    
 # eval Python 함수에 외부 입력값을 검증 없이 사용할 경우 코드가 실행될 수 있어 위험하다
 ret = eval(message
 

예시) “compile(‘for x in range(1):\n import time\n time.sleep(20)’,’a’,’single’)”

위와 같은 코드를 메시지에 입력하면 20초 동안 응용프로그램이 sleep상태가 된다.

 

비교적 안전한 코드 예

message = request.POST.get('message', '')     
 # 사용자 입력을 영문 숫자로 제한하는 예로 특수문자가 포함되어 있을 경우 에러 메시지를 리턴 한다
 if message.isalnum():
      ret = eval(message)
 

isalnum() 함수 : 영문과 숫자만으로 입력되었는지 검증

이메일 정규식 : emailregular = re.compile(r'([A-Za-z0-9]+[.-_])*[A-Za-z0-9]+@[A-Za-z0-9-]+(\.[A-Z|a-z]{2,})+')

 

eval() 함수를 사용해야 할 경우 이와 유사한 검증 함수를 제공하거나 정규식을 만들어 검증하는 방법으로 코드를 작성하면 된다.

 

반응형

 

exec()
string 값을 넣으면 해당 값을 그대로 실행하여 결과를 출력해 준다.
문자열을 넣은 함수를 받으면 계산되어 실행되는 특징이 있다.

 

안전하지 않은 코드 예

 function_name = request.POST.get('function_name', '')

 # 사용자에게 전달받은 함수명을 검증하지 않고 실행
 # “import plaform \n platform.system()” 입력 값으로 등을 입력 시 시스템정보 노출 위험이 있다

 ret = exec('{}()'.format(function_name))
 

이 경우 중요 데이터 탈취 및 서버의 권한 탈취, 액세스 거부, 완전한 호스트 탈취를 할 수 있다.

 

비교적 안전한 코드 예

WHITE_LIST = ['get_friends_list', 'get_address', 'get_phone_number']
def request_rest_api(request):
 function_name = request.POST.get('function_name', '')

 # 함수 명을 화이트리스트로 제한
 if function_name in WHITE_LIST:
    ret = exec('{}()'.format(function_name))
    return render(request, '/success', {'data':ret})
 
 return render(request, '/error', {'error':' .'})
 

우선 외부에서 입력받는 라이브러리 명을 미리 정의한 화이트리스트에 있는지 확인하고 리스트에 없는 경우엔 에러 페이지를 리턴한다.

 

정리하면서

 

코딩할 때 주의할 점

1. 동적인 코드를 실행할 수 있는 함수를 사용하지 않는다.

2. 사용이 필요할 때 외부 입력값을 화이트리스트 방식으로 검증한다.

3. 유효한 문자만 포함되도록 입력값을 필터링한다.

 

 

반응형