반응형
파이썬에는 명령문, 식 등을 실행시켜주는 내장함수가 존재합니다. 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
반응형
'Programming > Python' 카테고리의 다른 글
파이썬 math 패키지 (삼각함수, 상수, 로그 사용) (0) | 2021.11.06 |
---|---|
파이썬 random 패키지 (0) | 2021.10.31 |
파이썬 바이너리 파일 입출력 struct와 pickle (0) | 2021.09.25 |
파이썬 파일 입출력과 포인터 사용하기 (0) | 2021.09.18 |
파이썬 format 메서드 다양한 포매팅을 돕는 메서드 (0) | 2021.08.22 |
댓글