为什么将 exec() 函数推入 input() 时会出现 SytaxError
Why there is a SytaxError when pushing an exec() function into an input()
有一个 netcat
CTF 任务需要通过 RCE 获取标志(对我来说最简单和明显的变体是 exec()
)
Python 2.7.18 (default, Apr 28 2021, 17:39:59)
[GCC 10.2.1 20210110] on linux2
>>> print input()
pow(2, 3) # No problems with functions
8
>>> print input()
None # Can print None values
None
>>> print input()
eval('1 + 1')
2
>>> print input()
eval('1 + 1') # eval() works
2
>>> x = 1
>>> print input()
eval('x + 1') # eval() with local variables involved also works
2
>>> print input()
exec('') # Even empty exec() causes an error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
exec('') # Even empty exec() causes an error
^
SyntaxError: invalid syntax
>>> print input()
exec('import os') # exec() call causes an error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
exec('import os') # exec() call causes an error
^
SyntaxError: invalid syntax
是否可以在 Python 2.7 中使用 input()
推送 exec()
? (无法切换 Python 版本或更改可执行文件 print input()
)
UPD
我需要这样的东西:
>>> print input()
exec('import os\nprint os.name') # I need a similar RCE in this CTF task, so eval() is not suitable
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
exec('import os\nprint os.name') # I need a similar RCE in this CTF task, so eval() is not suitable
^
SyntaxError: invalid syntax
而不是
>>> print input()
exec('1 + 1')
做
>>> print input()
eval('1 + 1')
你会得到你期望的输出2
。 exec()
需要可执行语句; eval()
需要一个表达式,这就是 1+1
是什么。尽管这更简单且等效:
>>> print input()
1 + 1
我必须承认我不知道什么是 CTF 任务,也不知道为什么它需要执行 RTE 代码,无论如何,但考虑到您的真正要求不是产生 1 + 1
的结果,而是而不是 os.name
的值,它可能更适合您的目的,以避免在过时的 input()
函数的极端情况下进行 futzing,而只是作为命令行
python -c "import os;print(os.name)"
哪个(在我的系统上)产生输出
nt
并且将适用于 Python 的每个版本。
Python 2 input()
函数不能做你想做的事情的原因是 Python 2
exec
是语句,不是函数。
input()
大致等同于 eval(raw_input())
:它将接受表达式但不接受语句。
有一个 netcat
CTF 任务需要通过 RCE 获取标志(对我来说最简单和明显的变体是 exec()
)
Python 2.7.18 (default, Apr 28 2021, 17:39:59)
[GCC 10.2.1 20210110] on linux2
>>> print input()
pow(2, 3) # No problems with functions
8
>>> print input()
None # Can print None values
None
>>> print input()
eval('1 + 1')
2
>>> print input()
eval('1 + 1') # eval() works
2
>>> x = 1
>>> print input()
eval('x + 1') # eval() with local variables involved also works
2
>>> print input()
exec('') # Even empty exec() causes an error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
exec('') # Even empty exec() causes an error
^
SyntaxError: invalid syntax
>>> print input()
exec('import os') # exec() call causes an error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
exec('import os') # exec() call causes an error
^
SyntaxError: invalid syntax
是否可以在 Python 2.7 中使用 input()
推送 exec()
? (无法切换 Python 版本或更改可执行文件 print input()
)
UPD
我需要这样的东西:
>>> print input()
exec('import os\nprint os.name') # I need a similar RCE in this CTF task, so eval() is not suitable
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
exec('import os\nprint os.name') # I need a similar RCE in this CTF task, so eval() is not suitable
^
SyntaxError: invalid syntax
而不是
>>> print input()
exec('1 + 1')
做
>>> print input()
eval('1 + 1')
你会得到你期望的输出2
。 exec()
需要可执行语句; eval()
需要一个表达式,这就是 1+1
是什么。尽管这更简单且等效:
>>> print input()
1 + 1
我必须承认我不知道什么是 CTF 任务,也不知道为什么它需要执行 RTE 代码,无论如何,但考虑到您的真正要求不是产生 1 + 1
的结果,而是而不是 os.name
的值,它可能更适合您的目的,以避免在过时的 input()
函数的极端情况下进行 futzing,而只是作为命令行
python -c "import os;print(os.name)"
哪个(在我的系统上)产生输出
nt
并且将适用于 Python 的每个版本。
Python 2 input()
函数不能做你想做的事情的原因是 Python 2
exec
是语句,不是函数。input()
大致等同于eval(raw_input())
:它将接受表达式但不接受语句。