[HNCTF 2022 Week1]calc_jail_beginner_level2(JAIL)
[HNCTF 2022 Week1]calc_jail_beginner_level2(JAIL)
下载附件得到源代码
#the length is be limited less than 13
#it seems banned some payload
#Can u escape it?Good luck!
WELCOME = '''
_ _ _ _ _ _ _ ___
| | (_) (_) (_) | | | | |__ \
| |__ ___ __ _ _ _ __ _ __ ___ _ __ _ __ _ _| | | | _____ _____| | ) |
| '_ \ / _ \/ _` | | '_ \| '_ \ / _ \ '__| | |/ _` | | | | |/ _ \ \ / / _ \ | / /
| |_) | __/ (_| | | | | | | | | __/ | | | (_| | | | | | __/\ V / __/ |/ /_
|_.__/ \___|\__, |_|_| |_|_| |_|\___|_| | |\__,_|_|_| |_|\___| \_/ \___|_|____|
__/ | _/ |
|___/ |__/
'''
print(WELCOME)
print("Welcome to the python jail")
print("Let's have an beginner jail of calc")
print("Enter your expression and I will evaluate it for you.")
input_data = input("> ")
if len(input_data)>13:
print("Oh hacker!")
exit(0)
print('Answer: {}'.format(eval(input_data)))
这道题过滤了exec,input,eval,并且还对长度做了限制不能超过13,此时类似于__import__('os').system('sh')之类的就无法使用了,但是还有其他方法可以逃逸。
1.eval(input())
既然它是对input_data进行的检查,不难想到只要再执行一个input()就可以绕过检查了。这句代码的意思相当于input()继续输入字符串,再由eval函数解析执行,所有就没有了字符长度的限制,然后再输入__import__('os').system('sh')即可getshell。
2.breakpoint
Python中内置了一个名为breakpoint()的函数,在Python 3.7中引入,用于在调试模式下设置断点。使用breakpoint()函数会停止程序的执行,并在IDE或命令行中进入调试模式,可以单步执行程序,查看变量的值等。
这题我们输入breakpoint之后,会进入一个调试的交互界面,然后再输入__import__('os').system('sh')即可getshell。