본문 바로가기
Programming/Python

파이썬 eval() exec()함수와 취약점 발생 가능성

by whitele 2022. 8. 31.
반응형

파이썬에는 명령문, 식 등을 실행시켜주는 내장함수가 존재합니다. eval, exec, compile함수가 있습니다.

 

1. exec( )&eval( )

1.1 exec 함수

파이썬 코드 동작시 동적실행에서 사용될 수 있습니다.

 문자열, 코드객체를 인수로 받습니다. 문자열의 경우 분석을 한뒤 실행하고 코드객체는 바로 실행됩니다. 반환값은 None (반환을 하지 않습니다.)

 실행만을 위해 사용하는 함수입니다.

exec(object, globals, locals) # object = 'print("hello world")'

globals, locals는 선택사항입니다. 딕셔너리 객체로 받을 수 있습니다.

 

1.2eval 함수

 eval은 인수로 표현식을 받습니다. 표현식을 받아 코드 동작중에 표현식을 실행합니다. 

eval(expression, globals, locals) #expression = '1 + 2'

globals, locals는 선택사항입니다. 

예제

expr='a*a+2*a+2'
a=input('input : ')
eval(expr)

 

2. 취약점 가능성

Eval함수

eval 함수는 코드 인젝션에 취약할 수 있습니다.

웹서비스를 예로 

def eval_vuln(request):
	msg = request.POST.get('msg')
    eval(msg)

해당 코드처럼 유저들의 입력값을 아무 검증 없이 실행한다면 취약점이 발생합니다.

 코드 인젝션의 발생을 막기위해 입력값 검증단계를 넣으면 됩ㄴ다. msg변수는 string이므로 string에서 제공하는 isalnum메소드를 사용하면 특수문자를 필터링 할 수 있습니다.

 이외 더 정교한 값을 받는 경우 정규식을 사용합니다.

 

exec역시 비슷한 예로

func = request.POST.get('function',)
vuln = exec(‘{}()’.format(func))

 

exec사용 목적 자체가 명령어 사용이라면 사용할 수 있는 명령어 자체를 한정하는 방법을 사용해야 합니다.

728x90
반응형

댓글