[Python 2] input() 취약점에 대하여
두비니
·2021. 5. 17. 04:21
0. 조사하게 된 계기
CTF문제를 풀다가 엄청난걸 알아냈습니다
python2에 한해서 input함수는 eval(raw_input(prompt))로 실행된다는 사실이요.
일단 eval함수 자체가 보안측면에서 봤을 때는 위험한 함수죠. (명령어를 실행시킬 수 있는 함수인지라)
그래서 조금 더 찾아봤는데 생각보다 뭐가 많더라구요! 그래서 정리할 겸 찾아봤습니다.
1. input함수 자체에 대하여
일단 input함수 자체에 대해서 조금 탐구를 해봅시다.
python2에서 이 함수의 가장 큰 특징은 "알아서 형변환"을 해준다는 점입니다. 직접 확인해봅시다
s1 = input("input()>> ")
print(type(s1))
s2 = input("input()>> ")
print(type(s2))
s3 = input("input()>> ")
print(type(s3))
이렇게 알아서 형변환을 시켜줍니다.
똑같은 코드로, python3으로 실행시켜보겠습니다.
나중에도 이야기하겠지만, python3부터는 raw_input()의 역할을 input()이 하고 있습니다. 따라서 어떻게 입력을 하든 무조건 str형태로 들어가는걸 볼 수 있습니다. 일단은 차이점을 아시겠죠?
2. 그래서 뭐가 문제인가
자 그럼 무엇이 문제인지 살펴보도록 합시다.
같은 string값을 넣어도 python2는 에러가 발생하는 것을 볼 수 있습니다.
근데 python2의 에러를 보니깐 뭔가 이상한게 있네요?
뭔가 알 수 없는 type이라는 게 아니라, 변수가 정의되어있지 않다는 NameError가 발생합니다.
그럼 정의되어있으면 뭔가 다르지 않을까? 하고 코드를 조금 변형해봤습니다.
hihihi = 100
s1 = input("input()>> ")
print(type(s1))
s2 = input("input()>> ")
print(type(s2))
s3 = input("input()>> ")
print(type(s3))
오오.. 이런 일이 발생하는군요....
3. 응용을 해보자
몇 가지 재미있는 일을 해봅시다
일단 python2의 경우에는 input을 통해서 eval함수를 실행하는 바람에 builtin함수를 이용할 수 있습니다.
이거에 관련한 글은 여기에 작성되어있습니다.
이런게 아니여도, 이런 상황을 이용할 수 있습니다.
이런 코드가 있다고 가정합시다.
hihihi = 100
s1 = input("input()>> ")
print(type(s1))
if s1 == hihihi:
print("yes!")
else:
print("no:(")
그러면 정상적인 접근은 100을 입력해서 if문을 통과하도록 하는데 일반적이겠죠?
그러나 python2의 input 성질때문에 다음과 같은 일도 할 수 있습니다.
오오... 좋네요
변수 자체가 입력이 된걸로 판단을 하기 때문에 그런거죠?
4. 결론
아무튼 이런 문제들때문에 python3부터는 input()함수가 아예 이용되지 않고 있습니다. raw_input()함수의 역할을 input()이 하게 되었고, 취약점이 있는 input()함수는 없어지게 되었습니다.
python2에서는 주로 raw_input()밖에 안쓰던데 이런 취약점이 있었네용
python은 필요할때마다 배워서 그런지 공부하다보니 신기한게 많네요...ㅎ
끝!
참고
https://www.geeksforgeeks.org/vulnerability-input-function-python-2-x/
'Coding_Algorithm > Python' 카테고리의 다른 글
[Python] is에 대해서, 그리고 재미있는 문제 하나 (0) | 2021.04.11 |
---|---|
[Python] 레퍼런스(reference)에 대해서 (0) | 2021.04.10 |
[Python 함수정리] 숫자 반올림하고싶을때 :: round (0) | 2020.03.19 |
[repl.it] 4.7. For: Number of zeros Solutions/풀이 (0) | 2020.03.17 |
Python에서 for문으로 감산하기 (0) | 2019.05.21 |